是什么推动同一个寄存器两次呢?

时间:2016-07-06 15:27:39

标签: assembly x86

我想调用一个没有参数的函数。我知道该函数的地址在EAX寄存器中。为什么这段代码没有这样做:

push EAX
push EAX
ret

这个人正在调用函数:

push next_a
push EAX
ret 
next_a:

next_a是我想要调用的函数。但我知道这个函数的地址位于EAX

关于第一个:推动EAX两次做什么?

1 个答案:

答案 0 :(得分:2)

了解发生的事情。让我们调用函数foo

push eax ; address of foo on the stack
push eax ; address of foo on the stack again
ret      ; picks off the top item from the stack, goes to foo

foo:
; body of function
ret      ; picks off the top item from stack, which is still foo
         ; so invokes itself again

第二个例子:

push next_a ; address of next_a on the stack
push eax    ; address of foo on the stack
ret         ; picks off the top item from the stack, goes to foo

foo:
; body of function
ret      ; picks off the top item from stack, which is next_a

next_a:
; execution continues here

因此,两个版本首先调用foo。 无论如何,如果您真的只想调用foo(XY问题),那么请使用call eax并完成它。

  

next_a是我想要调用的函数。

真的?如果eax=next_a那么这两段代码完全相同。