如何让asm跳转到c中的变量地址?

Sef*_*efu 4 c linux x86 assembly inline-assembly

现在,我在 c 中调用带有内联汇编的跳转指令,如下所示:

int register eax asm("eax") = addr; // addr is a memory address
asm("jmp *%eax");
Run Code Online (Sandbox Code Playgroud)

我想这样做而不必设置任何其他寄存器值(例如我想做的是这样的):

asm("jmp *(addr)");
Run Code Online (Sandbox Code Playgroud)

这样做的正确方法是什么?也就是说,如何将 ac 变量“插入”到 asm 调用中?

Ubuntu 12.04 64 位,Intel x86 64 位处理器,gcc 版本 4.7.4。

Ign*_*ams 6

“带有 C 表达式操作数的汇编指令”

asm volatile("jmp *%0" : : "r" (addr));
Run Code Online (Sandbox Code Playgroud)

  • **请注意,在没有 `asm goto` 的情况下,从内联 asm 语句中使用 `jmp` 通常并不安全([GCC 手册](https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#GotoLabels ))**。或者至少在 asm 语句之后有一个 __builtin_unreachable()` ,让编译器知道执行不会从另一端出来,并且它不能安全地将存储或其他内容推迟到 asm 之后。 (2认同)