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)
您可以将此策略应用于任何装配体.在这里,我花时间详细介绍了各种转换.通过练习,您可以更快地获得最终结果.
归档时间: |
|
查看次数: |
2478 次 |
最近记录: |