INT20H

来源:互联网 发布:java中获取unix时间戳 编辑:程序博客网 时间:2024/04/30 21:33

DOS中断INT20H的功能是结束程序并返回DOS。 
  入口参数:CS=程序段前缀(PSP)的段地址。 IP=0000H。 
  出口参数:无。 
  问题: (1) 程序段前缀PSP的概念。 
      (2) 不能直接给CS、IP赋值,如何指定入口参数? 

1、 程序的执行过程 

 

//search out-->Build PSP in main memory-->loading-->set DS, ES (CS,SS)-->executing


    在DOS提示符,如C:>下,键入一个可执行文件名(COM、EXE)后,在运行该程序前,DOS完成以下工作: 
    (1) 从磁盘中找到该文件。 
    (2) 检测用户可用内存,在可用内存的低地址段建立一个程序段前缀(PSP,Program Segment Prefix)。 
    (3) 把该文件从磁盘上装入内存中PSP的后面。 
    (4) DOS设置DS、ES的值等于PSP的段地址。如果该程序为COM文件,则把CS、SS的值也设置为PSP的段地址。
    (5) 开始执行该文件的第一条指令。


2、 程序段前缀PSP 
    DOS运行程序时,需要该程序的一系列参数(如,程序结束地址、Ctrl_Break处理程序的地址、出错处理地址等),另外还需要一个磁盘读、写的缓冲区,这个参数区和缓冲区,称为"程序段前缀(PSP)"。 PSP共有256字节,它是运行程序时,由DOS自动在内存中建立的。 PSP的结构下图所示:
注意:
  (
1)、PSP起始两字节存放"INT 20H"指令的机器码(CDH 20H),该指令使程序返回DOS;
  (2)、EXE程序刚运行时,DS和ES指向PSP首址,即INT20H指令的机器码:COM程序刚运行时,DS,ES,CS,SS均指向PSP首址。

 


  在PSP结构中,我们只关心前两个字节,它是指令"INT 20H"的机器码(CDH、20H)。 

 

 

 

 

 

 

 

 

 

3、 INT20H(结束程序的另一种方法)   

 

例1、
   ;
   ;该程序在屏幕上显示一字符串"Hello,World!"。 
   ; 
 DATA SEGMENT 
  Message DB 'Hello,World!', 0DH, 0AH, '$' 
  DATA ENDS 
 STACK SEGMENT STACK 
   DW 100H DUP (0) 
 STACK ENDS 
 CODE SEGMENT 
   ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK 
 MAIN PROC FAR 
START:PUSH DS 
    MOV,AX,0 
    PUSH AX 
    MOV DX,OFFSET Message 
    MOV AH,09H 
    INT 21H 
EXIT:RET 
   MAIN ENDP 
  CODE ENDS 
  END START

 

(1) 在程序执行前,DS=程序段前缀PSP的段地址,因此, 
     PUSH DS 
     MOV AX,0 
     PUSH AX 
  这三条指令,把PSP的段地址和0值推入堆栈。 
 (2) RET指令从堆栈中取出两字,送CS和IP,因此,RET指令执行时,CS=PSP的段地址,IP=0000H。CPU转移到PSP处执行。
 (3) PSP处的指令是INT 20H,它的功能是结束程序并返回DOS,因此,该程序能正确返回DOS。
原创粉丝点击