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

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

;数据段
data segment
       car  db  238         ;阳泉学院字符图形表
       DB  2ah,238,0,0
       DB  2ah,238,1,0
       DB  2ah,238,1,0
       DB  2ah,238,1,0
       DB  2ah,238,1,0
       DB  2ah,238,1,0
       DB  2ah,238,1,0
       DB  2ah,238,1,0
       DB  2ah,238,1,0
       DB  2ah,238,1,0
       DB  2ah,238,1,0
       DB  2ah,238,1,0
       DB  2ah,238,1,0
       db  2ah,238,1,0
       DB  2ah,238,-13,1
       DB  2ah,238,0,1
       DB  2ah,238,0,1
       DB  2ah,238,0,1
       DB  2ah,238,1,0
       DB  2ah,238,1,0
       DB  2ah,238,1,0
       DB  2ah,238,1,0
       DB  2ah,238,1,0
       DB  2ah,238,1,0
       DB  2ah,238,1,0
       db  2ah,238,1,0
       DB  2ah,238,-4,-3
       DB  2ah,238,0,1
       DB  2ah,238,0,1
       DB  2ah,238,4,-2
       DB  2ah,238,0,1
       DB  2ah,238,0,1
       DB  2ah,238,0,3
       DB  2ah,238,-1,0
       DB  2ah,238,-1,0
       DB  2ah,238,-1,0
       DB  2ah,238,-1,0
       DB  2ah,238,-1,0
       DB  2ah,238,-1,0
       DB  2ah,238,-1,0
       DB  2ah,238,0,1
       DB  2ah,238,0,1
       DB  2ah,238,0,1
       DB  2ah,238,0,1
       DB  2ah,238,1,0
       DB  2ah,238,1,0
       DB  2ah,238,1,0
       DB  2ah,238,1,0
       DB  2ah,238,1,0
       DB  2ah,238,1,0
       db  2ah,238,1,0
       db  2ah,238,-4,-3
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,4,-2
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,-10,7
       db  2ah,238,0,1
       db  2ah,238,1,-3
       db  2ah,238,0,1
       db  2ah,238,1,-3
       db  2ah,238,0,1
       db  2ah,238,1,-1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,1,-8
       db  2ah,238,1,0 
       db  2ah,238,1,0 
       db  2ah,238,1,0 
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,-1,0
       db  2ah,238,-1,0
       db  2ah,238,-1,0
       db  2ah,238,1,-7
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,3,-1
       db  2ah,238,1,-4
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,1,-4
       db  2ah,238,1,0
       db  2ah,238,1,0
       db  2ah,238,1,0
       db  2ah,238,0,-2
       db  2ah,238,1,1
       db  2ah,238,-4,0
       db  2ah,238,1,-1
       db  2ah,238,1,-1
       db  2ah,238,1,-1
       db  2ah,238,1,-1
       db  2ah,238,-4,6
       db  2ah,238,1,1
       db  2ah,238,1,1
       db  2ah,238,1,1
       db  2ah,238,1,1
       db  2ah,238,-12,1
       db  2ah,238,-2,1
       db  2ah,238,1,0
       db  2ah,238,0,1
       db  2ah,238,-1,2
       db  2ah,238,0,1
       db  2ah,238,1,0
       db  2ah,238,0,1
       db  2ah,238,0,2
       db  2ah,238,0,1
       db  2ah,238,-1,0
       db  2ah,238,0,1
       db  2ah,238,3,-10
       db  2ah,238,-1,0
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,1,0
       db  2ah,238,1,-8
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,1,-1
       db  2ah,238,1,-1
       db  2ah,238,1,-1
       db  2ah,238,1,-4
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,1,-5
       db  2ah,238,1,1
       db  2ah,238,1,0
       db  2ah,238,1,0
       db  2ah,238,1,0
       db  2ah,238,1,-1
       db  2ah,238,-1,-1
       db  2ah,238,-13,8
       db  2ah,238,1,0
       db  2ah,238,1,0
       db  2ah,238,1,0
       db  2ah,238,1,0
       db  2ah,238,1,0
       db  2ah,238,1,0
       db  2ah,238,1,0
       db  2ah,238,1,0
       db  2ah,238,1,0
       db  2ah,238,1,0
       db  2ah,238,1,0
       db  2ah,238,1,0
       db  2ah,238,1,0
       db  2ah,238,1,0
       db  2ah,238,-14,1
       db  2ah,238,0,1
       db  2ah,238,1,0
       db  2ah,238,1,0
       db  2ah,238,1,0
       db  2ah,238,1,0
       db  2ah,238,1,0
       db  2ah,238,1,0
       db  2ah,238,1,0
       db  2ah,238,1,0
       db  2ah,238,-4,-1
       db  2ah,238,4,0
       db  2ah,238,-8,5
       db  2ah,238,0,1
       db  2ah,238,1,0
       db  2ah,238,0,1
       db  2ah,238,2,-4
       db  2ah,238,-1,0
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,1,0
       db  2ah,238,1,-2
       db  2ah,238,0,-1
       db  2ah,238,0,-1
       db  2ah,238,0,-1
       db  2ah,238,2,-1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,0,1
       db  2ah,238,1,-4
       db  2ah,238,1,0
       db  2ah,238,1,0
       db  2ah,238,1,0
       db  2ah,238,1,0
       db  2ah,238,1,-1
       db  2ah,238,1,-1
       db  2ah,238,1,-1
       db  2ah,238,-7,6
       db  2ah,238,1,0
       db  2ah,238,1,0
       db  2ah,238,1,0
       db  2ah,238,1,0
       db  2ah,238,1,1
       db  2ah,238,1,1
       db  2ah,238,1,1
