assume cs:code, ds:data, es:table, ss:stack
data segment
db '1975', '1976', '1977', '1978', '1979', '1980'
db '1981', '1982', '1983', '1984', '1985', '1986'
db '1987', '1988', '1989', '1990', '1991', '1992'
db '1993', '1994', '1995'
;以上是表示21年的21个字符串
dd 16, 22, 382, 1356, 2390, 8000 ;偏移84
dd 16000, 24486, 50065, 97479, 140417, 197514
dd 345980, 590827, 803530, 1183000, 1843000, 2759000
dd 3753000, 4649000, 5937000
;以上是表示21年公司总收入的21个dword型数据
dw 3, 7, 9, 13, 28, 38 ;偏移A8
dw 130, 220, 476, 778, 1001, 1442
dw 2258, 2793, 4037, 5635, 8226, 11542
dw 14430, 15257, 17800
;以上是表示21年公司雇员人数的21个word型数据
data ends
table segment
db 40 dup (' ')
table ends
stack segment
dw 16 dup(0)
stack 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 ;设置栈顶指针
mov bx, 2 ;行计数器
mov si, 0
mov di, 0
mov bp, 0
mov cx, 21 ;设置循环,21次
main: push cx
mov si, 15H ;设置员工数的存放位置
xor dx, dx
mov ax, ds:[bp+0A8H] ;取得员工数
call dtoc ;将员工数转换为ASCII存放在table段中
mov si, 0AH ;设置总收入的存放位置
mov dx, [di+056H] ;将总收入的高16位送到dx
mov ax, [di+054H] ;将总收入的低16位送到ax
call dtoc ;将总收入数转换为ASCII存放在table段中
mov si, 1FH ;设置平均收入的存放位置
div word ptr ds:[bp+0A8H] ;计算平均收入
xor dx, dx ;将被除数的高16位清零
call dtoc
mov dx, [di+2] ;取得年份高16位
mov ax, [di] ;取得年份低16位
mov es:[0], ax ;存放年份
mov es:[2], dx
mov dl, 0 ;设置末尾0
mov es:[28H], dl
xor si, si ;清空si,es:[si]指向输出字符串的起始处
mov dh, bl ;设置显示行数
mov dl, 20 ;设置显示列数
mov cl, 2 ;设置颜色
call show_str
add di, 4
add bp, 2
inc bx ;行数自增1
pop cx
loop main
mov ax, 4c00H
int 21H
dtoc: push ax
push bx
push cx
push dx
push si
push di
mov di, 0 ;将计数器置0
d_1: mov cx, 10 ;将除数放入cx
call divdw
add cx, 30H ;将数字转换为ASCII码
push cx ;将转换后的ASCII码入栈
mov cx, dx ;将商的高16位放入cx
inc di
jcxz d_2 ;如果商的高16位为0,则跳转进行判断低16位
jmp short d_1
d_2: mov cx, ax ;将商的低16位放入cx
jcxz d_3
jmp short d_1
d_3: mov cx, di ;设置循环变量
d_4: pop dx ;将转换后的ASCII码出栈,放入DX
mov es:[si], dl
inc si
loop d_4
pop di
pop si
pop dx
pop cx
pop bx
pop ax
retn
divdw: push bx
push si
mov bx, ax ;保存被除数的低16位
mov ax, dx ;将高16位放置在AX中
xor dx, dx ;高16位清零
div cx ;高16位进行除法,商在AX 余数在DX
mov si, ax ;保存高16位的商
mov ax, bx
div cx ;低16位进行除法,商在AX 余数在DX
mov cx, dx
mov dx, si
pop si
pop bx
retn
show_str: push ax ;将子程序中使用的寄存器原始值压入栈
push bx
push di
push es
push ds
mov ax, es
mov ds, ax
mov ax, 0B800H
mov es, ax ;存放显存起始地址
mov ax, 0A0H
mul dh ;计算行偏移地址,存放在ax中
mov di, ax
mov ax, 2H
mul dl ;计算列偏移地址,存放在ax中
add di, ax ;行+列=总偏移 es:[di]将定位到输出位置
mov bh, cl ;保存颜色代码,存放bx高位
xor cx, cx
s: mov cl, ds:[si]
jcxz retFlag ;如果读取结束,返回
mov bl, cl ;保存字符ASCII码,存放bx低位
mov es:[di], bx
add di, 2
inc si
jmp short s ;继续循环读取
retFlag:pop ds
pop es
pop di
pop bx
pop ax
retn
code ends
end start
不容易啊,总算写出来了!!!