我有下面的代码:
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谢谢!
发布于 2010-09-11 16:01:01
您不能这样做,因为指令集不包含这样做的指令。这只是x86众多特性中的一个。
这些类型的限制对于汇编语言来说是相当正常的。大多数体系结构都包含一些特殊处理的寄存器(例如处理器状态字),但通常少于x86体系结构。
不为所有可能的移动提供指令的原因是为了减小指令集的大小,以便指令占用更少的内存。总体而言,在两个步骤中执行很少需要的动作会更有效率。
发布于 2010-09-11 16:17:53
作为'ax‘的通用寄存器被设计用来保存指向数据的16位数字(在你的例子中是数据中的字符串)
因此,如果您尝试将数据直接传递到特殊寄存器(这里是ds或数据段),它将无法正常工作,因为它不知道以这种方式接受数据。因此,我们首先获取'number‘或内存位置中数据开始点,并将该点传递到ds寄存器。
发布于 2010-09-11 15:26:30
我不是专家,但这就是我理解这种约束的方式。
段寄存器用于控制寄存器指令使用的内存段,因此,您最不希望做的事情就是从内存位置加载段寄存器(在本例中为DS,即数据段寄存器)。修改DS的动作可导致在更新DS的过程中被读取的存储器位置改变,即,现在加载到DS中的第一位/字节使其在剩余部分被读取之前指向另一段。将值读入累加器(AX)或其他通用寄存器更安全,因此现在值在加载到段寄存器时就在处理器中,因此在加载过程中不会出现值损坏的情况。
https://stackoverflow.com/questions/3690157
复制相似问题