【问题标题】:How to get function Argument from Stack - Assembly如何从堆栈中获取函数参数 - 程序集
【发布时间】: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


【解决方案1】:

在函数入口处,第一个堆栈 arg 位于 [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

【讨论】:

  • 抱歉,最后省略了pop rbp。感谢您提供的信息,我刚刚找到了我需要的偏移量,由于某种原因,它是 72。在找到它之前我尝试了很多偏移量。这可能不是正确的方法,它可能会以不应该的方式改变价值,但这个装配类给了我一种“如果它有效,就不要关心”的心态。再次感谢!
  • @zapshe:72?这是没有意义的。相对于什么?如果您在push rbp 之后仍未使用mov rbp, rsp,则您依赖于不属于调用约定的调用者的详细信息。您是否绕过指针并直接存储到调用者堆栈帧中的Five 中,而不使用它传递给您的指针?
  • 我没有按照你说的将 RSP 转换为 RBP。我花了一些时间寻找正确的偏移量,而 72 让我觉得我可能只是将它直接存储到 Five 中。我在查看其他进来的变量的内存地址,然后查看了RBP正在查看的内存地址,如果我没记错的话,发现有68个差异。至少是在六十年代。所以我测试了大于那个的偏移量,它恰好是 72。如果我做得正确,我确信正确的偏移量要小得多。
猜你喜欢
  • 2012-12-27
  • 2016-10-04
  • 1970-01-01
  • 2016-09-27
  • 2011-11-12
  • 2018-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多