Why does the initialization of the DS
and ES
registers has to be done manually by the programmer?
For example:
MOV AX, DTSEG
MOV DS, AX
On the other hand, the CS
and SS
registers are initialized by the operating system (in MS-DOS
). Why is this so?
Because CS
and SS
registers are essential for program execution in contrast to DS
and ES
registers which point to user-defined data segments. By default no data is present in the executing program this nothing to initialize the DS
and ES
with. As a program writer you can specify where your data is by setting the data segments registers.
Edit: as was correctly noted by @FrankKotler, in .com
file (the entire program size doesn't exceed single segment), DS
and ES
are initialized and equal to CS
. For other execution models, DS
and ES
are initialized by pointer to PSP
(which isn't the pointer to real user data).
The correct answer to your question (which i believe master V.Aghazarian has asked you in college) is not because CS ans SS are essential for program execution.
The problem in MS-DOS was with Program Segment Prefix
From wikipedia:
The segment address of the PSP is passed in the DS register when the program is executed. It can also be determined later by using Int 21h function 51h or Int 21h function 62h. Either function will return the PSP address in register BX.1