【问题标题】:Is it specified what happens when the stack pointer is pushed on x64?是否指定了在 x64 上推送堆栈指针时会发生什么?
【发布时间】:2021-04-06 08:15:45
【问题描述】:

我正在 x64 上进行汇编编程,我打算在堆栈中推送一个地址。我打算写push %rsp,但是,由于这条指令改变了%rsp的值,我不确定会推送什么值。

特别是如果我运行以下命令:

movq $0x10, %rsp
pushq %rsp

内存地址0x8会包含0x10还是0x8?此处理器是否依赖于所有 x64 处理器?

【问题讨论】:

  • 此代码序列对您有何用处?如果您分享,也许我们可以评论您正在解决的更大问题。
  • @ErikEidt:如果 RSP 当前指向 ASCII 字节或您刚刚推送的其他内容,则 push %rsp 作为 shellcode 的一部分可能很有用。甚至作为在函数顶部实现volatile int x = 10, *px = &x; 的一部分。但不是mov $0x10, %rsp 首先!所以这部分例子完全是人为的。

标签: assembly x86-64 callstack instructions


【解决方案1】:

正如@Raymond Chen 在 cmets 中提到的,它在 Intel 的手册中指定,HTML 摘录在这里:https://www.felixcloutier.com/x86/push

推送的值是%rsp push 指令之前的值。

push mem 与涉及 RSP 的寻址模式相同,例如 push 16(%rsp) 复制堆栈中已有的内容。

【讨论】:

  • 记住这是两种可能性中的“有用”之一可能会有所帮助,因为您可以push foopush rsp 将指针推送到您之前推送的值。如果反过来,push rsp 只会推送一个指向自身的指针,这对任何事情都没有什么用处。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-08
  • 1970-01-01
  • 2012-02-05
  • 1970-01-01
  • 2012-10-07
  • 2021-12-13
相关资源
最近更新 更多