首页 > 解决方案 > 数据移动错误说明

问题描述

我目前正在解决计算机系统第 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)andmovew %si, 8(%rbp)而不是movl %rax, (%rsp)and movb %si, 8(%rbp)

最后,对于“目标操作数大小不正确”的错误,这是因为目标寄存器是 64 位而不是 32 位吗?因此,如果代码行movl %eax, %edx改为,则不会发生错误?

任何启示将不胜感激。

这是针对 x86-64

标签: cassemblyx86-64

解决方案


movb $0xF, (%ebx) gives an error because ebx can't be used as address register

确实ebx不能用作地址寄存器(对于x86-64),但是rbx可以。ebx 是 rbx 的低 32 位。64 位代码的全部意义在于地址可以是 64 位,因此尝试使用 32 位寄存器来引用内存毫无意义。

movl %rax, (%rsp) and movb %si, 8(%rbp) gives error saying that 
theres a mismatch between instruction suffix and register I.D.

是的,因为您使用的是 ,movl所以“l”表示长,(在此上下文中)表示 32 位。但是,rax 是一个 64 位的寄存器。如果你想用 rax 写 64 位,你应该使用movq. 如果你想写 32 位,你应该使用eax.

movl %eax, %rdx gives an error saying that destination operand incorrect size

您正在尝试将 32 位值移动到 64 位寄存器中。有为您进行此转换的说明(参见cdq示例),但 movl 不是其中之一。


推荐阅读