【问题标题】:CONCEPT OF MOV AX,CS and MOV DS,AXMOV AX、CS 和 MOV DS、AX 的概念
【发布时间】:2011-07-18 20:49:45
【问题描述】:

谁能解释一下这三个指令的作用?

  ORG 1000H 
  MOV AX,CS
  MOV DS,AX

理论上我知道代码、数据和额外段是什么,但是:

  1. 它们是如何在这个程序中实现的?

  2. 为什么将整个片段移到另一个片段中? (MOV AX,CSMOV DS,AX

这两条指令究竟做了什么

我可以理解这段代码中所有其他指令的含义,除了突出显示的 3 条指令。

(程序运行良好。它接受输入直到 0 被击中——有一个 mov ah,01h 和一个 int 21h,然后它将 al'0' 进行比较,如果 al'0',它跳转到last,否则跳转到back。)

    ASSUME CS:CODE        
    CODE SEGMENT 
    ORG 1000H
    MOV AX,CS
    MOV DS,AX
BACK:
    MOV AH,01H
    INT 21H
    CMP AL,'0'
    JZ LAST
    JMP BACK
LAST:
    MOV AX,4C00H
    INT 21H
    CODE ENDS

    END

(编者注:.com 程序在偏移量100h 处加载,所有段寄存器设置为彼此相等。org 1000h 可能是org 100h 的拼写错误,因为这看起来像.com 程序。这个程序不会中断,因为它不使用任何绝对地址,只使用相对跳转。)

【问题讨论】:

  • 当 DOS 程序启动时,段寄存器 DS 和 ES 指向 256 字节长的结构,称为 PSP。您(程序员)需要将 DS 设置为指向您的数据段(与 TINY 内存模型中的代码段相同)。这就是从 CS 加载 DS 的原因。顺便说一句,这个简单的程序不使用任何内存变量,所以它可以完全不使用 DS。

标签: assembly x86-16 real-mode memory-segmentation


【解决方案1】:

你做不到

MOV DS, CS

这是一个无效操作(masm 32:error A2070: invalid instruction operands)。

MOV AX, CS
MOV DS, AX

这两条指令的执行与mov ds, cs 相同(无效)。这样,汇编程序就很高兴并且不会抱怨。但是我不能告诉你为什么程序员要数据段和代码段一样

【讨论】:

  • 是的,你能解释一下 MOV AX,CS 和 MOV DS,AX 的含义吗
  • 我可以理解 MOV DS,CS 是不允许的。但是你能告诉我MOV AX,CS的概念吗
  • @Muthu:“概念”只是“将cs 寄存器的值复制到ds 寄存器中”。这就是mov 所做的一切。哪一部分不清楚?
  • @MuthuGanapathyNathan MOV 指令不能用于加载 CS 寄存器。尝试这样做会导致无效的操作码异常 (#UD)。要加载 CS 寄存器,请使用 far JMP、CALL 或 RET 指令。
【解决方案2】:

要真正解释这个概念,我们必须回到段的基本概念,以及 x86 如何使用它们(在实模式下)。

8086 有 20 位寻址,但只有 16 位寄存器。为了生成 20 位地址,它将段与偏移量组合在一起。段必须在段寄存器(CS、DS、ES 或 SS)中。然后生成一个偏移量(作为立即数,或者另一个或两个寄存器的内容。

因此,为了生成地址,将一个 16 位的段寄存器左移 4 位,然后将某个其他寄存器中的 16 位偏移量添加到该地址中,然后将总和实际用作地址。大多数指令都附加了一个默认段——pushpop 以及与bp 相关的任何内容都将使用ss。跳转等使用cs。一些字符串指令es(例如scans)和一些使用两个段——例如,movsd将数据从[ds:si]复制到[es:di]。大多数其他指令使用ds。您还可以使用段覆盖来显式指定地址,例如es:bx

在任何情况下,在您可以有意义地使用段寄存器之前,您首先必须使用您关心的数据的地址(前 16 位)加载它。一个典型的“小模型”程序会以这样的方式开始:

mov ax, @Data
mov ds, ax

在微型模型中,您对数据和代码使用相同的段。为了确保它引用了正确的段,您需要从 CS 获取 16 位并将其复制到 DS。正如许多其他人所提到的,没有将 CS 直接移动到 DS 的指令。问题提到了一种可能性;另一个常见的是:

push cs
pop ds

【讨论】:

    【解决方案3】:

    ORG 1000H 告诉汇编器后面的代码应该放在代码映像中的偏移 1000H 处。

    另外两条指令将 CS 复制到 DS。它不是复制段本身,只是更新指向数据段的指针。对于小程序(

    需要这两个指令序列,因为“MOV DS,CS”不是合法的 8086 指令。

    【讨论】:

    • 是的。我是组装新手。你能详细解释一下吗?(如果你不介意的话)
    • @Muthu:听起来您应该阅读一些有关该主题的标准资源。 SO 答案非常适合回答明确定义的特定问题,但如果您需要详细解释所有内容,则不然。不要让别人为你做你的学习
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 2015-11-27
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多