首页 > 解决方案 > 将带有指针的简短 ASM 片段翻译成 C 代码

问题描述

这是一个与家庭作业相关的问题;我不是在寻找确切的答案,而是更多关于如何解决我的问题的指示。

简而言之,我的任务是将下面的 ASM 片段翻译成 C 代码:

fct:
    movl 4(%esp), %edx   ;L1
    movl (%edx), %ebx    ;L2
    movl 4(%edx), %eax   ;L3
    addl %ebx,%eax       ;L4
    ret                  ;L5

fct首先,我知道正确的签名是int fct(int *a)。接下来,这里简要描述一下我认为每一行的作用:

其中,翻译成一些伪 C-ish 代码看起来像这样:

fct(*arg) {
    d = arg
    b = *d
    a = *(d + 4)
    a = a + b
    return a
}

最后,这是我想出的 C 代码;我尝试对其进行格式化和编写,使其尽可能接近原始程序集。

int fct(int *arg) {
    int *d = arg;
    int b = *d;
    int a = *(d + 0x4);
    a += b;
    return z;
}

我花了一个小时试图让它工作,但我的代码只适用于它应该通过的五个自动化测试之一(我无权访问)。任何帮助将非常感激。

标签: cassemblyx86disassembly

解决方案


C 指针算术以指向的类型为单位,而不是字节。因此,由于intx86-32 上是 4 个字节,所以您想要d+1,而不是d+0x4.


推荐阅读