TA的每日心情 | 开心 2018-10-31 14:26 |
---|
签到天数: 18 天 [LV.4]偶尔看看III
高级会员
- 积分
- 1019
|
assume cs:codesg, ds:data, es:data2
data segment
db 32 dup(20H)
data ends
data2 segment
; 年份
db '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982'
db '1983', '1984', '1985', '1986', '1987', '1988', '1989', '1990'
db '1991', '1992', '1993', '1994', '1995'
; 收入
dd 16, 22, 382, 1356, 2390, 8000, 16000, 24486, 50065, 97479
dd 140417,197514, 345980, 590827, 803530, 1183000, 1843000
dd 2759000, 3753000, 4649000, 5937000
; 雇员数
dw 3, 7, 9, 13, 28, 38, 130, 220, 476, 778, 1001, 1442, 2258, 2793
dw 4037, 5635, 8226, 11542, 14430, 15257, 17800
data2 ends
codesg segment
start:
mov ax, data
mov ds, ax
mov ax, data2
mov es, ax
mov cx, 21
mov bp, 0 ; 年份的首地址
mov bx, 54H ; 收入的首地址
mov di, 0a8H ; 雇员数的首地址
mov dh, 4 ; 从第4行开始逐行显示表格
mov dl, 0 ; 从第0列显示每行信息
s:
push cx
push dx
mov si, 0 ; 字符串的首地址
; 复制年份
mov ax, es:[bp]
mov [si], ax
mov ax, es:2[bp]
mov 2[si], ax
add si, 9 ; 9列显示年份
; 复制收入
mov ax, es:[bx]
; 收入的低16位
mov dx, es:2[bx]
; 收入的高16位
call dtoc
add si, 9 ; 9列显示收入
; 复制雇员数
mov ax, es:[di]
mov dx, 0
call dtoc
add si, 9 ; 9列显示雇员数
; 复制人均收入
mov ax, es:[bx]
; 收入的低16位
mov dx, es:2[bx]
; 收入的高16位
div word ptr es:[di]
mov dx, 0
call dtoc
mov byte ptr 3[si], 0 ; 字符串结束标志设为0
pop dx
mov cl, 2 ; 字符显示为绿色
call show_str
inc dh ; 行数+1
add bp, 4 ; 下一个年份
add bx, 4 ; 下一个收入
add di, 2 ; 下一个雇员数
pop cx
loop s
mov ax, 4c00H
int 21H
; 子程序dtoc
dtoc:
push bx
push cx
push si
mov bx, 0
s00:
mov cx, ax
jcxz ok
mov cx, 10
call divdw
add cx, 30H ; 余数转换为ASCII
push cx ; 余数入栈
inc bx ; 数字位数+1
jmp short s00
ok:
mov cx, bx
c2m:
pop bx
mov [si], bl
inc si
loop c2m
pop si
pop cx
pop bx
ret
; 子程序divdw
divdw:
push bx
mov bx, ax ; 低16位L暂时存在bx
mov ax, dx ; 高16位H送到ax
mov dx, 0
div cx ; H/N
push ax ; int(H/N)入栈
mov ax, bx
div cx ; [rem(H/N)*65536+L]/N
mov cx, dx ; 余数送到cx
pop dx ; int(H/N)出栈
pop bx
ret
; 子程序show_str
show_str:
push ax
push bx
push bp
push cx
push si
push di
push es
mov bl, cl ; 字体颜色存在bl中
mov ax, 0b800H
mov es, ax ; 显示缓冲区的段地址存在es
mov ax, 0a0H
mul dh
mov bp, ax ; 将第n行的首地址存在bp
mov ax, 2
mul dl
mov di, ax ; 将第n列存在di
mov si, 0
ctom:
mov ch, 0
mov cl, [si]
jcxz exit
mov es:[bp][di], cl
inc di
mov es:[bp][di], bl
inc si
inc di
jmp short ctom
exit:
pop es
pop di
pop si
pop cx
pop bp
pop bx
pop ax
ret
codesg ends
end start
一个也看不懂!!
|
|