我尝试调试汇编代码(使用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
答案 0 :(得分:2)
CMP %eax, (%rbx)
将EAX中的值与RBX指向的指向的值进行比较。与if (x == *y)
类似。
甚至不能将EAX与RBX进行比较,因为它们的大小不同(32比64位)。