|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- 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
复制代码 |
|