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

时间:2014-03-18 17:15:16

标签: assembly gdb 64-bit

我目前正在编写简单的测试,以了解gdb如何使用extern "C"和选项-O0从C ++编译为asm,并且我的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

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

现在我的问题是为什么nopWORD PTR cs:[rax+rax*1+0x0]DWORD PTR [rax+rax*1+0x0]一致?

1 个答案:

答案 0 :(得分:7)

这些是多字节nop指令,用作填充以进行对齐。在这种情况下,他们不会被执行,所以编译器可以使用任何东西,但在其他情况下它可能需要可执行。另请参阅英特尔优化手册, 3.5.1.9使用NOP 部分,以及NOP的指令集参考条目。