|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
assume cs:code,ds:data,ss:stack,es:extend
data segment ;初始数据放数据段
dd 1975,1976,1977,1978,1979,1980,1981,1982,1983
dd 1984,1985,1986,1987,1988,1989,1990,1991,1992
dd 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
dd 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dd 11542,14430,15257,17800
dd 21 dup(0)
data ends
extend segment ;扩展段存放转化好的字符串,每个字符串以0结尾
dw 256 dup(0)
extend ends
stack segment ;定义栈段
dw 128 dup(0)
stack ends
code segment
start:mov ax,data
mov ds,ax
mov ax,extend
mov es,ax
mov ax,stack
mov ss,ax
mov sp,128
mov si,0
mov di,0 ;初始化数据
push dx
push ax
push si
mov cx,21
s999:mov ax,84[si]
mov dx,84[si+2]
div word ptr 168[si]
mov word ptr 252[si],ax
add si,4
loop s999
pop si
pop ax
pop dx ;s999循环主要作用:把最后一项数据求出来放到初始数据段里
mov cx,84 ;所有需要转化的数据次数
s0:mov ax,ds:[si]
mov dx,ds:[si+2]
call dtoc ;调用转化字符串的子程序3
add si,4
loop s0 ;最外面的循环
;以下指令是把数据显示出来
mov dh,5 ;第5行开始
mov dl,3 ;第3列开始
mov cl,2 ;颜色为绿色
mov di,0
mov cx,4
lie:push cx ;lie循环主要作用:把四列分四次显示出来
mov cx,21
hang:push cx ;hang循环主要作用:把第一列21个年份分21次显示出来
mov cl,2
call show_str
inc dh
inc di
pop cx
loop hang
mov dh,5
add dl,0ah
pop cx
loop lie
mov ax,4c00h ;程序到这里结束
int 21h
show_str:mov ax,0b800h ;解决显示的子程序1
mov ds,ax
mov si,0 ;初始化子程序数据
mov ah,0
mov al,0a0h
dec dh
mul dh ;计算出行偏移
mov si,ax
mov ah,0
mov al,2h
dec dl
mul dl ;计算出列偏移
add si,ax ;行与列加起来合成一个偏移地址
inc dh
inc dl
mov bl,cl ;把颜色属性给bl
todo:mov cl,es:[di]
mov ch,0
jcxz ok ;判断si的值是否为0,是就跳转到OK,不是就执行下面指令
mov al,es:[di]
mov ds:[si],al ;把字符串的值赋值给显存,显示出来
mov ds:1h[si],bl ;把颜色属性的值赋值给显存,显示出来
inc di
add si,2
jmp short todo
ok:
ret
dtoc:push ax ;解决字符串转换的子程序3
push bx
push cx
push dx
push si
mov si,0 ;si用于记录位数
s1:call divdw ;调用不会除法溢出子程序2
mov bx,cx ;把余数给bx
mov cx,ax ;把商给cx
jcxz ok1
add bx,30h ;余数加30H变ASCII值
push bx ;余数入栈
inc si
jmp short s1
ok1:add bx,30h
push bx
inc si
mov cx,si ;把si记录的位数给cx作为循环次数
s2:pop ax ;把入栈的余数逆序出栈
mov es:[di],al ;把转化好的每个位的ASCII值给ES段里
inc di
loop s2
inc di
mov byte ptr es:[di],0 ;每个字符串以一个0结尾
pop si
pop dx
pop cx
pop bx
pop ax
ret
divdw:mov cx,0ah ;解决除法溢出的子程序2
push ax
mov ax,dx
mov dx,0
div cx
mov bx,ax
pop ax
div cx
mov cx,dx
mov dx,bx
ret
code ends
end start
|
|