汇编程序mov问题

时间:2010-09-11 07:14:29

标签: assembly x86 instruction-set mov

我有下一个代码:

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

谢谢!

3 个答案:

答案 0 :(得分:4)

您不能,因为指令集不包含执行此操作的指令。它只是x86的众多特性之一。

这种限制对于汇编语言来说是相当正常的。大多数体系结构都包含一些经过特殊处理的寄存器(例如处理器状态字),但通常比x86体系结构要少。

不提供所有可能移动指令的原因是减小指令集的大小,以便指令占用更少的内存。总的来说,通过两个步骤进行很少需要的移动效率更高。

答案 1 :(得分:1)

通用寄存器,因为'ax'用于保存指向数据的16位数字(在您的情况下是DATA中的字符串)

因此,如果您尝试将数据直接传递到特殊寄存器(此处为ds或数据段),它将无法正常工作,因为它不知道以这种方式接受数据。所以我们首先得到“数字”或数据开始的内存位置点&将该点传递给ds寄存器。

答案 2 :(得分:0)

我不是专家,但这就是我理解这个约束的方法。

段寄存器用于控制寄存器指令使用哪个存储器段,因此您最不希望的是从存储器位置加载段寄存器(在本例中为DS,即数据段寄存器) 。修改DS的动作可能导致读取存储器位置在更新DS的过程中发生变化,即加载到DS中的第一个比特/字节现在使其在读取剩余部分之前指向另一个分段。将值读入累加器(AX)或其他通用寄存器更安全,所以现在当加载到段寄存器中时,该值在处理器中,因此在加载期间值不会被破坏。