中断调用与子程序设计实验

dos中断的指令:int
中断处理程序入口程序CS:IP
中断号*4 例:int 21h 21h*4=84h (低字存放IP,高字存放CS)
则中断指令的入口地址 IP存放0084h,0085h
入口地址CS存放0086H 0087H
中断调用 INT 21H
DOS中断调用步骤
第一步:置入口参数
第二步:功能号送AH
第三步:执行 INT 21H
(1)1号功能 键盘输入
格式:MOV AH, 1
INT 21H
功能:接收键盘输入1个字符,保存在AL寄存器中。
(2)2号功能 屏幕输出
格式:
MOV DL, 输出字符的ASCII
MOV AH,2
INT 21H
(3)5号功能 打印机输出
格式:MOV DL, 输出字符的ASCII
MOV AH,5
INT 21H
(4)9号功能 屏幕输出字符串
格式:LEA DX, 字符串变量名
MOV AH,9
INT 21H
功能:屏幕显示一串字符
(5)10号功能(0AH号)从键盘输入一串籽符串保存在变量缓冲区中
格式:LEA DX, 字符串变量名
MOV AH,10
INT 21H
(6)4CH号功能 程序结束返回DOS
格式:MOV AH,4CH
INT 21H
实验1: 从键输入一串字符“I am student. ”,屏幕显示回车换行后,输出该串字符。

Data  segment
A  db  20, 0, 20 dup('$')
Data  ends
Code segment
Assume  cs:code, ds:data
Start:mov ax,data
Mov ds,ax
Lea dx,a  
Mov ah,  10 
Int 21h
Mov dl,0dh  
Mov ah,2
Int 21h
Mov dl,0ah   
Mov ah,2
Int 21h
Lea  dx, a+2  
Mov  ah,9
Int 21h
Mov ah, 4ch
Int  21h
Code ends
    End  start

(2) BIOS 中断调用(略)P116
(3)8086段内调用子程序设计实验
子程序调用格式: CALL 子程序名
子程序返回语句: RET
实验2: 主程序显示字符串‘ABC’,主程序调用子程序sub1,子程序sub1的功能是显示字符‘X’(段内调用),本例中主程序与子程序在同一段中

data segment
a db 'ABC$'
data ends
code segment 
assume cs:code,ds:data
start:mov ax,data
mov ds,ax
lea dx,A
mov AH,9
int 21h
call sub1
mov ah,4ch
int 21h
sub1 proc
mov dl,'X'
mov ah,2
int 21h
ret
sub1 endp
code ends
end start

实验3:主程序main.asm段间(主程序与子程序以不同文件名存于磁盘中)调用子程序sub1.asm实验步骤
主程序运行结果为’ABC’,子程序运行结果为‘X’。

EXTRN  SUB1:FAR
DATA  SEGMENT
A  DB 'ABC$'
DATA  ENDS
STACK  SEGMENT  PARA  STACK 'STACK'
DW 100 DUP(?)
STACK  ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:STACK
START:MOV AX,DATA
        MOV DS,AX
        LEA  DX, A
        MOV AH,9
        INT 21H
        CALL  SUB1
        MOV AH,4CH
        INT 21H
       CODE  ENDS
              END  START
PUBLIC  SUB1
CODE  SEGMENT
SUB1 PROC  FAR
ASSUME  CS:CODE
  ST1:MOV DL,'X'
       MOV AH,2
       INT 21H
       RET
 SUB1  ENDP
CODE ENDS
      END ST1

执行的指令如下:
先汇编main.asm和sub1.asm文件
在分别连接main.obj和sub1.obj文件
最后运行main.exe可执行文件即可。
实验4:
将main和sub1程序清单放在同一个文件里面,使用段间调用来实现主程序调用子程序=_=

code1 segment                   
      assume cs:code1
      main  proc   far           
           push dx
           mov ax,0
           push ax
           mov dl,'A'           
           mov ah, 2
            int 21h
            call  far  ptr  sub1  
            ret
main endp                      
code1  ends                     
code2 segment                    
      assume cs:code2
      sub1  proc  far            
      push ds
      xor ax,ax
      push ax
      mov dl,'B'                  
      mov ah,2
      int 21h
      ret
      sub1  endp                 
code2 ends
end      
posted @ 2016-05-20 15:15  __NaCl  阅读(307)  评论(0编辑  收藏  举报