内联汇编堆栈行为

时间:2014-10-23 21:09:17

标签: c gcc assembly stack

我正在尝试将汇编代码集成到c程序中,以便于访问。   我尝试运行以下代码(我使用的是x64 64位架构)

 void push(long address) {
      __asm__ __volatile__("movq %0, %%rax;"
                            "push %%rax"::"r"(address));
 }

$ rsp的值似乎没有改变(esp也没有改变)。我是否遗漏了一些关于约束如何运作的明显事rax正在正确分配地址,但地址似乎永远不会被推入堆栈?

1 个答案:

答案 0 :(得分:3)

你不能这样做。

内联asm必须向编译器记录它所采用的输入,它产生的输出,以及它作为执行的一部分而破坏的任何其他状态。你们没有这样做,但也许更重要的是,没有办法可以像你一样那样躲开堆栈指针,因为周围的代码,当它在asm块之后重新获得控制权时,没有办法找到它的任何数据 - 即使它已经将它保存在堆栈上,知道它会被破坏,它将无法将其恢复。

我不确定你要做的是什么,但无论如何,这都不是这样做的。