【问题标题】:Assembly - js versus ja instruction汇编 - js 与 ja 指令
【发布时间】:2016-07-22 15:38:18
【问题描述】:

所以我的目标是写出与这个程序集对应的 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 , else if 的情况??

【问题讨论】:

  • 我在任何地方都看不到循环。是的,它是if/else if。当然它所做的只是返回东西,你不需要else
  • if (esi &lt; 0 || esi &gt; 7) return 0; return (int64_t)rdi &gt;&gt; (8*esi);?
  • 有趣的事实:因为这两种情况都是一样的(return 0),而ja 包括js,你可以忽略js
  • @Jester 我的错 - 术语不正确,请编辑它,但感谢您的帮助
  • @EOF 谢谢!确实是这样!

标签: c assembly x86 reverse-engineering


【解决方案1】:

让我总结一下,已经说过的话

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

这是“ if (esi

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

这是“ if (esi >7) goto 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 是安全的

返回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 代码中,两个 ifs 没有合并为一个
PSS:C 代码显然没有经过优化编译:P

【讨论】:

    猜你喜欢
    • 2016-08-02
    • 1970-01-01
    • 2012-02-27
    • 2011-11-22
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    相关资源
    最近更新 更多