汇编 - js与ja指令

时间:2016-04-02 23:30:58

标签: c assembly x86 reverse-engineering

所以我的目标是写出与这个程序集对应的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进行比较?或者这是一个if,否则如果情况??

1 个答案:

答案 0 :(得分:2)

让我总结一下,已经说了什么

0:  85 f6                   test   %esi,%esi
2:  78 13                   js     17 <part3+0x17>

这是&#34; if(esi&lt; 0)goto 17; &#34;

4:  83 fe 07                cmp    $0x7,%esi
7:  77 14                   ja     1d <part3+0x1d>

这是&#34;如果(esi> 7)转到1d; &#34;

9:  8d 0c f5 00 00 00 00    lea    0x0(,%rsi,8),%ecx

&#34; cx = 8 * rsi&#34; //不是那么明显&#34;只是&#34;乘法)

10: 48 d3 ff                sar    %cl,%rdi

rdi&gt;&gt; CL; //不是cx,但是cx是安全的&lt; = 7 * 8,所以它是相同的     13:48 89 f8 mov%rdi,%rax     16:c3 retq

return rdi;

17: b8 00 00 00 00          mov    $0x0,%eax
1c: c3                      retq   

17:&#34;返回0&#34;

1d: b8 00 00 00 00          mov    $0x0,%eax
22: c3                      retq

1d:另一个&#34;返回0&#34;

所以C代码是:

{
    if (esi < 0) return 0;
    if (esi > 7) return 0;
    return rdi >> ( 8 * rsi );
}

PS:2&#34;返回0&#34; (17和1d)清楚地表明,在C代码中,两个if未合并为一个
PSS:C代码显然是编译优化:P