如何从堆栈中获取函数参数 - 程序集
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
.
我一直在尝试将值放入通过地址传递的参数中。它在堆栈的某个地方。
该函数是通过链接到汇编程序的 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
.