assembly - 源和目标的大小必须相同 (8086)
问题描述
我假设 MOV 指令中的源和目标必须具有相同的大小,并且当我编写这些指令时:
.data
var dw 0
.code
mov al,56h
mov var,al
我收到操作数与 16 位地址和 8 位寄存器不匹配的错误,但在这种情况下,我没有收到任何错误,但 var 是 32 位(双字)而 ax 是 16 位,所以为什么我不没有任何错误?
.data
var dd 0
.code
mov ax,56h
mov var,ax
我正在使用鸸鹋 8086。
解决方案
8086 使用最多 16 位寄存器。当您尝试将 16 位值分配给 32 位变量时,emu8086 假定您的变量是 16 位的。
word ptr
如果您只想存储定义为双字的命名位置的低位字,则使用相同语法(MASM 和 TASM)的其他汇编器确实需要显式的大小覆盖。例如mov word ptr [var], ax
。
对于emu8086,只有在将一个字节存储到字变量中时才需要这个。
MASM/TASM 行为与在存储立即数时让符号名称暗示大小更一致,就像用 定义它时mov var, 1
暗示的那样,即使指令中没有暗示大小的寄存器。word ptr
dw
推荐阅读
- php - 根据 WooCommerce 中的变体属性添加可变产品可下载文件
- mysql - Laravel Eloquent 等效于 MYSQL DISTINCT 查询多列
- kubernetes - 如何 kubectl 端口转发 GitLab 网络服务?
- ruby-on-rails - PG::UndefinedColumn:错误:cours.user_id 列不存在
- python - Pybind11:将自定义 python 类型转换为自定义 C++ ptr
- react-native - 我的组件没有在状态更改时重新渲染本机反应
- chart.js - Chart.js 出现空白
- amazon-web-services - aws dynamodb - 如何按日期查询排序键
- python - 比较同一数据帧的两列并返回同一数据帧的不同列
- c# - 用于在 Blazor 和 JS 之间传递 DateTimeOffset 的自定义 Json 转换器。JS 属性 Input/Output 是不同的类型