1

我有下一个代码:

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

谢谢!

4

3 回答 3

4

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

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

不为所有可能的移动提供指令的原因是为了减小指令集的大小,以便指令占用更少的内存。总体而言,分两步进行很少需要的动作会更有效。

于 2010-09-11T08:01:00.607 回答
1

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

So if you try to directly pass the data to the special register (ds or data segment here) it will not work correctly as it does not know to accept data that way. So we first get that 'number' or the point in memory location where data starts & pass that point to ds register.

于 2010-09-11T08:17:52.680 回答
0

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

段寄存器用于控制寄存器指令使用哪个内存段,因此您最不想做的就是从内存位置加载段寄存器(在这种情况下为 DS 是数据段寄存器)。修改 DS 的行为可能会导致正在读取的内存位置在更新 DS 的过程中发生变化,即加载到 DS 中的第一个比特/字节现在导致它在读取其余部分之前指向另一个段。将值读入累加器 (AX) 或其他通用寄存器更安全,因此现在该值在加载到段寄存器时就在处理器中,因此在加载过程中值不会被破坏。

于 2010-09-11T07:26:30.157 回答