荣誉值:0
信誉值:0
注册日期:2010-11-21 12:54 |
assume cs:codesg,ds:datasg
datasg segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11452,14430,15257,17800
datasg ends
data segment
db 8 dup (0)
data ends
stack segment
dw 50 dup (0)
stack ends
codesg segment
start: mov ax,0b800h
mov es,ax
mov dh,0
mov dl,0
mov cl,01110000b
mov cx,80*24 ;循环清屏
mov si,0
s0: mov byte ptr es:[si],' '
mov byte ptr es:[si].1,0
add si,2
loop s0
mov ax,datasg
mov es,ax
mov di,0
mov ax,data
mov ds,ax
mov si,0
mov ax,stack
mov ss,ax
mov sp,50 ;初始化es,ds,ss段
mov cx,21
mov dh,4
mov bx,0
s1: push cx
mov ax,es:[di].0
mov ds:[si].0,ax
mov ax,es:[di].2
mov ds:[si].2,ax
mov byte ptr ds:[si].4,0 ;将es段得数据转移到ds:si内,调用show_str显示
mov dl,5
mov cl,7
call show_str ;显示年份
mov ax,es:[di].84
push dx ;保存 行dh值 不被改变
mov dx,es:[di].86
call dtoc_dword
pop dx
mov dl,15
mov cl,7
call show_str ;显示收入
mov ax,es:[bx].168
call dtoc_word
mov dl,30
mov cl,7
call show_str ;显示人数
mov ax,es:[di].84
push dx
mov dx,es:[di].86
div word ptr es:[bx].168
call dtoc_word
pop dx
mov dl,40
mov cl,7
call show_str
inc dh
add di,4
add bx,2
pop cx
loop s1
mov ax,4c00h
int 21h
;name: dtoc_word
;function: 将word(16)型数据转变为十进制数的字符串,字符串以0为结尾符
;parameter: 16位数据ax, ds:si指向字符串的首地址
;return: 存储结果在 ds:si
dtoc_word: push ax
push bx
push cx
push dx
push di
push si
push es
mov si,0 ;初始化ds:si
mov di,0 ;使用di计数
dtoc_s0: mov dx,0
mov bx,10d
div bx ;(dx,ax)/bx=ax....dx
add dx,'0' ;转变为十进制字符串
push dx ;入栈暂存
inc di ;计数+1
mov cx,ax
jcxz dtoc_s1 ;若除法结果ax为0,跳出循环
jmp dtoc_s0
dtoc_s1: mov cx,di
dtoc_s2: pop ax
mov ds:[si],ax
inc si
loop dtoc_s2
mov byte ptr ds:[si],0
pop es
pop si
pop di
pop dx
pop cx
pop bx
pop ax
ret
;name: dtoc_dword
;function: 将dword(32)型数据转变为十进制数的字符串,字符串以0为结尾符
;parameter: 32位数据dx,ax, ds:si指向字符串的首地址
;return: 存储结果在 ds:si
dtoc_dword: push ax
push bx
push cx
push dx
push di
push si
mov si,0 ;初始化ds:si
mov di,0
dd_s0: mov cx,dx
jcxz dd_s1
mov cx,10d
call divdw ;divdw: (dx,ax)/cx=(dx,ax)...cx
add cx,'0' ;将余数转为十进制字符
push cx ;入栈暂存
inc di ;计数+1
jmp dd_s0
dd_s1: mov dx,0
mov bx,10d
div bx ;(dx,ax)/bx=ax....dx
add dx,'0' ;转变为十进制字符串
push dx ;入栈暂存
inc di ;计数+1
mov cx,ax
jcxz dd_s2 ;若除法结果ax为0,跳出循环
jmp dd_s1
dd_s2: mov cx,di
dd_s3: pop ax
mov ds:[si],ax
inc si
loop dd_s3
mov byte ptr ds:[si],0
pop si
pop di
pop dx
pop cx
pop bx
pop ax
ret
;name: divdw
;function: 被除数高16位dx,低16位ax,除数cx
;return: 结果高16位dx,低16位ax,余数cx
divdw: push bx
push ax ;储存低位
mov ax,dx
mov dx,0
div cx ;先计算高16位除法,(dx,ax)/cx=ax.....dx
mov bx,ax ;把高位除法结果暂存bx
pop ax
div cx ;计算低16位除法,(dx,ax)/cx=ax.....dx
mov cx,dx ;返回余数cx
mov dx,bx ;返回高16位dx,低16位ax
pop bx
ret
;name: show_str
;function: 行dh,列dl,颜色cl, ds:si指向字符串的首地址
;return: 0
show_str: push ax
push bx
push cx
push dx
push di
push si
push es
mov ax,0b800h
mov es,ax ;显示屏段起始地址
mov bl,cl ;暂存颜色
mov al,160
mul dh ;8位乘法al*dh,结果储存在ax
mov dh,0
add dl,dl ;dh,dl合成dx,dl列
add ax,dx
mov di,ax ;es:di为显示屏当前位置
mov ah,bl ;字体颜色
show_s0: mov ch,0
mov cl,ds:[si]
jcxz show_s1
mov al,ds:[si]
mov es:[di],ax
inc si
add di,2
jmp short show_s0
show_s1: pop es
pop si
pop di
pop dx
pop cx
pop bx
pop ax
ret
codesg ends
end start | | |