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

问题描述 投票:-1回答:1

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

该函数通过链接到汇编程序的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 *);
assembly stack x86-64 calling-convention
1个回答
0
投票

在函数入口上,第一个堆栈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

© www.soinside.com 2019 - 2024. All rights reserved.