我希望有人可以验证我对以下汇编代码的理解:
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
以下是我认为代码的作用:
答案 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