将 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 * resulteax 操作数是隐式的)。最后xorl %edx, %eax当然是result ^= subx,也就是 8(%ebp),那一行甚至都没有提到。