将常量字节值移入%ebx

时间:2015-07-26 02:32:21

标签: assembly x86-64

我正在通过计算机系统,程序员的角度(第3版),以及练习题3.3包含以下内容:

movb $0xF, (%ebx)

我应该找出这行x86-64程序集的错误,并且答案密钥指出:"不能使用%ebx作为地址寄存器",它没有"对我有意义。我的理解是该行打算将0xF复制到主存储器中的某个位置,但是%ebx是32位寄存器,64位机器上的存储器地址是64位宽,因此%ebx不能保存存储器地址,因此它不能被解除引用(取消引用是围绕%ebx的括号表示的,对吗?)。但是,看一下书中的几页(第183页,如果你有的话),有一个例子详细说明了五个mov操作数 - 目的地组合,其中一个是:

movb $-17, (%esp)         Immediate--Memory, 1 byte

%esp是一个32位寄存器,就像%ebx一样!这个例子显示一个字节值被移动到一个解除引用的32位寄存器!哪个对我没有意义,因为%esp如何包含64位地址?我是否完全误解了集会?

2 个答案:

答案 0 :(得分:2)

你是对的,

movb $-17, (%esp)         Immediate--Memory, 1 byte

不应该被允许。事实上,作者将此作为拼写错误发布。 查看他们的errata list(Ctrl-F代表“第183页”)。

答案 1 :(得分:1)

对于64位80x86;指令movb $0x0F, (%ebx)没有任何问题。组装成0x67、0xC6、0x03、0x0F。

这本书是错误的。

请注意,所有指令都可能是错误(简单的示例:当您想使用add时使用sub),而movb $0x0F, (%ebx)可能是错误(例如,该值应为是0xFF,也许应该使用其他寄存器,也许应该使用rbx,也许应该是lea,..)。这并不意味着它总是一个错误(例如32位地址是完全合法的,有时在64位代码中是可取的)。