将汇编代码反向工程为c代码

sco*_*bby 8 c assembly reverse-engineering x86-64 conditional-statements

我认为这实际上是一个非常简单的问题.我必须将此汇编代码反向工程为c代码.我还会提供我认为正在发生的事情,这样你就可以指出我哪里出错了,现在我可以从错误中吸取教训.

.LFBO
    pushq   %rbp
    movq    %rsp,%rbp
    movl    %edi,-4(%rbp)
    movl    %esi,-8(%rbp)
    movl    -4(%rbp),%eax
    compl   -8(%rbp),%eax
    jg      .L2
    movl    -8(%rbp),%eax
    jmp     .L3
.L2:
    movl    -4(%rbp),%eax
.L3:
    popq    %rbp
    ret
Run Code Online (Sandbox Code Playgroud)

所以这就是我认为正在发生的事情:.LFBO之后的前两行:

pushq   %rbp
movq    %rsp,%rbp
Run Code Online (Sandbox Code Playgroud)

只是为即将执行的执行设置堆栈.

movl    %edi,-4(%rbp)
Run Code Online (Sandbox Code Playgroud)

抓住第一个变量,称之为x

movl    %esi,-8(%rbp)
Run Code Online (Sandbox Code Playgroud)

抓住第二个变量称之为y

movl    -4(%rbp),%eax
Run Code Online (Sandbox Code Playgroud)

抓住x在下一行进行比较

compl   -8(%rbp),%eax
Run Code Online (Sandbox Code Playgroud)

通过计算xy来比较变量x和y

jg      .L2
Run Code Online (Sandbox Code Playgroud)

如果x> y,则跳转到.L2

如果x <= y则计算下一行而不跳转到.L2

movl    -8(%rbp),%eax
Run Code Online (Sandbox Code Playgroud)

复制x = y

jmp     .L3
Run Code Online (Sandbox Code Playgroud)

跳到.L3

如果x> y在jg行,那么你跳转到.L2:并完成这一行

movl    -4(%rbp),%eax
Run Code Online (Sandbox Code Playgroud)

这是我意识到我真的很困惑的地方.在我看来,你正在将x复制到x然后.L3已经完成,我想x是返回的

Ant*_*hys 10

不要过度思考它.只需逐渐用C替换组件.这是一个可能的转换序列.

.LFBO
    pushq   %rbp
    movq    %rsp,%rbp
    movl    %edi,-4(%rbp)
    movl    %esi,-8(%rbp)
    movl    -4(%rbp),%eax
    compl   -8(%rbp),%eax
    jg      .L2
    movl    -8(%rbp),%eax
    jmp     .L3
.L2:
    movl    -4(%rbp),%eax
.L3:
    popq    %rbp
    ret

----

int LFBO (int edi, int esi)
{
    rbp = rsp
    [rbp - 4] = edi
    [rbp - 8] = esi
    eax = [rbp - 4]
    if (eax > [rbp - 8]) goto L2
    eax = [rbp - 8]
    goto L3
L2:
    eax = [rbp - 4]
L3:
    return eax
}

----

int LFBO (int edi, int esi)
{
    int eax;

    eax = edi;
    if (eax > esi) goto L2;
    eax = esi;
    goto L3;
L2:
    eax = edi;
L3:
    return eax;
}

----    

int LFBO (int edi, int esi)
{
    int eax;

    eax = edi;
    if (eax <= esi) {
        eax = esi;
    }
    else {
        eax = edi;
    }
    return eax;
}

----

int LFBO (int edi, int esi)
{
    if (edi <= esi) {
        return esi;
    }
    else {
        return edi;
    }
}

----

int LFBO (int x, int y)
{
    if (x <= y) {
        return y;
    }
    else {
        return x;
    }
}

----

int LFBO (int x, int y)
{
    return (x > y) ? x : y;
}
Run Code Online (Sandbox Code Playgroud)

您可以将此策略应用于任何装配体.在这里,我花时间详细介绍了各种转换.通过练习,您可以更快地获得最终结果.