|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
assume cs:codesg,ds:datasg,ss:stacksg
stacksg segment
db 64 dup (0)
stacksg ends
datasg segment
db 16 dup (0) ;存放待显示字符串
db '1975','1976','1977','1978','1979','1980','1981'
db '1982','1983','1984','1985','1986','1987','1988'
db '1989','1990','1991','1992','1993','1994','1995'
;以上是表示21年的21个字符串
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479
dd 140417,197514,345980,590827,803530,1183000,1843000
dd 2759000,3753000,4649000,5937000
;以上是表示21年公司总收入的21个dword型数据
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793
dw 4037,5635,8226,11542,14430,15257,17800
;以上是表示21年公司雇员人数的21个word型数据
datasg ends
codesg segment
;名称:show_str
;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串
;参数:(dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79),(cl)=颜色,ds:si指向字符串的首地址
show_str: push es
push ax
push cx
push dx
push si
push di
mov ax,0b800h
mov es,ax
mov al,160
mul dh
mov di,ax
add dl,dl
mov dh,0
add di,dx
mov ah,cl
mov ch,0
show: mov cl,[si]
jcxz show0
mov al,[si]
mov es:[di],ax
inc si
add di,2
jmp short show
show0: pop di
pop si
pop dx
pop cx
pop ax
pop es
ret
;名称:divdw
;功能:进行不会产生溢出的除法运算,被除数为 dword 型,除数为 word 型,结果为 dword 型。
;参数:(ax)=dword 型数据的低16位,(dx)=dword 型数据的高16位,(cx)=除数
;返回:(ax)=结果的低16位,(dx)=结果的高16位,(cx)=余数
divdw: push bx
push ax
mov ax,dx
mov dx,0
div cx
mov bx,ax
pop ax
div cx
mov cx,dx
mov dx,bx
pop bx
ret
;名称:dtoc
;功能:将 dword 型数据转变为表示十进制数的字符串,字符串以0为结尾符。
;参数:(ax)=dword型数据低16位,(dx)=dword型数据高16位,ds:si指向字符串的首地址
dtoc: push ax
push bx
push cx
push dx
push si
mov bx,0
dtoc1: mov cx,10
call divdw
inc bx
add cx,30h
push cx
mov cx,dx
jcxz dtoc2
jmp short dtoc1
dtoc2: mov cx,ax
jcxz dtoc3
jmp short dtoc1
dtoc3: mov cx,bx
dtoc4: pop ax
mov [si],al
inc si
loop dtoc4
mov byte ptr [si],0
pop si
pop dx
pop cx
pop bx
pop ax
ret
start: mov ax,stacksg
mov ss,ax
mov sp,64 ;栈顶
mov ax,datasg
mov ds,ax
mov si,0 ;待显示字符串首地址
mov bx,16 ;指向年份
mov di,184 ;指向人数
mov bp,3 ;显示行数
mov cx,21
s: push cx
mov ax,[bx]
mov [si],ax
mov ax,[bx+2]
mov [si+2],ax
mov byte ptr [si+4],0 ;年份字符串后面填0
mov ax,bp
mov dh,al ;3行
mov dl,25 ;25列
mov cl,2 ;黑底绿字
call show_str
mov ax,[bx+84] ;总收入低16位
mov dx,[bx+86] ;总收入高16位
call dtoc
mov ax,bp
mov dh,al
mov dl,32
call show_str
mov ax,[di] ;人数
mov dx,0
call dtoc
mov ax,bp
mov dh,al
mov dl,42
call show_str
mov ax,[bx+84]
mov dx,[bx+86]
div word ptr [di] ;(ax)=人均收入
mov dx,0
call dtoc
mov ax,bp
mov dh,al
mov dl,50
call show_str
add bx,4
add di,2
inc bp
pop cx
loop s
mov ax,4c00h
int 21h
codesg ends
end start |
|