4

x86-64 中 JMP 的第一种形式是:

Opcode    Instruction  Description
EB cb     JMP rel8     Jump short, RIP = RIP + 8-bit displacement sign

所以例如JMP rel8=-2eb fefe是一个单字节有符号的 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 相对寻址是根据下一条指令进行的,因此汇编器必须为您调整当前指令的大小。

4

1 回答 1

4

(G)AS 显然用于.表示当前地址(当前指令的地址),这与大多数其他汇编程序不同。

在文档中有一个小页面记录它。

于 2013-11-03T10:26:12.463 回答