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