了解lea和汇编

时间:2016-04-06 06:09:20

标签: assembly x86

我希望有人可以验证我对以下汇编代码的理解:

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&amp; esi是地址0的否定退货项目
  • 如果esi高于8,则返回地址0的项目
  • 其他rsi * 2的商店地址到ecx
  • 然后右移rdi右2位
  • 将rdi复制到rax并将其返回

1 个答案:

答案 0 :(得分:1)

这就是代码的作用:

if (esi >= 0 && esi <= 7) {
    return rdi >> (esi * 8);   // Note: arithmetic shift; preserves sign
}
return 0;

因此esi指定从rdi向右移出的字节数(0..7)。由于使用了算术移位,因此保留rdi的原始符号。

例如:

Input:
  rdi = 0xFC00AABB12345678
  esi = 2

Output:
  rax = 0xFFFFFC00AABB1234
相关问题