我认为这实际上是一个非常简单的问题.我必须将此汇编代码反向工程为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
这个问题的关键是对使用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) 在编译我在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)
但我没有运气.
谢谢你的帮助.