gpt4 book ai didi

assembly - 在堆栈上传递参数

转载 作者:行者123 更新时间:2023-12-03 18:27:55 25 4
gpt4 key购买 nike

当您将参数传递给 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com