汇编实验5 DOS、BIOS调用

DOS、BIOS调用

实验目的

  1. 学习掌握DOS、BOIS调用方法
  2. 学会编制实用小程序

实验内容

编一程序,将这些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调用
汇编实验5 DOS、BIOS调用
bios调用
汇编实验5 DOS、BIOS调用

上一篇:C#调用托管ocx、dll


下一篇:Linux apmsleep 命令