【发布时间】:2011-07-18 20:49:45
【问题描述】:
谁能解释一下这三个指令的作用?
ORG 1000H
MOV AX,CS
MOV DS,AX
理论上我知道代码、数据和额外段是什么,但是:
它们是如何在这个程序中实现的?
为什么将整个片段移到另一个片段中? (
MOV AX,CS和MOV 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