汇编程序设计:字符图形程序阳泉学院

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

;数据段
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。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部