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