【发布时间】:2016-07-26 08:51:05
【问题描述】:
我希望有人可以验证我对以下汇编代码的理解:
test %esi,%esi
js 17 <build+0x17>
cmp $0x8,%esi
ja 1d <build+0x1d>
lea (&rsi,2),%ecx
shl $0x2,%rdi
mov %rdi,%rax
retq
mov $0x0,%eax //17
retq
mov $0x0,%eax //1d
retq
我认为代码的作用如下:
- 如果 esi&esi 为负,则返回地址 0 处的项目
- 如果esi大于8,则返回地址0处的项目
- 否则将rsi *2的地址存储到ecx中
- 然后将 rdi 右移 2 位
- 将 rdi 复制到 rax 并返回
【问题讨论】:
-
返回0,地址0处不返回任何东西
-
其余的准确吗?
-
lea (&rsi,8),%ecx这一行可能应该写成lea (,%rsi,8),%ecx,意思是ECX=RSI*8,而不是“rsi 的地址”。其余的看起来不错。 -
当然还有 "如果 esi&esi 为负数" == "如果 esi 为负数"
-
此处讨论了相同的 asm 代码:[stackoverflow.com/questions/36379900/…