NASM rep nop汇编为暂停[重复]

问题描述 投票:-1回答:1

考虑以下用x86-assembly编写的功能

foo:
        rep
        nop
        ret

使用NASM汇编代码并用gdb对其进行反汇编:

(gdb) disas foo
Dump of assembler code for function foo:
   0x0000000000000610 <+0>:     pause  ;pause ????
   0x0000000000000612 <+2>:     ret    
   0x0000000000000613 <+3>:     nop    WORD PTR cs:[rax+rax*1+0x0]
   0x000000000000061d <+13>:    nop    DWORD PTR [rax]
End of assembler dump.

它使用原始程序集中未显示的pause指令。为什么这样工作?这是NASM的故意记录的行为吗?因此,如果某些早期的x86 cpu没有pause,我们可以只使用rep nop

assembly x86 gdb x86-64 nasm
1个回答
1
投票
不是将NAS的REP NOP组装成PAUSE指令,而是将GDB分别解码构成REP前缀和NOP指令的F390字节作为PAUSE指令,将其组装成PAUSE指令。

这是因为PAUSE指令也被编码为F3 90。这是x86 CPUS的有意记录的行为,因此没有PAUSE指令的CPU会将其视为NOP。与NASM或GDB无关,它们只能根据CPU文档进行汇编和反汇编指令。

© www.soinside.com 2019 - 2024. All rights reserved.