[英]Assembly - js versus ja instruction
所以我的目標是寫出與該程序集對應的C代碼:
0: 85 f6 test %esi,%esi
2: 78 13 js 17 <part3+0x17>
4: 83 fe 07 cmp $0x7,%esi
7: 77 14 ja 1d <part3+0x1d>
9: 8d 0c f5 00 00 00 00 lea 0x0(,%rsi,8),%ecx
10: 48 d3 ff sar %cl,%rdi
13: 48 89 f8 mov %rdi,%rax
16: c3 retq
17: b8 00 00 00 00 mov $0x0,%eax
1c: c3 retq
1d: b8 00 00 00 00 mov $0x0,%eax
22: c3 retq
我有些困惑,因為測試%esi寄存器的第一個循環在第二個循環結束之前結束。
第二個if語句是否將第一個循環中的%esi與7進行比較? 還是這是如果,否則,如果情況?
讓我總結一下,已經說了什么
0: 85 f6 test %esi,%esi
2: 78 13 js 17 <part3+0x17>
這是“如果(esi <0)轉到17;”
4: 83 fe 07 cmp $0x7,%esi
7: 77 14 ja 1d <part3+0x1d>
這是“如果(esi> 7)轉到1d;”
9: 8d 0c f5 00 00 00 00 lea 0x0(,%rsi,8),%ecx
“ cx = 8 * rsi” //不太明顯,它只是“一個乘法”)
10: 48 d3 ff sar %cl,%rdi
rdi >> cl; //不是cx,但是cx可以安全地<= 7 * 8,所以相同13:48 89 f8 mov%rdi,%rax 16:c3 retq
返回rdi;
17: b8 00 00 00 00 mov $0x0,%eax
1c: c3 retq
17:“返回0”
1d: b8 00 00 00 00 mov $0x0,%eax
22: c3 retq
1d:另一個“返回0”
所以C代碼是:
{
if (esi < 0) return 0;
if (esi > 7) return 0;
return rdi >> ( 8 * rsi );
}
PS:2個“返回0”(17和1d)清楚地表明,在C代碼中,兩個if
未被組合為一個
PSS:C代碼顯然未使用優化來編譯:P
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.