gpt4 book ai didi

assembly - JMP 指令 - 十六进制代码

转载 作者:行者123 更新时间:2023-12-03 23:07:22 30 4
gpt4 key购买 nike

对JMP机器指令的十六进制代码转换有疑问。我有我想跳转到的绝对地址,比如“JMP 0x400835”。
首先,这是允许的吗?如果是,相应的十六进制代码是什么?
如果没有,我可以先将地址存储在某个寄存器中,比如 EAX,然后放入“JMP EAX”?
我正在研究 x86(64b) 架构。

我试图从 gdb 中的 diassem 输出中打印出十六进制代码,但没有一致性,即我没有在十六进制代码中看到目标地址。

我是十六进制代码和机器指令的新手,请原谅我的无知。

最佳答案

没有形式 JMP absaddr 的跳转到 64 位模式下的绝对地址。跳转的操作数始终是到 rip 的 32 位相对位移。 ,其符号扩展到 64 位。

您看到没有一致性的原因可能是偏移量取决于当前指令指针,而您没有意识到这一点。
jmp eax也不允许,因为地址在 64 位架构上当然总是 64 位宽。一个序列 mov rax, addr + jmp rax是可能的,它看起来像

48 c7 c0 35 08 40 00            mov rax, 0x00400835
ff e0 jmp rax

或者
48 b8 35 08 40 00 00 00 00 00   mov rax, 0x0000000000400835
ff e0 jmp rax

我怎么知道这些十六进制代码?好吧,我确实问过我的编译器。我用 gcc -c 编译并用 objdump 拆开.我没有费心使用 Intel 语法,因为我不需要它。所以这是在 AT&T 语法中。
echo 'asm("mov $400835, %rax\n jmp *%rax\n");' > test.c
gcc -c test.c
objdump -d test.o

关于assembly - JMP 指令 - 十六进制代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9815448/

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