将IA32 Assembly转换为C代码

时间:2017-02-06 03:08:44

标签: c assembly x86 reverse-engineering

我在将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;
}

1 个答案:

答案 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 * resulteax操作数是隐含的)。最后xorl %edx, %eax当然是result ^= subx8(%ebp),甚至没有在该行中提及。