DOS、BIOS调用
实验目的
- 学习掌握DOS、BOIS调用方法
- 学会编制实用小程序
实验内容
编一程序,将这些ASCII码表示的字符以16行16列的表格形式显示出来,要求显示时按ASCII码的递增顺序分行显示(即行内ASCII码依次递增,与ASCII表中给出的表格行、列位置正好倒置)。每行、相邻的两字符间由空白符(ASCII码00)或空格(ASCII码20H)分开,只要求显示出字符,不要画出表格线。
实验代码
dos调用
CRLF MACRO
MOV DL,0DH
MOV Ah,02H
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H
ENDM ;定义宏功能用于换行
data segment
data ends
stack segment stack 'stack'
STA db 128 dup(?)
TOP EQU LENGTH STA
stack ends
code segment
ASSUME cs:code,ds:data,ss:stack
START:;初始化相关寄存器
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,TOP
mov bl,0;bl中存放要打印字符的ASCII码
mov cx,16;设置外层循环次数,即行数
outer:
push cx
mov cx,16;设置内层循环次数,即列数
inner:
cmp bl,0AH;判断是否为换行符
jz change
cmp bl,0DH;判断是否为回车符
jz change
mov dl,bl;将bl->dl用于显示
show:
mov ah,2
int 21H;调用dos21h中断的2号子功能输出字符
mov dl,0
int 21H;输出空格间隔
inc bl;下一个字符ascii码
loop inner
CRLF;宏换行
pop cx
loop outer
mov ax,4C00H;退出程序
int 21H
change:;若为特殊字符则将其替换为0
mov dl,0
jmp show
code ends
end START
bios调用
data segment
data ends
stack segment stack 'stack'
STA db 128 dup(?)
TOP EQU LENGTH STA
stack ends
code segment
ASSUME cs:code,ds:data,ss:stack
START:;初始化相关寄存器
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,TOP
call CleanScreen;调用子程序清空屏幕
mov bl,0;bl中存放要打印字符的ASCII码
mov dh,0;设置行号
outer:
mov dl,0;设置列号
inner:
mov ah,02H
int 10H;调用bios中断设置光标位置
cmp bl,0AH;判断是否为换行符
jz change
cmp bl,0DH;判断是否为回车符
jz change
mov al,bl;将bl->al用于显示
show:
mov cl,1;设置输出字符字数
mov ah,0AH
int 10H;调用bios中断输出字符
inc dl;列号+1
inc bl;下一个字符ascii码
mov ah,02H
int 10H
mov al,0
mov ah,0AH
int 10H;输出空格间隔
inc dl;列号+1
cmp dl,32;判断一列是否完成
jnz inner
inc dh
cmp dh,16;判断行数是否达标
jnz outer
mov ax,4C00H
int 21H;结束程序
change:;若为特殊字符则将其替换为0
mov al,0
jmp show
;CleanScreen清空屏幕,便于输出
CleanScreen PROC
;保存现场
push bx
push cx
push dx
push es
mov bx,0b800h
mov es,bx
mov bx,0
mov dx,0700h
mov cx,2000
clearScreen:
mov es:[bx],dx
add bx,2
loop clearScreen
;恢复现场
pop es
pop cx
pop dx
pop bx
ret
CleanScreen ENDP
code ends
end START
运行结果
dos调用
bios调用