assembly - 在堆栈上传递参数

标签 assembly stack motorola 68000

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

相关文章:

c - 通过直接写入下面的发送缓冲区来保存堆栈

c - 我正在比较什么类型的数据?

android - 调试摩托罗拉凯旋

android - 通过 udev Ubuntu for Android Studio 连接 Moto G XT1032

android - Ionic View 不显示在 chrome inspect 上

c - 具有最小内存占用的程序(在 Linux 上)

assembly - 在 64 位 masm 中打印 hello

java - 在 Eclipse 中导航 Java 调用堆栈

assembly - 如何统计avx和avx2指令集的数量

c - 函数返回局部变量的地址,但仍在c中编译,为什么?