编写将一个寄存器值返回给 C 中的调用函数的 x86 汇编函数的正确语法是什么?是否涉及一些堆栈操作,如果是这样,之后如何清理?我会感谢一个简单的例子。先感谢您。
问问题
122 次
3 回答
1
通常,以下页眉和页脚用于 32 位程序:
MyProc:
; prologue
push ebp
mov ebp, esp
sub esp, sizeof_local_variables ; this is optional, if your procedure
; needs some local variables.
; here write your code.
; The arguments are accessible on addresses [ebp+8+some_const]
; The local variables are on addresses [ebp-some_const]
; where some_const must be less than sizeof_local_variables of course.
; Return the result in EAX register if you want to return it to C/C++ or other HLL.
; epilogue
mov esp, ebp ; restores the stack pointer as it was on the entry
retn n ; returns to the caller. If you are using CCALL convention
; (usualy in C code) you have to omit "n" constant.
; n is the count of bytes of the pushed arguments.
; in 32bit environment it must be multiply of 4
序列“push ebp/mov ebp, esp”可以由指令“enter”和“mov esp, ebp”由“leave”提供,但我更喜欢让它更易于理解,并且在大多数平台上使用显式指令更快。
于 2013-02-12T12:49:17.043 回答
1
有了gcc,就可以使用内联汇编了,不用太担心堆栈。
unsigned int get_eax(void) {
unsigned int eax;
asm("" : "=a" (eax));
return eax;
}
这使用了一个没有指令的汇编部分,输出约束表明 eax 的值应该放在一个名为 的变量中eax
。
我unsigned int
用于寄存器,它不是很便携,但内联汇编无论如何也不是很便携。该变量需要是寄存器的大小。
于 2013-02-12T12:59:21.577 回答
0
在 Linux 中,如果返回 int,则返回 eax,long(仅限 64 位模式)返回 rax。
于 2013-02-12T12:46:33.790 回答