系统把.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