我在将IA32汇编代码转换回其C代码对应方面遇到了一些困难。我99%的方式,但字节偏移和寄存器存储让我感到困惑。
有问题的汇编代码movl %edx, %eax
似乎将%eax
中存储的值设置为%edx
中的值,但不会表示sub = result
}?
我是新手,所以感谢您的指导!
int d(int x, int y, int z) // x at %ebp+8, y at %ebp+12, z at %ebp+16
{
int sub, result;
sub = z - y; // movl 12(%ebp), %edx
result = sub; // subl 16(%ebp), %edx
??????????? // movl %edx, %eax
result <<= 31; // sall $31, %eax
result >>= 31; // sarl $31, %eax
result = sub * result; // imull 8(%ebp), %edx
sub ^= x; // xorl %edx, %eax
return result;
}
答案 0 :(得分:3)
asm的前两行实际上是C的第一行但反转并分两部分执行:
sub = y; // movl 12(%ebp), %edx
sub -= z; // subl 16(%ebp), %edx
你似乎遇到了一点点麻烦,即at&amp; t语法(这是)将目标操作数放在右边。因此movl %edx, %eax
确实是代码中编写的result = sub
。此外,imull 8(%ebp), %edx
清楚地写入edx
,因此sub = x * result
(eax
操作数是隐含的)。最后xorl %edx, %eax
当然是result ^= sub
。 x
,8(%ebp)
,甚至没有在该行中提及。