assume cs:code,ds:data,ss:stack
data 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,2795000,3753000,4649000,5937000
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
dw 5,3,42,104,85,210,123,111,105,125,140,136,153,211,199,209,224,239
dw 260,304,333
data ends
table segment
db 15h dup('year summ ne ?? year summ ne ?? ')
table ends
stack segment
db 20h dup(0)
stack ends
;stackB segment
; db 20h dup(0)
;stackB ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov ax,stack
mov ss,ax
mov sp,20h
call putyear
call putinc
call putgz
call PUTMon
call show_str
mov ax,4c00h
int 21h
;---------处理年份--------
;功能:取年份,放到table段每行开头四个字节,结尾加空格
;
;
putyear:
mov cx,15h ;21 次循环
sub si,si ;source address.
sub bx,bx ;destionct address .every line
tyoy: ;Twenty one year
push cx
sub di,di
mov cx,4 ;一个年份4个字符循环4次
sy:
mov al,[si]
mov es:[bx+di],al
inc si
inc di
loop sy
mov al,20h
mov es:[bx+di],al
add bx,20h
pop cx
loop tyoy
mov es:2a0h,si ;保存当前取到的数据的地址
ret
;-----------------------------------------------------------
putinc:
mov si,es:02a0h ;取原始数据地址
sub bx,bx ;行数计数,从零开始
mov cx,15h ;21行数据循环21次
recnum:
push cx ;保存外循环计数
mov es:2A2h,bx ;保存行数计数
;---准备除法传入参数
mov bx,[si] ;低16位数放bx
mov ax,[si+2] ;高16位数放ax
push si ;保存去数据地址
sub si,si ;做计数器用,清零
divzw:
mov cx,10 ;除数放cx
call divdw
add cx,30h ;数字转换为ascii码
push cx ;转换好的数据入栈
inc si ;计数入栈次数
mov cx,ax ;
add cx,dx ;把商放入cx中
jcxz okk ;检测为零则跳出
mov bx,ax ;做过除法后低位放bx
mov ax,dx ;做过除法后高位放ax
jmp short divzw ;循环除法直到商为零(即所有数字都转换为ascii)
okk:
mov bx,es:2a2h
mov di,05h ;每一行的写入偏移量
mov cx,si ;入栈次数作为循环条件放cx
putnu:
pop es:[bx+di] ;依次将转换好的数据写入
inc di ;
loop putnu
mov cx,8 ;----不够8位字节以空格补足8位---
sub cx,si
adspp:
mov al,20h ;
mov es:[bx+di],al ;在一个数末尾加一个空格
inc di
loop adspp
add bx,20h ;写入下一行的行地址
pop si ;还原取数据地址
add si,4 ;下一个取数地址
pop cx ;还原外循环计数
loop recnum
mov es:2a0h,si ;保存当前取到数据的地址
ret
;--------------------------------------------------------------------------
PUTGZ:
mov si,es:02a0h ;取原始数据地址
sub bx,bx ;行数计数,从零开始
mov cx,15h ;21行要放入的数据循环21次
renum:
push cx ;保存外循环计数
mov es:2A2h,bx ;保存行数计数
;---准备除法传入参数
mov ax,[si] ;被除数
push si ;保存取数据地址
sub si,si
;sub bx,bx ;做计数器用,清零
divl:
mov dx,0 ;字除法,高位字置零
mov cx,10 ;除数放cx
div cx ;商在ax,余数在dx
add dx,30h ;数字转换为ascii码
push dx ;转换好的数据入栈
inc si ;计数入栈次数
mov cx,ax ;
;add cx,dx ;把商放入cx中
jcxz ok ;检测为零则跳出
;mov bx,ax ;做过除法后低位放bx
;mov ax,dx ;做过除法后高位放ax
jmp short divl ;循环除法直到商为零(即所有数字都转换为ascii)
ok:
mov bx,es:2a2h
mov di,0dh ;每一行的写入偏移量
mov cx,si ;入栈次数作为循环条件放cx
putn:
pop es:[bx+di] ;依次将转换好的数据写入
inc di ;
loop putn
mov cx,8 ;----不够5位字节以空格补足5位---
sub cx,si
adsp:
mov al,20h ;
mov es:[bx+di],al ;在一个数末尾加一个空格
inc di
loop adsp
add bx,20h ;写入下一行的行地址
pop si ;还原取数据地址
add si,2 ;下一个取数地址
pop cx ;还原外循环计数
loop renum
mov es:2a0h,si ;保存当前取到数据的地址
ret
;-----------------------------------------------------------------------
PUTMon:
mov si,es:02a0h ;取原始数据地址
sub bx,bx ;行数计数,从零开始
mov cx,15h ;21行要放入的数据循环21次
renumb:
push cx ;保存外循环计数
mov es:2A2h,bx ;保存行数计数
;---准备除法传入参数
mov ax,[si] ;被除数
push si ;保存取数据地址
sub si,si
;sub bx,bx ;做计数器用,清零
divll:
mov dx,0 ;字除法,高位字置零
mov cx,10 ;除数放cx
div cx ;商在ax,余数在dx
add dx,30h ;数字转换为ascii码
push dx ;转换好的数据入栈
inc si ;计数入栈次数
mov cx,ax ;
;add cx,dx ;把商放入cx中
jcxz okkk ;检测为零则跳出
;mov bx,ax ;做过除法后低位放bx
;mov ax,dx ;做过除法后高位放ax
jmp short divll ;循环除法直到商为零(即所有数字都转换为ascii)
okkk:
mov bx,es:2a2h
mov di,015h ;每一行的写入偏移量
mov cx,si ;入栈次数作为循环条件放cx
putnn:
pop es:[bx+di] ;依次将转换好的数据写入
inc di ;
loop putnn
mov cx,4 ;----不够4位字节以空格补足5位---
sub cx,si
adsppp:
mov al,20h ;
mov es:[bx+di],al ;在一个数末尾加一个空格
inc di
loop adsppp
mov al,0 ;每行末尾加0
mov es:[bx+di],al
add bx,20h ;写入下一行的行地址
pop si ;还原取数据地址
add si,2 ;下一个取数地址
pop cx ;还原外循环计数
loop renumb
mov es:2a0h,si ;保存当前取到数据的地址
ret
;-----------------------------------------------------------------------------
divdw: ;---双字除法---
;参 数:除数放cx,高16位数放ax,低16位数放bx
;返回值:高位商放dx,低位商放ax,余数放cx
push bx ;不用作返回参数的寄存器保持原状
sub dx,dx ;字除法dx会参与,将dx置零
div cx ;div后,商在ax,余数在dx
push ax ;保存高位除法的商
mov ax,bx
div cx ;做低位除法--相当于[mod(H/N)X10000h+L]/0Ah
mov cx,dx ;余数放cx
pop dx ;高位除法商放dx
pop bx ;;不用作返回参数的寄存器恢复原状
ret
;----------------------------------------------------------------------------------------
show_str:
call cls
push ds
mov ax,0b800h ;
mov ds,ax
sub si,si
sub di,di
sub bx,bx
sub dx,dx
mov cx,15h
showall:
push cx
showln:
mov al,es:[si]
mov ah,02
mov 28[bx+di],al
mov 29[bx+di],ah
inc si
inc di
inc di
mov ah,0
mov cx,ax
jcxz over
jmp showln
over:
mov ax,0a0h
inc dx
push dx
push dx
mul dx
mov bx,ax
mov cx,20h
pop dx
mov ax,dx
mul cx
;add ax,ax
mov si,ax
sub di,di
pop dx
pop cx
loop showall
pop ds
ret
cls:
push ax
push cx
push es
push si
mov cx,3840
mov ax,0b800h
mov es,ax
sub si,si
sc:mov ax,0
mov es:[si],ax
inc si
loop sc
pop si
pop es
pop cx
pop ax
ret
code ends
end start