编一程序,将这些ASCII码表示的字符以16行16列的表格形式显示出来,要求显示时按ASCII码的递增顺序分行显示(即行内ASCII码依次递增,与ASCII表中给出的表格行、列位置正好倒置)。每行、相邻的两字符间由空白符(ASCII码00)或空格(ASCII码20H)分开,只要求显示出字符,不要画出表格线。
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
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调用