我想调用一个没有参数的函数。我知道该函数的地址在EAX寄存器中。为什么这段代码没有这样做:
push EAX
push EAX
ret
这个人正在调用函数:
push next_a
push EAX
ret
next_a:
next_a
是我想要调用的函数。但我知道这个函数的地址位于EAX
关于第一个:推动EAX两次做什么?
答案 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
那么这两段代码完全相同。