我有下一个代码:
mov ax,@data
mov ds,ax
为什么我不能这样写?
mov ds,@data
所有来源:
.MODEL small
.STACK 100h
.DATA
HelloMessage DB 'Hello, world',13,10,'$'
.CODE
.startup
mov ax,@data
mov ds,ax
mov ah,9
mov dx,OFFSET HelloMessage
int 21h
mov ah,4ch
int 21h
END
谢谢!
答案 0 :(得分:4)
您不能,因为指令集不包含执行此操作的指令。它只是x86的众多特性之一。
这种限制对于汇编语言来说是相当正常的。大多数体系结构都包含一些经过特殊处理的寄存器(例如处理器状态字),但通常比x86体系结构要少。
不提供所有可能移动指令的原因是减小指令集的大小,以便指令占用更少的内存。总的来说,通过两个步骤进行很少需要的移动效率更高。
答案 1 :(得分:1)
通用寄存器,因为'ax'用于保存指向数据的16位数字(在您的情况下是DATA中的字符串)
因此,如果您尝试将数据直接传递到特殊寄存器(此处为ds或数据段),它将无法正常工作,因为它不知道以这种方式接受数据。所以我们首先得到“数字”或数据开始的内存位置点&将该点传递给ds寄存器。
答案 2 :(得分:0)
我不是专家,但这就是我理解这个约束的方法。
段寄存器用于控制寄存器指令使用哪个存储器段,因此您最不希望的是从存储器位置加载段寄存器(在本例中为DS,即数据段寄存器) 。修改DS的动作可能导致读取存储器位置在更新DS的过程中发生变化,即加载到DS中的第一个比特/字节现在使其在读取剩余部分之前指向另一个分段。将值读入累加器(AX)或其他通用寄存器更安全,所以现在当加载到段寄存器中时,该值在处理器中,因此在加载期间值不会被破坏。