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]?
这些是多字节nop指令,用作填充以进行对齐.在这种情况下,它们永远不会被执行,因此编译器可以使用任何东西,但在其他情况下它可能需要是可执行的.当然,另请参阅intel优化手册,第3.5.1.9节" 使用NOP "以及指令集参考条目NOP.
| 归档时间: |
|
| 查看次数: |
1743 次 |
| 最近记录: |