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

print/c $eax
print/c $rbx

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

cmp    %eax, %rbx

cmp    $eax, (%rbx)

谢谢

4

1 回答 1

2
CMP    %eax, (%rbx)

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

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

于 2013-04-20T20:42:20.513 回答