2013-08-03 58 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錯誤。