将 IA32 程序集转换为 C 代码
Converting IA32 Assembly to C code
我在将 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 , %eax
result >>= 31; // sarl , %eax
result = sub * result; // imull 8(%ebp), %edx
sub ^= x; // xorl %edx, %eax
return result;
}
asm的前两行实际上是C的第一行但是颠倒了分两部分执行:
sub = y; // movl 12(%ebp), %edx
sub -= z; // subl 16(%ebp), %edx
您似乎对 at&t 语法(即 this 是)将目标操作数放在右侧这一事实有一点小问题。因此 movl %edx, %eax
确实是代码中所写的 result = sub
。此外,imull 8(%ebp), %edx
清楚地写入 edx
,所以这是 sub = x * result
(eax
操作数是隐式的)。最后xorl %edx, %eax
当然是result ^= sub
。 x
,也就是 8(%ebp)
,那一行甚至都没有提到。
我在将 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 , %eax
result >>= 31; // sarl , %eax
result = sub * result; // imull 8(%ebp), %edx
sub ^= x; // xorl %edx, %eax
return result;
}
asm的前两行实际上是C的第一行但是颠倒了分两部分执行:
sub = y; // movl 12(%ebp), %edx
sub -= z; // subl 16(%ebp), %edx
您似乎对 at&t 语法(即 this 是)将目标操作数放在右侧这一事实有一点小问题。因此 movl %edx, %eax
确实是代码中所写的 result = sub
。此外,imull 8(%ebp), %edx
清楚地写入 edx
,所以这是 sub = x * result
(eax
操作数是隐式的)。最后xorl %edx, %eax
当然是result ^= sub
。 x
,也就是 8(%ebp)
,那一行甚至都没有提到。