Assembly 为什么';MS-DOS是否初始化DS和ES寄存器?

Assembly 为什么';MS-DOS是否初始化DS和ES寄存器?,assembly,dos,intel,masm,x86-16,Assembly,Dos,Intel,Masm,X86 16,为什么DS和ES寄存器的初始化必须由程序员手动完成 例如: MOV AX, DTSEG MOV DS, AX 另一方面,CS和SS寄存器由操作系统初始化(在MS-DOS中)。为什么会这样?因为与指向用户定义数据段的DS和ES寄存器相比,CS和SS寄存器对于程序执行是必不可少的。默认情况下,执行程序中不存在任何数据,因此不需要初始化DS和ES。作为程序编写器,您可以通过设置数据段寄存器来指定数据的位置 编辑:正如@FrankKotler正确指出的那样,在.com文件中(整个程序大小不超过单个段)

为什么
DS
ES
寄存器的初始化必须由程序员手动完成

例如:

MOV AX, DTSEG
MOV DS, AX

另一方面,
CS
SS
寄存器由操作系统初始化(在
MS-DOS
中)。为什么会这样?

因为与指向用户定义数据段的
DS
ES
寄存器相比,
CS
SS
寄存器对于程序执行是必不可少的。默认情况下,执行程序中不存在任何数据,因此不需要初始化
DS
ES
。作为程序编写器,您可以通过设置数据段寄存器来指定数据的位置


编辑:正如@FrankKotler正确指出的那样,在
.com
文件中(整个程序大小不超过单个段),
DS
ES
被初始化并等于
CS
。对于其他执行模型,
DS
ES
通过指向
PSP
(不是指向真实用户数据的指针)的指针进行初始化。

您的问题的正确答案(我相信master V.Aghazarian在大学时问过您)并不是因为CS和SS对程序执行至关重要

MS-DOS的问题在于

来自维基百科:

当程序执行时,PSP的段地址在DS寄存器中传递。也可在以后使用Int 21h函数51h或Int 21h函数62h确定。任一函数都将返回寄存器BX中的PSP地址


哇!接下来,我想看到有人问一个关于穿孔卡片的问题:-)是的。我有很多穿孔卡片,几周前就解决了@Dave,对于Windows来说,这也是一个非常有效的问题,MS-DOS的哪个版本?在哪个硬件上?@John:你刚才问过MS-DOS在哪个硬件上运行吗?严格来说,ds和es是初始化的——指向PSP,而不是你的数据段(DOS不知道的是,你可以有多个,或者代码段中有数据)。在.com文件中,所有内容都在同一(PSP)段中,因此ds和es的初始化正确。