我刚开始学习汇编语言。除了正在调试的实际代码之外,是否有一种方法可以在GDB中执行计算?例如,我正在使用Linux IA-32汇编(AT&T语法)逐步执行以下内容:
;$esi is 0xbffff0a8 which refers to 1 after this command. $eax is 2
0x08048cd5 <+42>: lea -0x20(%ebp),%esi
;$eax=ebx=2 after this instruction
0x08048cd8 <+45>: mov %ebx,%eax
;$eax equals 2 after this instruction
0x08048cda <+47>: add -0x4(%esi,%ebx,4),%eax
我不明白$eax是如何变成2的。我可以在gdb中执行像“-0x4(%esi,%ebx,4)”这样的指令并分析结果吗?
据我所知,$ebx乘以4得到8,然后加上$esi得到9。然后减去-4得到5。然后将5加到$eax上,$eax为2,则应得到7。但实际上$eax是2。
lea
和其他指令(如add
)的区别。对于后者,会计算内存引用的有效地址(例如-0x4(%esi, %ebx, 4)
),然后将该地址指向的值加载到CPU中,并加到%eax
寄存器中。 - scotttadd -0x4(%esi,%ebx,4),%eax
将执行以下操作:将%ebx
乘以 4 得到 8,加上%esi
得到0xbffff0b0
,再减去 4 得到地址0xbffff0ac
。从该地址读取的数据将被加到%eax
中。假设0xbffff0ac
处的数据为零。但这并不能回答你在 GDB 中如何评估汇编表达式的真正问题。 - Michael Burr