GDB反汇编使用不一致的寄存器命名

时间:2013-08-03 18:58:54

标签: debugging assembly gdb disassembly

我正在调试/反汇编一个非常简单的C程序,我只是出于学习目的而写的。但是,我注意到GDB似乎对反汇编输出之间的寄存器使用了不一致的表示法,并且当我在断点之后输入“info registers”时它告诉我。

以下是反汇编输出的一部分(在我的断点附近):

0x0000000100000d15 <main+181>:  xor    %dl,%dl
0x0000000100000d17 <main+183>:  mov    %ecx,%edi
0x0000000100000d19 <main+185>:  mov    %dl,%al
0x0000000100000d1b <main+187>:  callq  0x100000da0 <checkLicense>
0x0000000100000d20 <main+192>:  mov    %eax,%ecx
0x0000000100000d22 <main+194>:  cmp    $0x0,%ecx
0x0000000100000d25 <main+197>:  je     0x100000d47 <main+231>
0x0000000100000d27 <main+199>:  lea    0x1bb(%rip),%rax        # 0x100000ee9
0x0000000100000d2e <main+206>:  mov    %rax,%rdi

这是我在GDB中调用“info registers”命令时得到的输出的一部分:

(gdb) info registers
rax            0x1  1
rbx            0x0  0
rcx            0x1  1
rdx            0x1  1
rsi            0x3  3
rdi            0x3  3

我将断点设置在cmp操作发生的位置。如您所见,它将寄存器ECX中的值与0进行比较,但是,ECX似乎不是真正的寄存器。当我得到“信息寄存器”的结果时,它似乎确实返回了真实的寄存器,即rcx。例如,当我尝试使用“set $ ecx = 1”操作GDB中的寄存器时,它没有任何效果,但是当我“设置$ rcx = 1”时,它似乎确实有效。

这种不一致有什么问题,有没有办法解决它?

1 个答案:

答案 0 :(得分:0)

  

这种不一致是怎么回事?

指令cmp $0x0,%ecx将寄存器rcx低32位0进行比较,因此反汇编是正确的。

  

“信息寄存器”它似乎确实返回实际寄存器,即rcx

正确。

  

“设置$ ecx = 1”例如,它没有效果

它对我有效:

(gdb) info reg rcx
rcx            0xffffffffffffffff   -1
(gdb) set $ecx = 0
(gdb) info reg rcx
rcx            0xffffffff00000000   -4294967296

如果set $ecx = 1对您没有任何影响,则可能是GDB错误。