assembly 将常量字节值移动到%ebx时出错

vxf3dgd4  于 2023-11-19  发布在  其他
关注(0)|答案(3)|浏览(151)

我正在阅读《计算机系统,程序员的视角》(第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位地址?我完全误解了汇编吗?

lrl1mhuk

lrl1mhuk1#

你说得对,

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

字符串
不应该被允许。事实上,作者已经发布了这是一个错字。检查他们的errata list(Ctrl-F为“第183页”)。

bqjvbblv

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位代码中是可取的)。

yrdbyhpb

yrdbyhpb3#

如果你机器是x64,你不能用%ebx(4位)访问内存,因为你的内存地址是8位。

相关问题