char_cnt dw ?
pointer  dw ?
line_on  db ?
col_on   db ?
data     ends
;堆栈段
stack  segment
     db  2000 dup (0)
stack  ends
;代码段
code segment
     assume cs:code,ds:data
main proc far
     push ds
     sub 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          ;初始化DS
     mov ds,ax
     mov ah,0             ;设置300*200彩色图形方式
     mov al,3
     int 10h
     mov ah,0bh           ;设置背景颜色
     mov bh,0
     mov bl,2
     int 10h
     mov ah,0bh           ;设置彩色调板
     mov bh,01
     mov bl,00
     int 10h
     call 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 21h
     cmp al,0dh				;字符=CR(回车)就跳转exit
     je exit				
exit:mov ah,4ch				;带返回码的结束,返回码在al中
     int 21h
     ret
main endp
clear_screen proc near    ;清屏子程序
     push ax              ;保护寄存器
     push bx
     push cx
     push dx
     mov ah,6             ;屏幕上卷功能,Scrolls a specified window up 
							;     <dist>	  8-bit number of lines to scroll; positive
							;			  scrolls down; negative scrolls up; 0 clears.
							;	      <attr>	  8-bit attribute for blank lines; if none
							;			  given, 07h (white on black).
							;	      <upcol>	  Upper left column; if none given, CL used.
							;	      <uprow>	  Upper left row; if none given, CH used.
							;	      <dncol>	  Lower right column; if none given, DL used.
							;	      <dnrow>	  Lower right row; if none given, DH used.
     mov al,6
     mov ch,0             ;左上角行号
     mov cl,0             ;左上角列号
     mov dh,250           ;右下角行号
     mov dl,200           ;右下角列号
     mov bh,7             ;卷入行属性
     int 10h              ;调用显示功能
     pop dx               ;恢复寄存器
     pop cx
     pop bx
     pop ax
     ret                  ;返回主程序
clear_screen endp
move_shape proc near		
     push ax				;保护现场
     push bx
     push cx
     push dx
     push di
     mov ah,0fh           ;取当前显示方式
     int 10h
     sub ch,ch            ;清除寄存器CX的高字节
     mov cl,[di]          ;CL放循环次数
     inc di               ;di指向字符表的第一个字符
     mov char_cnt,cx      ;保存循环次数
     mov pointer,di
     mov line_on,dh
     mov 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 dx
     pop cx
     pop bx
     pop ax
     ret
mov_crsr:
     mov ah,2             ;移动光标位置           
     int 10h
     mov al,[di]
     mov bl,[di+1]        ;取字符值及属性
     push cx
     mov cx,1
     mov ah,09            ;显示字符
     int 10h
     pop cx
     add di,4             ;di指向下一个字符
     loop plot_next
     call 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_on
     mov dl,col_on
erase_next:
     add dh,[di+2]
     add dl,[di+3]
     mov ah,2
     int 10h
     mov al,[di]
     mov bl,0
     push cx
     mov cx,1
     mov ah,9
     int 10h
     pop cx
     add di,4
     loop erase_next
     mov cx,char_cnt		;在下一行开头恢复内容
     mov di,pointer
     mov dh,line_on
     inc col_on
     mov dl,col_on
     ret
erase endp
dly_qrtr proc near         ;延时子程序
     push cx
     push dx
     mov dx,50000			;延时50000*8000个cpu周期
 d11:mov cx,8000
 d12:loop d12
     dec dx
     jnz d11
     pop dx
     pop cx
     ret
dly_qrtr endp
code ends
     end 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。

猜你喜欢

转载自blog.csdn.net/hairi1234/article/details/85336218