|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
assume cs:code
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个字符串。0~53h
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型数据54h~a7h
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型数据。a8~d1h
data ends
table segment
db 8 dup(0)
table ends
code segment
start:mov ax,0b800h
mov es,ax
mov di,0
mov cx,80*24
a:mov byte ptr es:[di],' '
mov byte ptr es:1[di],0
add di,2
loop a
mov ax,table
mov ds,ax
mov ax,data
mov es,ax
mov si,0 ;ds:si指向字符串
mov bx,0 ;bx控制年份和总收入
mov di,0 ;di控制雇员数和平均收入
mov dh,4 ;dh控制行数
mov cx,21 ;循环次数
s:push cx ;保护CX
mov ax,es:[bx] ;BX控制年份和总收入
mov [si],ax ;年份字符串传送和显示
mov ax,es:2[bx]
mov 2[si],ax
mov byte ptr 4[si],0 ;防止下面的字符串占到这里
mov cl,2
mov dl,0
call show_str
mov ax,es:54h[bx]
push dx ;保护dx的行数接下来的高16为要用到dx
mov dx,es:56h[bx] ;总收入数据变成字符串和传送
call dtoc_dword
pop dx
mov cl,2
mov dl,20
call show_str
mov ax,es:0a8h[di] ;雇员数数据变成字符串和传送
call dtoc_word
mov cl,2
mov dl,40
call show_str
mov ax,es:54h[bx]
push dx
mov dx,es:56h[bx]
div word ptr es:0a8h[di];计算人均收入并显示
call dtoc_word
pop dx
mov cl,2
mov dl,60
call show_str
add bx,4
add di,2
add dh,1
pop cx
loop s
mov ax,4c00h
int 21h
;名称:show_str
;功能:在屏幕的指定位置,用指定颜色,显示一个用0结尾的字符串
;参数:(dh)=行号,(dl)=列号(取值范围0~80),(cl)=颜色,ds:si该字符串的首地址
;返回:显示在显示屏幕上
show_str:
push ax
push bx
push cx
push dx
push di
push si
push es
mov ax,0b800h
mov es,ax
mov ax,160
mul dh ;计算显示地址
add dl,dl
mov dh,0
add ax,dx
mov bx,ax
mov ah,cl ;颜色准备
d:mov cl,[si]
mov ch,0
jcxz ok
mov al,cl
mov es:[bx],ax ;字符串和颜色一起传送
inc si
add bx,2
jmp short d
ok:pop es
pop si
pop di
pop dx
pop cx
pop bx
pop ax
ret
;名称:dtoc_dword
;功能:将一个double word型数转化为字符串
;参数:(dx)=数的高八位,(ax)=数的低八位
;返回:ds:[si]放此字符串,以0结尾
;备注:会用到divdw函数
dtoc_dword:
push ax
push bx
push cx
push dx
push di
push si
mov bx,0 ;BX计算字符串的长度
f:mov cx,10
call divdw
push cx
inc bx
cmp ax,0
jne f
cmp dx,0
jne f
mov cx,bx ;将栈里面的字符串送入ds:si处
h:pop [si]
add byte ptr [si],30h
inc si
loop h
pop si
pop di
pop dx
pop cx
pop bx
pop ax
ret
;名称:dtoc_word
;功能:将一个word数据转化为字符串
;参数:(ax)=word型数据,ds:si指向字符串的首地址
;返回:ds:si放此字符串,以0结尾
dtoc_word:
push ax
push bx
push cx
push dx
push si
push di
mov bx,0 ;BX计算字符串的长度
g:mov dx,0
mov cx,10
div cx
mov cx,ax ;将商给cx看是不是为0是0就跳
add dx,30h
push dx ;保存商位0余数为N (N)余数为最后一次
inc bx
jcxz ok2
jmp short g
ok2:mov cx,bx
s2:pop [si]
inc si
loop s2
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
;名称:divdw
;功能:除法 被除数32位,除数16位,商32位,余数16位,不会溢出
;参数(dx)=被除数的高16位,(ax)=被除数低16位,(cx)=除数
;返回:(dx)=商高16位,(ax)=商低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
code ends
end start
|
|