x86-64英特尔语法for rel8立即操作数?

时间:2013-11-03 09:57:00

标签: assembly x86 x86-64 gas intel-syntax

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。

如何在英特尔语法中立即表达此rel8?

我尝试了以下内容:

test.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

(更一般地说,英特尔语法记录在哪里?我在英特尔手册中找不到任何关于它的内容。英特尔手册解释了如何编码操作数,但它没有给出汇编语言的语法。)< / p>

更新

解决方案是:

.intel_syntax noprefix
.global _start
_start:
    jmp .

.必须代表当前指令的地址。组装和拆卸会产生:

4000d4: eb fe      jmp    4000d4 <_start>
根据需要

eb fe。 RIP相对寻址是根据下一条指令进行的,因此汇编器必须根据当前指令的大小进行调整。

1 个答案:

答案 0 :(得分:4)

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

documentation中有一个很小的页面记录它。