2013-08-03 59 views
0

我正在调试/反汇编一个非常简单的C程序,我只是为学习目的而编写的。然而,我注意到GDB似乎在反汇编输出和它告诉我当我在断点之后输入“信息寄存器”之间的寄存器时使用了不一致的符号。GDB反汇编使用不一致的寄存器命名

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

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中的“信息登记”命令:

(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”时,它似乎工作。

这种不一致是怎么回事,有没有办法解决这个问题?

回答

0

怎么了这一矛盾?

指令cmp $0x0,%ecx比较低32位与0寄存器rcx,所以拆卸是正确的。

“信息登记” 它似乎回到真正的寄存器,即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错误。