2013-04-20 55 views
0

我試圖調試彙編代碼(使用GDB),但它的行爲真的很奇怪。我認爲這段代碼的高級語言是if語句的權利?當EAX相等的內容,RBX,就會跳轉到規定地址,否則將執行下面的語句在這裏是代碼:彙編代碼產生意外的行爲

 0x000000000040108b <+25>: lea 0x4(%rsp),%rbx 
     0x0000000000401090 <+30>: mov $0x1,%ebp 
     0x0000000000401095 <+35>: mov %ebp,%eax 
     0x0000000000401097 <+37>: add -0x4(%rbx),%eax 
     0x000000000040109a <+40>: cmp %eax,(%rbx) 
=> 0x000000000040109c <+42>: je  0x4010a3 <phase_2+49> 

從我的理解,當%EAX等於%RBX時,聲明je將代碼跳到地址0x4010a3的權利?然而,當我嘗試看看同時使用寄存器的內容:不是跳躍到0x4010a3

print/c $eax 
print/c $rbx 

兩個寄存器的內容是116。然而,它只是執行JE語句下面的語句。難道我做錯了什麼?此外,我想知道,有什麼不同的間:和

cmp %eax, %rbx 

cmp $eax, (%rbx) 

THX

回答

2
CMP %eax, (%rbx) 

EAX中的值進行比較,以指出由RBX值。類似於if (x == *y)

EAX與RBX的比較甚至不可能,因爲它們的大小不同(32比64比特)。

+0

如何查看rbx指向的值? – 2013-04-20 20:55:30

+0

@JackSkernov:你說'%rbx'是116,這聽起來像是一個糟糕的指向我的指針。如果這是一個好的指針,你可以使用gdb中的'x'命令來轉儲那個位置的內存。 – 2013-04-20 21:00:58