gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:00:06 25 4
gpt4 key购买 nike

我的代码中有这个片段

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(数据执行保护)的内容。可能是此功能导致此编译错误吗?如果是这样,如何禁用它?

最佳答案

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

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

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

关于c - 使用 "jmp *%esp"时操作数类型不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50784251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com