32 位 GCC C 程序中的内联 64 位汇编

ben*_*phy 2 assembly gcc

我正在编译 32 位二进制文​​件,但想在其中嵌入一些 64 位程序集。

void method() {
   asm("...64 bit assembly...");
}
Run Code Online (Sandbox Code Playgroud)

当然,当我编译时,我会收到有关引用错误寄存器的错误,因为寄存器是 64 位的。

evil.c:92: Error: bad register name `%rax'
Run Code Online (Sandbox Code Playgroud)

是否可以添加一些注释,以便 gcc 将使用 64 位汇编器来处理 asm 部分。我有一个单独编译的解决方法,使用 PROT_EXEC|PROT_WRITE 映射到页面中,然后复制到我的代码中,但这非常尴尬。

小智 5

不,这是不可能的。您无法从 32 位二进制文​​件运行 64 位程序集,因为运行程序时处理器不会处于长模式。

将 64 位代码复制到可执行页面将导致该代码被错误地解释为 32 位代码,这将产生不可预测和不良的结果。

  • 如果您的程序是 32 位二进制文​​件,则它不会以长模式运行。仅仅使用 64 位处理器或操作系统是不够的。整个过程必须是 64 位才能使用 x86-64 指令。 (2认同)

归档时间:

查看次数:

2549 次

最近记录:

7 年,6 月 前