我正在阅读《计算机系统,程序员的视角》(第3版),练习题3.3包含以下行:
movb $0xF, (%ebx)
字符串
我应该找出这条x86-64装配线的问题所在,答案是:“Cannot use %ebx as address register”,这对我来说没有意义。我的理解是这一行打算将0xF复制到主存中的一个位置,但是%ebx是一个32位寄存器,内存地址在64位机器上是64位宽,所以%ebx不能保存内存地址,因此它不能被解引用(解引用是%ebx周围的括号所表示的,对吗?)然而,在书中回顾几页(第183页,如果你有的话),有一个例子详细说明了五个mov操作数--destination组合,其中之一是:
movb $-17, (%esp) Immediate--Memory, 1 byte
型
%esp是一个32位寄存器,就像%ebx一样!这个例子显示了一个字节值被移动到一个解引用的32位寄存器!这对我来说没有意义,因为%esp怎么会包含一个64位地址?我完全误解了汇编吗?
3条答案
按热度按时间lrl1mhuk1#
你说得对,
字符串
不应该被允许。事实上,作者已经发布了这是一个错字。检查他们的errata list(Ctrl-F为“第183页”)。
bqjvbblv2#
对于64位x86;指令
movb $0x0F, (%ebx)
没有任何错误。它汇编为0x 67,0xC 6,0x 03,0x 0 F。书是错的。
注意所有的指令都可能是错误的(简单的例子:当您想使用
sub
时使用add
),而movb $0x0F, (%ebx)
可能是一个bug(例如,可能值应该是0xFF
,可能它应该使用不同的寄存器,可能它应该使用rbx
,可能它应该是lea
,这并不意味着它总是一个bug(例如,32位地址是完全法律的,有时在64位代码中是可取的)。yrdbyhpb3#
如果你机器是x64,你不能用%ebx(4位)访问内存,因为你的内存地址是8位。