【发布时间】:2015-11-27 14:25:11
【问题描述】:
我正在尝试分配变量来注册这里是代码:
ORG 100h
var1 DB 10 ;
var2 DB 20 ;
MOV BX,var1 ; error : operands do not match: 16 bit register and 8 bit address
RET
END
但如果将第 4 行换成:
MOV BL, var1;
它有效。所以我的问题是为什么不能我将8位变量移动到更大的16位寄存器?
我已经提到了this、this 和this OP,但它没有回答我的问题。
注意:
- 我使用的是emu8086汇编器
- 我是汇编语言的新手,如果这是一个愚蠢的问题,我深表歉意。
【问题讨论】:
-
您需要使用
movzx或movsx分别以零或符号扩展名移动。它可能在 8086 中不可用,在这种情况下,您需要像您所做的那样移动到BL并自己将BH归零。至于为什么:因为他们以这种方式创建架构:) -
@Jester:不是,只是 cbw。我更新了stackoverflow.com/tags/8086/info 标签wiki,其中包含一个指向维基百科的链接,其中包含一个何时引入各种指令的表格。还有一个关于在 16 位 8086 上学习 asm 是多么愚蠢的谩骂。但无论如何,缺少一些主要的 insns 8086 是 movzx/sx 和
bt*bit-manip。 -
投票只是因为该错误消息措辞不当且具有误导性。
-
顺便说一句,这实际上 是与您链接的 stackoverflow.com/questions/15540450/… 的副本。那里的答案没有试图解释为什么它是一个错误,并且 movzx 在 8086 上不起作用,但仍然如此。投票关闭它作为这个的副本,因为这个有更详细的答案。
标签: assembly x86 x86-16 emu8086