【发布时间】:2020-06-13 20:00:42
【问题描述】:
我一直在尝试将值放入通过地址传递的参数中。它在某个地方的堆栈上。
该函数通过链接到汇编程序的 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 *);
【问题讨论】:
-
请发布您的函数的确切签名以及您正在编程的操作系统(调用约定因操作系统而异)。另外,请发布您尝试过的完整代码。发布代码,不要只是解释它。发布用于调用函数的 C++ 代码也可能很有用。
-
刚刚做了,如果太含糊见谅
-
看看编译器对
Error的 C / C++ 版本做了什么。编译器会知道在哪里寻找你的变量。例如查看g++ -S -fverbose-asm输出。 How to remove "noise" from GCC/clang assembly output? -
@zapshe 还是太模糊了。我需要
Error的实际声明;我真的不关心你用来调用它的代码,但声明很重要。 -
@fuz 刚刚添加了,我没记下来。
标签: assembly stack x86-64 calling-convention