首页 文章

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

提问于
浏览
4

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

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

所以例如 JMP rel8=-2eb fe . fe 是一个字节签名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 .

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

Update:

解决方案是:

.intel_syntax noprefix
.global _start
_start:
    jmp .

. 必须表示当前指令的地址 . 组装和拆卸给出:

4000d4: eb fe      jmp    4000d4 <_start>

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

1 回答

  • 4

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

    有一个小页面在_2906285中记录它 .

相关问题