ssume cs:c,ds:d,es:t
d segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984','1985'
db '1986','1987','1988','1989','1990','1991','1992','1993','1994','1995'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514,345980,590827
dd 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,11542,14430
dw 15257,17800
d ends
t segment
db 21 dup ('year summ ne ?? ')
t ends
c segment
s:mov ax,d
mov ds,ax
mov ax,t
mov es,ax
mov bp,0 ;变址寄存器置0.为第三数据项首地址EA
mov bx,00h ;用BX定义结构型数据的开始数组地址。
mov cx,21d ;结构型数据的数组数。
s1:push cx ;数组数入栈。
mov cx,4 ;数组项的元素数。
mov di,0 ;目地数组项元素的开绐地址EA置0.
s10:mov ax,0 ;AX置0.
mov al,[si] ;源数组的数组项首元素送入AL。
mov es:[bx+di],al ;把AL的内容送入目地数组的数组项的第一个内存单元。
inc di ;目地数组项的内存单元地址加1.
inc si ;源数组项的内存单元地址加1
loop s10 ;判断数据项的元素数是否转送完。
s11:mov ax,[si+50h] ;读源数组的第二数项据的第一元素。
mov es:[bx+5],ax ;送入目地数据项
mov ax,[si+52h]
mov es:[bx+7],ax
s12:mov ax,es:[bx+5] ;
mov dx,es:[bx+7]
mov cx,ds:[bp+0a8h];把源数组的第三数据项的元素送入CX中作为除数。
mov es:[bx+0ah],cx
div cx
mov es:[bx+0dh],ax
add bp,2h ;源数组第三数据项的内存地址加2.
add bx,10h ;结构型数据的数组的EA加一个字的范围。
pop cx ;结构型数据的数组数出栈。
loop s1 ;判断所有数组是否执行完即即;(CX=0),
mov cx,15h ;要显示的目地结构型数据的数组数目送入计数器。
mov bp,0 ;源数组的数组首地址置0.
mov bl,2
mov bh,3 ;显示在哪一行哪一例置初值。
cylc:push cx ;数组数目数据入栈。
push bx ;当前哪行哪例入栈。
show_str:mov cx,0
mov dh,bl
mov dl,bh
mov cl,2 ;字符串显示的寄存器入口参数。
mov ax,0b800h
mov ds,ax ;显存的段地址。
mov ax,0
mov al,0a0h
mul dh
mov di,ax ;计算显示在哪一行。
mov al,2h
mul dl
sub ax,2h ;计算显示在哪一例。
add di,ax ;计算显示在哪一行哪一例。
mov dl,cl ;显示的字符属性。
mov bx,0 ;显示数组的首地址EA置0.
mov si,0 ;源数组数据项的首地址EA置0.
mov cx,4 ;显示数组的第一数据项的元素数。
dtoc1:mov al,es:[ bp+si]
mov ah,0 ;读源数据项的元素。
mov [bx+di],al
mov [bx+di+1],dl ;显存中写入字符入属性。
inc bx
inc bx ;显存地址加2.
inc si ;数据项的元素地址加1.
loop dtoc1 ;判断元素数.
jmp short data2
dtoc2:mov bx,20
mov si,0
mov dl,2h
mov cl,[si+150h]
mov ch,0
mov [bx+di],al
mov [bx+di+1],dl
add bx,2
inc si
loop dtoc2
jmp short a
data2 mov bx,0 ;字符个数置0
mov ax,es:[bp+5]
mov dx,es:[bp+7] ;读源数据项进行除法运算。
mov cx,0ah ;读源数据项进行除法运算。
call divdw
mov cx,bx ;字符数送入计数器。
mov bx,0 ;第二数据项的首地址置0.
a:pop ax ;第一个字符数据出栈。
mov [bx+150h],al ;转换后的字符数据送入中转区
inc bx ;中转区地址加1.
loop a
mov ax,0
mov [bx+150h],ax ;中转区字符的最后内容置为0.
jmp short dtoc2
divdw:push ax ;源数据项的低16位入栈。
mov ax,dx
mov dx,0
div cx ;源数据项的高16位除法。
mov si,ax ;除法的商送入SI。
pop ax ;源数据项的低16位出栈
div cx ;源数据项的低16位与高16位的余数除以除数的除法。
mov cx,dx ;第二次除法的余数送入CX。
mov dx,si ;第一次除法的商送入DX从而形成商在AXDX中,AX为商的低16位,DX
为商的高位。余数在CX中。
add cx,30h ;
push cx ;数值数据转换字符数据并入栈。
inc bx ;记录字符的个数。
mov cx,ax ;商送入CX
inc cx
loop divdw ;判断商是否为0.
ret
a:add bp,10h ;源结构型数组的数组项地址加一个字。
pop bx ;当前哪行哪例出栈,
inc bl ;显示哪一行的计数器加1.
pop cx ;数组数目数据出栈
dec cx
jcxz e
jmp near ptr cylc
e:mov ax,4c00h
int 21h
c ends
end s