【发布时间】:2015-04-13 22:27:20
【问题描述】:
我认为这实际上是一个非常简单的问题。我必须将此汇编代码反向工程为 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
所以这就是我认为的情况: .LFBO 之后的前两行:
pushq %rbp
movq %rsp,%rbp
只是为即将执行的执行设置堆栈。
movl %edi,-4(%rbp)
正在抓取第一个变量,称之为 x
movl %esi,-8(%rbp)
正在抓取第二个变量,称之为 y
movl -4(%rbp),%eax
正在抓取 x 以在下一行进行比较
compl -8(%rbp),%eax
通过计算 x-y 比较变量 x 和 y
jg .L2
如果 x > y 表示跳转到 .L2
如果 x
movl -8(%rbp),%eax
复制 x = y
jmp .L3
跳转到.L3
如果 jg 行处的 x > y 则跳转到 .L2: 并完成此行
movl -4(%rbp),%eax
这就是我意识到我真的很困惑的地方。在我看来,您正在将 x 复制到 x 然后 .L3 完成,我认为 x 已返回
【问题讨论】:
-
只是为了确认一下,这是 AT&T-syntax x86 程序集吗?
-
我不认为你感到困惑。您只是在查看未优化的代码,因此有些行完全没用(就像您所说的将 x 分配给 x )。那么,考虑到所有这些,您认为该函数的作用是什么?
-
是的,我相信这是 AT&T 语法 x86 程序集。它是由 linux @Dai 上的 c 代码创建的
-
那么代码的真正作用就是取 2 个变量(x 和 y),然后返回两者中较小的一个? @JS1
-
如果我正确阅读了汇编代码和您的分析,它将返回更大的:如果 x 更大,它会跳转到
L2,并且它会(不必要地)将 x 复制到 L2 的 %rax 中。
标签: c assembly reverse-engineering x86-64 conditional-statements