使用" jmp *%esp"时操作数类型不匹配

时间:2018-06-10 13:36:36

标签: c assembly stack-pointer

我的代码中有这个代码段

void jmp_esp()
{
    __asm__("jmp *%esp");
}

使用gcc进行编译时

gcc aslr.c -o aslr -ggdb -fno-stack-protector -z execstack

我收到此错误。

aslr.c: Assembler messages:
aslr.c:6: Error: operand type mismatch for `jmp'

尽管汇编指令有效,为什么这行无法编译?

我读过DEP(数据执行预防)。可能是这个功能正在创建这个编译错误?如果是的话,如何禁用它?

1 个答案:

答案 0 :(得分:6)

指令jmp *%esp仅在16位和32位模式下可用。在64位模式下,jmp r/m32无法编码。根据您的意图,有两种方法可以修复您的代码:

  • 如果您打算编写32位x86程序,请编译并链接-m32以使编译器发出32位代码。
  • 如果您打算编写64位x86程序,请将指令更改为jmp *%rsp以跳转到rsp寄存器中包含的地址。

请注意,这与DEP无关。 DEP阻止执行未明确标记为可执行的内存区域。这发生在运行时,而不是在编译时。