assume cs:codesg
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'
;以上是表示21年的21个字符串
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;以上是表示21年公司总收入的21个dword型数据
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
;以上是表示21年公司雇员人数的21个word型数据
data ends
table segment
db 21 dup ('year sumn ne ?? ')
table ends
data_string segment
db 10 dup (0)
data_string ends
stack segment
db 16 dup (0)
stack ends
codesg segment
start: mov ax,data
mov ds,ax ;ds:[di]指向data
mov ax,table
mov es,ax ;es:[bx+si]指向table
mov di,0
mov bx,0
;mov si,0
mov cx,21
s1: mov dx,cx
mov si,0 ;###后加
mov cx,4
s2: mov al,ds:[di]
mov es:[bx+si],al
inc di ;inc,di
inc si ;inc,si
loop s2
mov cx,dx
add bx,10H
loop s1
mov bx,0
mov cx,21
s3: mov ax,ds:[di]
mov es:[bx+5],ax
add di,2
mov ax,ds:[di]
mov es:[bx+7],ax
add di,2
add bx,10H
loop s3
mov bx,0
mov cx,21
s4: mov ax,ds:[di]
mov es:[bx+0aH],ax
add di,2
add bx,10H
loop s4
mov bx,0
mov cx,21
s5: mov ax,es:[bx+5]
mov dx,es:[bx+7]
div word ptr es:[bx+0aH]
mov es:[bx+0dH],ax
add bx,10H
loop s5
mov ax,data_string
mov ds,ax
mov si,0 ;ds:[si]指向字符串首地址
mov ax,stack
mov ss,ax
mov sp,10H
mov di,1
mov bx,0
mov si,0
mov cx,21
ss1: push cx
mov si,0
mov cx,4
ss2: mov al,es:[bx+si]
mov ds:[si],al
inc si
loop ss2
inc di
mov ax,di
mov dh,al
mov dl,12
mov cl,2
mov si,0
call show_str
pop cx
add bx,10H
loop ss1
;************************************
mov di,1
mov bx,0
mov si,0
mov cx,21
ss3: push cx
mov ax,es:[bx+5]
mov dx,es:[bx+7]
call dtocdw
inc di
mov ax,di
mov dh,al
mov dl,23
mov cl,2
mov si,0
call show_str
pop cx
add bx,10H
loop ss3
;************************************
mov di,1
mov bx,0
mov si,0
mov cx,21
ss4: push cx
mov ax,es:[bx+0aH]
mov dx,0
call dtocdw
inc di
mov ax,di
mov dh,al
mov dl,35
mov cl,2
mov si,0
call show_str
pop cx
add bx,10H
loop ss4
;************************************
mov di,1
mov bx,0
mov si,0
mov cx,21
ss5: push cx
mov ax,es:[bx+0dH]
mov dx,0
call dtocdw
inc di
mov ax,di
mov dh,al
mov dl,45
mov cl,2
mov si,0
call show_str
pop cx
add bx,10H
loop ss5
;************************************
mov ax,4c00H ;后加,此项需要放在子程序前,否则程序无法正常退出
int 21H
;###################show_str############################
;名称:show_str
;功能:在指定位置,用指定颜色,显示一个用0结束的字符串
;参数:(dh)=行号(取值范围0-24),(dl)=列号(取值范围0-79)
; :(cl)=颜色,ds:si指向字符串首地址
;返回:无
;应用举例:在屏幕的8行3列,用绿色显示data段中的字符串
show_str:
push dx
push ax
push bx
push es
push cx
push ds
push si
dec dh
mov al,0a0H
mul dh
mov bx,ax
mov al,2
mul dl
sub ax,2
add bx,ax
mov ax,0b800H
mov es,ax
mov al,cl ;后加,用于显示字符颜色属性
s_ptr: ;mov al,cl
mov ch,0
mov cl,ds:[si] ;此项设置改变了cl
jcxz ok_ptr
inc si
mov es:[bx],cl
mov es:[bx+1],al ;后加,用于显示字符颜色属性
add bx,2 ;inc bx
jmp short s_ptr
ok_ptr:pop si
pop ds
pop cx
pop es
pop bx
pop ax
pop dx
ret
;####################divdw##############################
;名称:divdw
;功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型
;参数:(ax)=dword型数据低16位,(dx)=dword型数据高16位,(cx)=除数
;返回:(dx)=结果的高16位,(ax)=结果的低16位,(cx)=余数
;应用举例:计算1000000/10(f4240H/0aH)
divdw:
push bx ;bx用于上一级程序记录计算次数
mov bx,ax
mov ax,dx
mov dx,0
div cx
mov si,ax
mov ax,bx
div cx ;测试一下dx是否为0
mov cx,dx
mov dx,si
pop bx
ret
;###################dtocdw#############################
;名称:dtocdw
;功能:将dword型数据转变为表示十进制数的字符串,字符串以0为结尾符。
;参数:(ax)=dword型数据的低16位,(dx)=dword型数据的高16位,ds:si指向字符串的首地址
;返回:无
;应用举例:编程,将数据5937000(5a9768H)以十进制的形式在屏幕的8行3列,用绿色显示出来。
dtocdw: push dx
push di
push cx
push ax
push si
push bx ;后加,用于记录余数个数用
mov bx,0 ;后加,用于记录余数个数用
;mov cx,0aH
s_dtocdw:
mov cx,0aH ;后加的
call divdw
mov di,cx
mov cx,ax
jcxz ok1_dtocdw
add di,30H
push di ;mov ds:[si],dl,发现顺序不对,更改
inc bx ;inc si
jmp short s_dtocdw
ok1_dtocdw:
mov cx,dx
jcxz ok2_dtocdw
add di,30H
push di
inc bx
jmp short s_dtocdw
ok2_dtocdw:
add di,30H
push di ;mov ds:[si],dl
inc bx ;后加,最后循环要用5次,不加就是4次
;以下为后加,用栈实现逆序转正序
mov cx,bx
mov si,0 ;后加,保证ds:si指向字符串首地地址
s2_dtocdw:
pop ds:[si]
inc si ;保留低位字节,覆盖高位字节
loop s2_dtocdw
pop bx ;后加
pop si
pop ax
pop cx
pop di
pop dx
ret
;#######################################################
;mov ax,4c00H 此项需要放在子程序前,否则程序无法正常退出
;int 21H
codesg ends
end start