当您将参数传递给 cpu 堆栈上的函数时,
你把参数放在然后 JSR 把返回地址放在堆栈上。
所以这意味着在你的函数中你必须取栈顶的项目(返回地址)
在你可以拿掉其他人之前)
返回值按照惯例存储在寄存器 D0
中。 .
例如,以下是正确的方法:
...
|Let’s do some addition with a function,
MOVE.L #4, -(SP)
MOVE.L #5, -(SP)
JSR add
|the result of the addition (4+5) is in D0 (9)
...
add:
MOVE.L (SP)+, A1 |store the return address
|in a register
MOVE.L (SP)+, D0 |get 1st parameter, put in D0
MOVE.L (SP)+, D2 |get 2nd parameter, put in D2
ADD.L D2, D0 |add them,
|storing the result in D0
MOVE.L A1, -(SP) |put the address back on the
|Stack
RTS |return
最佳答案
您不会从堆栈中“取出”参数,即您不会弹出它们。您通常会分配一个帧寄存器以指向过程入口点处的堆栈顶部,并在与帧指针的已知偏移量处访问参数。然后您的索引只是“跳过”返回地址,您知道它在那里。
例如。在一些假设的程序集中,当你在一个程序中。假设堆栈向下增长:
...
argument2
argument1
ret addr <---- stack pointer
所以只需访问
argument1
在偏移量 sp+4
(假设 32 位),argument2
在偏移量 sp+8
等。由于这些调用约定是已知的,因此这些偏移量在您的代码中进行了硬编码,并且计算效率很高。帧指针非常有用,因为您还将局部变量压入堆栈,并且您不希望参数的索引在不同的地方发生变化,因此帧指针在整个过程执行过程中提供了一个稳定的 anchor 。
关于assembly - 在堆栈上传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2605256/