代码之家  ›  专栏  ›  技术社区  ›  Alex Pliutau

汇编程序mov问题

  •  1
  • Alex Pliutau  · 技术社区  · 14 年前

    我有下一个代码:

    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 回复  |  直到 10 年前
        1
  •  4
  •   starblue    14 年前

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

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

        2
  •  1
  •   loxxy    14 年前

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

        3
  •  0
  •   Lazarus    14 年前

    段寄存器用于控制寄存器指令使用的内存段,因此,您最不希望的事情是从内存位置加载段寄存器(在本例中为数据段寄存器)。修改DS的动作可导致在更新DS的过程中被读取的存储器位置改变,即,加载到DS中的第一位/字节现在导致它在剩余部分被读取之前指向另一段。将值读入累加器(AX)或另一个通用寄存器更安全,因此,现在将值加载到段寄存器时,该值就在处理器中,因此在加载过程中不存在值损坏的可能性。