【问题标题】:gdb - nop with extra data, why?gdb - nop 有额外的数据,为什么?
【发布时间】:2014-03-18 17:15:15
【问题描述】:

我目前正在编写简单的测试,以了解 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] 在一起?

【问题讨论】:

标签: assembly gdb 64-bit


【解决方案1】:

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

【讨论】:

  • 这回答了我的问题,虽然该部分恰好是 3.5.1.10
  • 确实,我的手册副本已经过时了。感谢您的信息。
猜你喜欢
  • 1970-01-01
  • 2019-03-30
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 2015-08-24
相关资源
最近更新 更多