我一直在尝试将值放入通过地址传递的参数中。它在堆栈中的某个位置。
该函数通过链接到汇编程序的C ++程序进行调用。它传入8个参数,其中之一是浮点数。第一个参数在RDI
中,倒数第二个在r9
中。最后一个参数,我要获取的参数在堆栈中的某个位置。
我已经尝试了所有可能的偏移量,但似乎都没有效果。我设法更改了传入的其他变量的值,但不是我想要的变量!教授在其旁边写了[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);
我要访问的变量是“五个”,我想将一个值移入要移入的内存地址。所有值都是浮点数,除了第二个是整数,数组是浮点数组。
extern "C" void Error(float[], unsigned int, float,
float *, float *, float *, float *, float *);
在函数入口上,第一个堆栈arg位于[rsp + 8]
。
您的函数执行push rbp
来保存调用者的RBP,但没有执行mov rbp, rsp
来使RBP成为帧指针。您最后也不要pop rbp
。
将RBP设置为传统的帧指针之后,第一个堆栈arg将位于[rbp + 16]
。
movss [rbp+16], xmm0
(默认值为-O0)编译的,则-fno-omit-frame-pointer
将xmm0存储在您的调用方的堆栈帧中。即它使用您的呼叫者碰巧留在RBP中的任何值,而不是您自己的帧指针。
如果要使用在堆栈上传递的指针arg,则需要先将其加载到整数寄存器中,然后然后对其取消引用。您不想像argfive = float
一样覆盖arg,而是想要*argfive = float
。