系统把.EXE程序从磁盘装入存储器时,装入程序是按以下步骤执行的:
1. 从磁盘取.EXE文件
2. 在可用内存储器的一个小段边界上,构造一个256字节(100H)的程序段前缀(PSP)
3. 紧随PSP的下一个地址。把程序装入存储器中
4. 把PSP的地址装入DS与ES寄存器
5. 把代码段地址装入CS寄存器并把IP寄存器设置成代码段中第一条指令的偏移值(通常是0)
6. 把堆栈段地址装入SS寄存器并把SP寄存器设置成堆栈大小
7. 传送控制给要执行的程序,通常从代码段的第一条指令开始
程序的装入程序将CS:IP SS:SP正确的初始化。程序的装入程序在DS和ES中都存放了PSP的地址,而在这些寄存器中你的程序需要数据段的地址
汇编代码
TITLE hello (EXE)
.MODEL SMALL
.STACK 64
.DATA
MSG DB 'hello, lts', '$'
.CODE
MAIN PROC NEAR
MOV AX, @data
MOV DS, AX
PUSH AX
MOV AH, 09H
LEA DX, MSG
INT 21H
MAIN ENDP
END MAIN
寄存器和执行状态
-r
AX=0000 BX=0000 CX=0019 DX=0000 SP=0040 BP=0000 SI=0000 DI=0000
DS=0B46 ES=0B46 SS=0B58 CS=0B56 IP=0000 NV UP EI PL NZ NA PO NC
0B56:0000 B8560B MOV AX,0B56
-t
AX=0B56 BX=0000 CX=0019 DX=0000 SP=0040 BP=0000 SI=0000 DI=0000
DS=0B46 ES=0B46 SS=0B58 CS=0B56 IP=0003 NV UP EI PL NZ NA PO NC
0B56:0003 8ED8 MOV DS,AX
-t
AX=0B56 BX=0000 CX=0019 DX=0000 SP=0040 BP=0000 SI=0000 DI=0000
DS=0B56 ES=0B46 SS=0B58 CS=0B56 IP=0005 NV UP EI PL NZ NA PO NC
0B56:0005 50 PUSH AX
-t
AX=0B56 BX=0000 CX=0019 DX=0000 SP=003E BP=0000 SI=0000 DI=0000
DS=0B56 ES=0B46 SS=0B58 CS=0B56 IP=0006 NV UP EI PL NZ NA PO NC
0B56:0006 B409 MOV AH,09
-t
AX=0956 BX=0000 CX=0019 DX=0000 SP=003E BP=0000 SI=0000 DI=0000
DS=0B56 ES=0B46 SS=0B58 CS=0B56 IP=0008 NV UP EI PL NZ NA PO NC
0B56:0008 8D160E00 LEA DX,[000E] DS:000E=6568
-t
AX=0956 BX=0000 CX=0019 DX=000E SP=003E BP=0000 SI=0000 DI=0000
DS=0B56 ES=0B46 SS=0B58 CS=0B56 IP=000C NV UP EI PL NZ NA PO NC
0B56:000C CD21 INT 21
-p
Hello, lts
AX=0924 BX=0000 CX=0019 DX=000E SP=003E BP=0000 SI=0000 DI=0000
DS=0B56 ES=0B46 SS=0B58 CS=0B56 IP=000E NV UP EI PL NZ NA PO NC
0B56:000E 68 DB 68