小编sco*_*bby的帖子

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

我认为这实际上是一个非常简单的问题.我必须将此汇编代码反向工程为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是返回的

c assembly reverse-engineering x86-64 conditional-statements

8
推荐指数
1
解决办法
2478
查看次数

从装配中反向设计优化的c代码

这个问题的关键是对使用2级优化运行编译器后生成的c代码进行逆向工程.原始c代码如下(计算最大公约数):

int gcd(int a, int b){
    int returnValue = 0;
    if (a != 0 &&  b != 0){
        int r;
        int flag = 0;
        while (flag == 0){
            r = a % b;
            if (r ==0){
                flag = 1;
            } else {
                a = b;
                b = r;
            }
        }
        returnValue = b;
    }
    return(returnValue);
}
Run Code Online (Sandbox Code Playgroud)

当我运行优化编译时,我从命令行运行它:

gcc -O2 -S Problem04b.c
Run Code Online (Sandbox Code Playgroud)

获取此优化代码的程序集文件

.gcd:
    .LFB12:
        .cfi_startproc
        testl   %esi, %esi
        je  .L2
        testl   %edi, %edi
        je  .L2
    .L7:
        movl    %edi, %edx
        movl …
Run Code Online (Sandbox Code Playgroud)

c x86 assembly reverse-engineering compiler-optimization

7
推荐指数
1
解决办法
679
查看次数

无法使用指定的优化命名可执行文件

在编译我在linux上使用gcc编译器时编写的c代码时,我必须关闭优化.我发现我可以编译代码,但我只能在没有指定可执行文件名的情况下编译代码(默认为a.out).

这样可行:

gcc -O0 Problem04b.c
Run Code Online (Sandbox Code Playgroud)

但我的问题是我必须提交此作业,我无法提交名为a.out的可执行文件,因为我的教师需要知道它是哪个问题.我意识到我可能只是跑步

cp a.out Problem04b
Run Code Online (Sandbox Code Playgroud)

然后

rm a.out
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有一种方法可以直接将代码编译成可执行的Problem04b.我试过像这样运行命令:

gcc -O0 Problem04b Problem04b.c
Run Code Online (Sandbox Code Playgroud)

但我没有运气.

谢谢你的帮助.

c optimization gcc

0
推荐指数
1
解决办法
57
查看次数