gdb - 带有额外数据的nop,为什么?

axe*_*uch 6 64-bit assembly gdb

我目前正在编写简单的测试来理解gdb如何从C++编译为asm using extern "C"和option -O0以及我的asm对象是如何编译的nasm -g -f elf64

这是我拆卸的有关堆栈框架:

   0x0000000000400570 <+0>: push   rbp
   0x0000000000400571 <+1>: mov    rbp,rsp
   0x0000000000400574 <+4>: push   r10
=> 0x0000000000400576 <+6>: mov    r10,QWORD PTR [rbp-0x8]
   0x000000000040057a <+10>:    pop    r10
   0x000000000040057c <+12>:    mov    rsp,rbp
   0x000000000040057f <+15>:    pop    rbp
   0x0000000000400580 <+16>:    ret    
   0x0000000000400581 <+17>:    nop    WORD PTR cs:[rax+rax*1+0x0] ; this instruction
   0x000000000040058b <+27>:    nop    DWORD PTR [rax+rax*1+0x0]   ; and this one
Run Code Online (Sandbox Code Playgroud)

最后两个指令用填充nop,我可以因为对齐而得到这个.

现在我的问题是为什么nop一直在WORD PTR cs:[rax+rax*1+0x0]DWORD PTR [rax+rax*1+0x0]

Jes*_*ter 7

这些是多字节nop指令,用作填充以进行对齐.在这种情况下,它们永远不会被执行,因此编译器可以使用任何东西,但在其他情况下它可能需要是可执行的.当然,另请参阅intel优化手册,第3.5.1.9节" 使用NOP "以及指令集参考条目NOP.