汇编程序设计:字符图形程序阳泉学院
程序说明:
本程序在文本显示方式下实现了显示字符图形“阳泉学院”。
按回车键即可返回操作系统。
函数图:

;数据段
data segmentcar db 238 ;阳泉学院字符图形表DB 2ah,238,0,0DB 2ah,238,1,0DB 2ah,238,1,0DB 2ah,238,1,0DB 2ah,238,1,0DB 2ah,238,1,0DB 2ah,238,1,0DB 2ah,238,1,0DB 2ah,238,1,0DB 2ah,238,1,0DB 2ah,238,1,0DB 2ah,238,1,0DB 2ah,238,1,0db 2ah,238,1,0DB 2ah,238,-13,1DB 2ah,238,0,1DB 2ah,238,0,1DB 2ah,238,0,1DB 2ah,238,1,0DB 2ah,238,1,0DB 2ah,238,1,0DB 2ah,238,1,0DB 2ah,238,1,0DB 2ah,238,1,0DB 2ah,238,1,0db 2ah,238,1,0DB 2ah,238,-4,-3DB 2ah,238,0,1DB 2ah,238,0,1DB 2ah,238,4,-2DB 2ah,238,0,1DB 2ah,238,0,1DB 2ah,238,0,3DB 2ah,238,-1,0DB 2ah,238,-1,0DB 2ah,238,-1,0DB 2ah,238,-1,0DB 2ah,238,-1,0DB 2ah,238,-1,0DB 2ah,238,-1,0DB 2ah,238,0,1DB 2ah,238,0,1DB 2ah,238,0,1DB 2ah,238,0,1DB 2ah,238,1,0DB 2ah,238,1,0DB 2ah,238,1,0DB 2ah,238,1,0DB 2ah,238,1,0DB 2ah,238,1,0db 2ah,238,1,0db 2ah,238,-4,-3db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,4,-2db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,-10,7db 2ah,238,0,1db 2ah,238,1,-3db 2ah,238,0,1db 2ah,238,1,-3db 2ah,238,0,1db 2ah,238,1,-1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,1,-8db 2ah,238,1,0 db 2ah,238,1,0 db 2ah,238,1,0 db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,-1,0db 2ah,238,-1,0db 2ah,238,-1,0db 2ah,238,1,-7db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,3,-1db 2ah,238,1,-4db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,1,-4db 2ah,238,1,0db 2ah,238,1,0db 2ah,238,1,0db 2ah,238,0,-2db 2ah,238,1,1db 2ah,238,-4,0db 2ah,238,1,-1db 2ah,238,1,-1db 2ah,238,1,-1db 2ah,238,1,-1db 2ah,238,-4,6db 2ah,238,1,1db 2ah,238,1,1db 2ah,238,1,1db 2ah,238,1,1db 2ah,238,-12,1db 2ah,238,-2,1db 2ah,238,1,0db 2ah,238,0,1db 2ah,238,-1,2db 2ah,238,0,1db 2ah,238,1,0db 2ah,238,0,1db 2ah,238,0,2db 2ah,238,0,1db 2ah,238,-1,0db 2ah,238,0,1db 2ah,238,3,-10db 2ah,238,-1,0db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,1,0db 2ah,238,1,-8db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,1,-1db 2ah,238,1,-1db 2ah,238,1,-1db 2ah,238,1,-4db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,1,-5db 2ah,238,1,1db 2ah,238,1,0db 2ah,238,1,0db 2ah,238,1,0db 2ah,238,1,-1db 2ah,238,-1,-1db 2ah,238,-13,8db 2ah,238,1,0db 2ah,238,1,0db 2ah,238,1,0db 2ah,238,1,0db 2ah,238,1,0db 2ah,238,1,0db 2ah,238,1,0db 2ah,238,1,0db 2ah,238,1,0db 2ah,238,1,0db 2ah,238,1,0db 2ah,238,1,0db 2ah,238,1,0db 2ah,238,1,0db 2ah,238,-14,1db 2ah,238,0,1db 2ah,238,1,0db 2ah,238,1,0db 2ah,238,1,0db 2ah,238,1,0db 2ah,238,1,0db 2ah,238,1,0db 2ah,238,1,0db 2ah,238,1,0db 2ah,238,-4,-1db 2ah,238,4,0db 2ah,238,-8,5db 2ah,238,0,1db 2ah,238,1,0db 2ah,238,0,1db 2ah,238,2,-4db 2ah,238,-1,0db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,1,0db 2ah,238,1,-2db 2ah,238,0,-1db 2ah,238,0,-1db 2ah,238,0,-1db 2ah,238,2,-1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,0,1db 2ah,238,1,-4db 2ah,238,1,0db 2ah,238,1,0db 2ah,238,1,0db 2ah,238,1,0db 2ah,238,1,-1db 2ah,238,1,-1db 2ah,238,1,-1db 2ah,238,-7,6db 2ah,238,1,0db 2ah,238,1,0db 2ah,238,1,0db 2ah,238,1,0db 2ah,238,1,1db 2ah,238,1,1db 2ah,238,1,1
char_cnt dw ?
pointer dw ?
line_on db ?
col_on db ?
data ends
;堆栈段
stack segmentdb 2000 dup (0)
stack ends
;代码段
code segmentassume cs:code,ds:data
main proc farpush dssub ax,ax push ax ;push ds;sub ax,ax;push ax 这三条语句是为后面的ret做准备,ret即执行pop ip, pop cs,执行完ip的值为0,cs的值为ds。程序转移到程序PSP的起始地址,起始地址的前两个字节放的是int 20指令,用于返回DOS。mov ax,data ;初始化DSmov ds,axmov ah,0 ;设置300*200彩色图形方式mov al,3int 10hmov ah,0bh ;设置背景颜色mov bh,0mov bl,2int 10hmov ah,0bh ;设置彩色调板mov bh,01mov bl,00int 10hcall clear_screen ;清屏,调用clear_screen函数lea di,car ;di指向字符图形表mov dh,5 ;从第5行第5列位置开始mov dl,5 ;显示汽车call move_shape ;调用move_shape函数mov ah,01h ;从键盘输入字符int 21hcmp al,0dh ;字符=CR(回车)就跳转exitje exit
exit:mov ah,4ch ;带返回码的结束,返回码在al中int 21hret
main endp
clear_screen proc near ;清屏子程序push ax ;保护寄存器push bxpush cxpush dxmov ah,6 ;屏幕上卷功能,Scrolls a specified window up ; 8-bit number of lines to scroll; positive; scrolls down; negative scrolls up; 0 clears.; 8-bit attribute for blank lines; if none; given, 07h (white on black).; Upper left column; if none given, CL used.; Upper left row; if none given, CH used.; Lower right column; if none given, DL used.; Lower right row; if none given, DH used.mov al,6mov ch,0 ;左上角行号mov cl,0 ;左上角列号mov dh,250 ;右下角行号mov dl,200 ;右下角列号mov bh,7 ;卷入行属性int 10h ;调用显示功能pop dx ;恢复寄存器pop cxpop bxpop axret ;返回主程序
clear_screen endp
move_shape proc near push ax ;保护现场push bxpush cxpush dxpush dimov ah,0fh ;取当前显示方式int 10hsub ch,ch ;清除寄存器CX的高字节mov cl,[di] ;CL放循环次数inc di ;di指向字符表的第一个字符mov char_cnt,cx ;保存循环次数mov pointer,dimov line_on,dhmov col_on,dl
plot_next:add dh,[di+2] ;改变行列指针add dl,[di+3]cmp dl,150 ;出屏否?jb mov_crsr ;出屏跳转mov_crsr函数call erase ;调用erase函数pop di ;恢复现场pop dxpop cxpop bxpop axret
mov_crsr:mov ah,2 ;移动光标位置 int 10hmov al,[di]mov bl,[di+1] ;取字符值及属性push cxmov cx,1mov ah,09 ;显示字符int 10hpop cxadd di,4 ;di指向下一个字符loop plot_nextcall dly_qrtr ;调用延时子程序call erase ;调用擦除子程序jmp short plot_next ;无条件跳转plot_next
move_shape endp
erase proc near ;擦除子程序,在下一行开头继续显示该内容mov cx,char_cnt ;保护内容mov di,pointer mov dh,line_onmov dl,col_on
erase_next:add dh,[di+2]add dl,[di+3]mov ah,2int 10hmov al,[di]mov bl,0push cxmov cx,1mov ah,9int 10hpop cxadd di,4loop erase_nextmov cx,char_cnt ;在下一行开头恢复内容mov di,pointermov dh,line_oninc col_onmov dl,col_onret
erase endp
dly_qrtr proc near ;延时子程序push cxpush dxmov dx,50000 ;延时50000*8000个cpu周期d11:mov cx,8000d12:loop d12dec dxjnz d11pop dxpop cxret
dly_qrtr endp
code endsend main
参数传递
本题使用寄存器法进行参数传递,寄存器为AX,BX,CX,DX,DI。
中断向量计算
本题用到了10H、21H函数库的函数调用,入口地址为0:40h ,0:84h。
10H号函数库:CS=410h+2h=42h , IP=410h=40h 。中断向量为0:40H。
21H号函数库:CS=421h+2h=86h , IP=421h=84h 。中断向量为0:84h。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
