St.*_*rio -2 x86 assembly gdb x86-64 nasm
考虑以下用 x86 汇编语言编写的函数
foo:
rep
nop
ret
Run Code Online (Sandbox Code Playgroud)
使用 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.
Run Code Online (Sandbox Code Playgroud)
它使用pause原始程序集中未提供的指令。为什么会这样?这是 NASM 故意记录的行为吗?那么如果一些早期的 x86cpu没有pause我们可以直接使用rep nop吗?
与其说NASM将REP NOP组装成PAUSE指令,不如说GDB将分别构成REP前缀和NOP指令的F3和90字节解码为PAUSE指令。
这是因为 PAUSE 指令也被编码为F3 90. 这是 x86 CPU 有意记录的行为,因此没有 PAUSE 指令的 CPU 会将其视为 NOP。它与 NASM 或 GDB 没有任何关系,只是它们根据 CPU 文档汇编和反汇编指令。
| 归档时间: |
|
| 查看次数: |
361 次 |
| 最近记录: |