如何从堆栈中获取函数参数 - 程序集

How to get function Argument from Stack - Assembly

我一直在尝试将值放入通过地址传递的参数中。它在堆栈的某个地方。

该函数是通过链接到汇编程序的 C++ 程序调用的。它传入 8 个参数,其中一个是浮点数。第一个参数在 RDI 中,倒数第二个在 r9 中。最后一个参数,我试图得到的那个在堆栈的某个地方。

我已经尝试了所有可能的偏移量,none 似乎有效。我已经设法更改了传入的其他一些变量的值,但不是我想要的!教授在它旁边写了[rbp + 16],暗示可以通过它访问地址,但是当我尝试更改值时它根本没有改变值:

movss [rbp+16], xmm0

目前,我在函数的开头推 RBP,将 100 移入 eax,将 eax 移入 xmm0 (cvtsi2ss),然后将 xmm0 移入 rbp+whateverOffset。

有什么我想念的吗?感谢任何见解,谢谢!

编辑:

这是在 Ubuntu 上完成的。这是汇编代码:

global  Error
Error:

push rbp

mov eax, 100
cvtsi2ss xmm0, eax
movss [rbp+16], xmm0```


ret

这是使用此 C++ 代码调用的:

Error(array, length, PrValue, &One, &Two, &Three, &Four, &Five);

我要访问的变量是"Five",我想将一个值移动到已移动的内存地址中。所有值都是浮点数,除了第二个是整数,数组是浮点数组。


extern "C" void Error(float[], unsigned int, float,
        float *, float *, float *, float *, float *);

在函数入口处,第一个堆栈参数位于 [rsp + 8]

您的函数 push rbp 保存调用者的 RBP,但您没有 mov rbp, rsp 使 RBP 成为帧指针。最后你也不要pop rbp

将RBP设置为传统的帧指针后,第一个堆栈arg将位于[rbp + 16].

movss [rbp+16], xmm0 将 xmm0 存储到 你的调用者的 堆栈帧中,如果你的调用者是用 -fno-omit-frame-pointer 编译的(默认为 -O0)。即它使用您的调用者碰巧在 RBP 中留下的任何值,而不是您自己的帧指针。

如果您想使用在堆栈上传递的指针 arg,您需要先将其加载到整数寄存器中,然后然后取消引用它。你不想像 argfive = float 那样覆盖 arg,你想要 *argfive = float.