簡體   English   中英

匯編-js vs ja指令

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM