我试图调试一个汇编代码(使用 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)
谢谢