在汇编程序中编写函数

PSt*_*tag 5 assembly nasm

我在汇编程序(nasm)中编写代码,我想要包含函数,目前我已经

function0:

code

jmp return0
Run Code Online (Sandbox Code Playgroud)

函数通过跳转到function0来调用,返回链接到调用函数的下面的标签,但这仅在调用函数一次时才有效,有没有更好的方法呢?

Goo*_*ies 7

(假设NASM x86)

使用call以调用该函数并ret从函数返回.

键入时发生的情况call是下一条指令的地址被push写入堆栈.什么时候ret被击中,它将pop从堆栈和地址开始jmp.

func:
    xor eax, eax
    mov eax, 10
    add eax, 5
    ret ;// essentially identical to: pop [register] -> jmp [register]


_start:
    call func
    mov ebx, eax ;// Address of this instruction is pushed onto the stack
    ;// ebx is now 15
Run Code Online (Sandbox Code Playgroud)

调用约定规定EAX寄存器应包含返回值.另请注意,__ cdecl调用约定会在堆栈上获取参数.请查看上述链接页面中的示例.NASM功能将设置其堆栈帧并从堆栈中获取参数以便在函数中使用.该值存储在EAX.

  • 调用约定因平台/处理器而异。例如,如果可能,x86-64 在回退到堆栈之前尝试在寄存器中传递一些参数。_EAX_ 并不总是包含返回值,它同样取决于调用约定和返回的类型。 (2认同)
  • 通常,EAX通常包含返回值(或对它的引用),尤其是在x86中.我知道浮点数通常按照大多数调用约定在XMM寄存器中返回,但是,我主要是指cdecl和stdcall约定,因为OP似乎还没有理解各种调用约定. (2认同)