0

编写将一个寄存器值返回给 C 中的调用函数的 x86 汇编函数的正确语法是什么?是否涉及一些堆栈操作,如果是这样,之后如何清理?我会感谢一个简单的例子。先感谢您。

4

3 回答 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 回答