我目前正在编写简单的测试,以了解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
填充,因为对齐,我可以得到这个。
现在我的问题是为什么nop
与WORD PTR cs:[rax+rax*1+0x0]
和DWORD PTR [rax+rax*1+0x0]
一致?
答案 0 :(得分:7)
这些是多字节nop指令,用作填充以进行对齐。在这种情况下,他们不会被执行,所以编译器可以使用任何东西,但在其他情况下它可能需要可执行。另请参阅英特尔优化手册, 3.5.1.9使用NOP 部分,以及NOP
的指令集参考条目。