汇编代码产生意外行为

时间:2013-04-20 20:12:29

标签: assembly gdb

我尝试调试汇编代码(使用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对吗?但是,当我尝试使用以下内容查看两个寄存器的内容时​​:

print/c $eax
print/c $rbx

两个寄存器的内容都是116.但是,它只是执行je语句下面的语句而不是跳转到0x4010a3。难道我做错了什么?另外,我只是想知道,之间有什么不同:

cmp    %eax, %rbx

cmp    $eax, (%rbx)

THX

1 个答案:

答案 0 :(得分:2)

CMP    %eax, (%rbx)

将EAX中的值与RBX指向的指向的值进行比较。与if (x == *y)类似。

甚至不能将EAX与RBX进行比较,因为它们的大小不同(32比64位)。