【发布时间】:2018-04-24 22:43:22
【问题描述】:
我目前正在解决计算机系统第 3 版中的问题 3.3:从程序员的角度来看,我很难理解这些错误的含义...
movb $0xF, (%ebx) 报错,因为 ebx 不能用作地址寄存器
movl %rax, (%rsp) 和
movb %si, 8(%rbp) 给出错误,指出指令后缀和寄存器 ID 不匹配。
movl %eax, %rdx 给出一个错误,指出目标操作数的大小不正确
为什么我们不能使用 ebx 作为地址寄存器?是因为它的32位寄存器吗?如果改为movb $0xF, (%rbx),以下行会起作用吗?因为rbx是64位寄存器的?
关于指令后缀和寄存器ID不匹配的错误,是否出现此错误是因为它应该是movq %rax, (%rsp)和movew %si, 8(%rbp)而不是movl %rax, (%rsp)和movb %si, 8(%rbp)?
最后,关于“目标操作数大小不正确”的错误,这是因为目标寄存器是 64 位而不是 32 位吗?因此,如果代码行是movl %eax, %edx,则不会发生错误?
任何启示将不胜感激。
这是针对 x86-64 的
【问题讨论】:
-
是的,如果您使用的是 64 位架构,地址长度必须为 64 位。
-
movb $0xf, (%ebx)是正确的。您只需要一个地址大小覆盖即可使用它。你的汇编器可能不支持这个吗? -
@fuz 不确定,但是如果地址大小被覆盖,
movb $0xf, (%bx)是否也正确? -
@calebeja9 不可以。地址大小在长模式下只能是 32 位或 64 位。
-
这是来自 CS:APP 第 3 版,“全球”版本吗?在练习题中充满了关于 x86-64 的错误声明。CS:APP example uses idivq with two operands? 有一些关于那本书的情况的信息,并且出版商雇用的无知的人,在不了解 x86-64 的情况下编造新问题。