我正在尝试将汇编代码集成到c程序中,以便于访问。 我尝试运行以下代码(我使用的是x64 64位架构)
void push(long address) {
__asm__ __volatile__("movq %0, %%rax;"
"push %%rax"::"r"(address));
}
$ rsp的值似乎没有改变(esp也没有改变)。我是否遗漏了一些关于约束如何运作的明显事rax正在正确分配地址,但地址似乎永远不会被推入堆栈?
答案 0 :(得分:3)
你不能这样做。
内联asm必须向编译器记录它所采用的输入,它产生的输出,以及它作为执行的一部分而破坏的任何其他状态。你们没有这样做,但也许更重要的是,没有办法可以像你一样那样躲开堆栈指针,因为周围的代码,当它在asm块之后重新获得控制权时,没有办法找到它的任何数据 - 即使它已经将它保存在堆栈上,知道它会被破坏,它将无法将其恢复。
我不确定你要做的是什么,但无论如何,这都不是这样做的。