《汇编语言》课程设计1,第一部分:只显示年份,我改写了程序,用常量来设置年份显示的参数,使子程序使用更加灵活。
org 0100h
codeStart:
mov ax,cs
mov ds,ax
mov ss,ax
screenLength = 0A0h
yearLength = 6
showSpace = 5
showColor = 01001010b
call yearShow
jmp $
mov ax,4c00h
int 21h
codeEnd:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;年份显示子程序,接收四个参数: ;
;yearLength为年份位数 ;
;screenLength为屏幕宽度 ;
;showSpace为显示起始位置 ;
;showColor为显示的颜色属性 ;
; ;
yearShow: ;
mov di,0 ;设置di为年份字符存放区的偏移量指针,初始值指向yearArrayStart
mov si,showSpace*2 ;设置si为屏幕缓冲区的偏移量指针,初始值指向0B800:(0000h+空格数)
mov dx,0 ;设置dx为年份字符计数器,每到4个字符,也就是完整的显示一个年份后,进行换行
mov cx,yearArrayEnd-yearArrayStart ;设置charShow@循环次数为所有年份的字符数量
;
charShow@: ;charShow@循环,将年份字符存放区的所有年份显示到屏幕上
push ds ;保存ds数据段寄存器入栈,保护原数据段现场
push cx ;保存cx循环次数入栈,保护循环次数
mov bx,yearArrayStart ;ds:bx数据段指针指向年份存放区起始位置
mov al,[bx+di] ;将ds:(bx+di)指针指向的年份字符ASCII值存入al中
mov ah,showColor ;将字符显示属性存入ah中
inc di ;di数据段指针偏移量加1,指向下一个年份字符
;
push bx ;保存数据段指针bx入栈,保护原数据段指针指向
mov bx,0B800h ;设置bx为中间变量0B800h
mov ds,bx ;将bx中的数值赋给ds,将数据段指向屏幕缓冲区
mov bx,0 ;将数据段指针新指向屏幕缓冲区起始位置0B800:0000h
mov [bx+si],ax ;将al中保存的字符ASCII值,ah中保存的字符属性 放入屏幕缓冲区显示
;
add dx,1 ;年份字符数计数器加1
push dx ;保存计数器中的值入栈
mov ax,dx ;放入ax中,做被除数
mov dl,yearLength ;将年份长度放入dl中,作为除数
div dl ;将年份字符计数器的值处以年份长度,判断是否完整显示了一个年份
mov al,ah ;将余数给ax
xor ah,ah ;清空ah
mov cx,ax ;将年份字符余数放入cx,作为换行跳转判断依据
jcxz nextLine@ ;余数为0则跳转到换行处
jmp nextChar@ ;如果余数不为0,则一个年份没显示完整,跳转到正常的下一个字符显示位置
nextLine@: ;
add si,screenLength-yearLength*2 ;换行子程序
nextChar@: ;
add si,2 ;正常将屏幕缓冲区指针指向下一个字符显示处
;
pop dx ;恢复dx为年份字符数寄存器的值
pop bx ;恢复数据段指针bx的值,指向下一个年份数据存放区的年份字符
pop cx ;恢复循环次数cx
pop ds ;恢复数据段寄存器ds的值
loop charShow@ ;判断cx中的数值,如不为0则调用charShow@循环,继续显示字符,为0则结束循环,往下执行
;
ret ;子程序结束,返回call
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
yearArrayStart:
db '197501','197601','197701','197801','197901','198001'
db '198101','198201','198301','198401','198501'
db '198601','198701','198801','198901','199001'
db '199101','199201','199301','199401','199501'
yearArrayEnd:
incomeArrayStart:
dd 16,22,382,1356,2390,8000
dd 16000,24486,50065,97479,140417
dd 197514,345980,590827,803530,1183000
dd 1843000,2759000,3753000,4649000,5937000
incomeArrayEnd:
employeArrayStart:
dw 3,7,9,13,28,38
dw 130,220,476,778,1001
dw 1442,2258,2793,4037,5635
dw 8226,11542,14430,15257,17800
employeArrayEnd:
阅读(2290) | 评论(0) | 转发(0) |