x86-64 中 JMP 的第一种形式是:
Opcode Instruction Description
EB cb JMP rel8 Jump short, RIP = RIP + 8-bit displacement sign
所以例如JMP rel8=-2
是eb fe
。 fe
是一个单字节有符号的 2s-compliment -2。
如何用 Intel 语法表达这个 rel8 立即数?
我尝试了以下方法:
测试.s:
.intel_syntax noprefix
.global _start
_start:
jmp -2
编译:
$ gcc -nostdlib test.s
$ objdump -d -M intel
但我得到:
e9 00 00 00 00 jmp 5 <_start+0x5>
不如eb fe
所愿。
(更一般地说,英特尔语法记录在哪里?我在英特尔手册中找不到任何关于它的内容。英特尔手册解释了如何编码操作数,但它没有给出汇编语言的语法。)
更新:
解决方案是:
.intel_syntax noprefix
.global _start
_start:
jmp .
.
必须代表当前指令的地址。组装和拆卸给出:
4000d4: eb fe jmp 4000d4 <_start>
eb fe
如预期的。RIP 相对寻址是根据下一条指令进行的,因此汇编器必须为您调整当前指令的大小。