c - 数据移动错误说明
问题描述
我目前正在解决计算机系统第 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
解决方案
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 不是其中之一。
推荐阅读
- python - 将 Groupedby 对象转换为 DataFrame 或系列,无需操作
- python - 在虚拟环境中收到提及 miniconda 的错误消息
- node.js - Google Actions SDK 对话中的第二个请求失败并显示“TypeError:标准不是函数”
- java - 如何在流中使用两个过滤器进行不同的转换
- javascript - 带有 html5 导出按钮的流星表格导出数据
- docker - 在 localhost docker 登录成功,但从另一台机器我得到来自守护进程的错误响应:x509: certificate signed by unknown authority
- javascript - 从 JS 文件 (export.module) 动态导入的 Jest 全局变量
- php - 在 Laravel 中使用 Eloquent 和 Carbon 在一天结束时过期行
- python - 使用 Python psycopg2 和 LDAP 用户连接到 Postgres
- java - 约束注释类型