2011-05-05 34 views
5

对于如何从汇编语言中的方法返回值,我略感困惑。据我所知,eax寄存器用于保存要返回的结果。将结果返回给eax(IA-32汇编语言)

举个例子,说我的结果是4,我用:

mov eax, 4 

我现在已经在EAX 4,我想回到这个方法。有什么我需要做的或将指令ret自动返回结果?

的事情是,我不知道,因为当我使用ret我回去给调用者有什么特别之处寄存器eax,呼叫者可以自由访问任何寄存器的我储存的结果,那么为什么我不能只用ebxecx来存储结果吗?

回答

7

结果存储在eax中的原因是惯例;你可以决定将它存储在你喜欢的任何寄存器中。但是,函数的调用者可能会认为返回值的内容存储在eax中。这也意味着您在致电ret时无需做任何额外的工作。

4

您所描述的是至少由Microsoft编译器使用的convention。本身没有什么特别的关于eax。如果您的汇编语言函数是由用一种常规调用约定编译的C/C++代码调用的,那么它会期望结果在eax中传递。

ret只是将控件返回到调用函数的位置。没有寄存器受到影响(当然除了ESP和指令指针)。

+0

我认为这个特定的约定更广泛一些,包括GCC以上。你是否知道任何不使用这种约定的通用编译器? – 2011-05-05 12:53:55

+0

不是。但是任何可能的约定。 – 2011-05-05 12:55:17

+1

@Mr。 Shickadance:虽然不完全是常规的(你不能从用户代码中调用它们),但一些Delphi编译器帮助程序使用ZF来返回布尔结果。 – 2011-05-05 13:14:16