汇编语言要比高级语言考虑很多细节,比如寄存器冲突的问题。
代码都是一块一块的调出来的。
在完成题目要求的同时还加了个背景。
不说了,直接上代码吧。
assume cs:code
data segment
db '1975',0,'1976',0,'1977',0,'1978',0,'1979',0,'1980',0,'1981',0,'1982',0,'1983',0
db '1984',0,'1985',0,'1986',0,'1987',0,'1988',0,'1989',0,'1990',0,'1991',0,'1992',0
db '1993',0,'1994',0,'1995',0
;以上是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型数据
dw 21 dup (0)
;以上存放21年公司人均收入
data ends
state segment
db 'Group Members: Qin Weichao, Yang Rui, Li Yonghong, Si Yuhan',0 ;60个字节
db 'Year:',0,'Total:',0,'Number:',0,'Average:',0 ;30个字节
db 'Poweridea Company Annual Data',0 ;30个字节
state ends
stack segment
db 32 dup (0)
stack ends
string segment
db 10 dup (0)
string ends
code segment
start:
mov cx, 21 ;计算部分
mov ax, data
mov ds, ax
mov bx, 105 ;指向被除数
mov si, 189 ;指向除数
mov di, 231 ;指向商
calculate: mov ax, ds:[bx]
add bx, 2
mov dx, ds:[bx]
add bx, 2
div word ptr ds:[si]
mov ds:[di], ax
add di, 2
add si, 2
loop calculate ;计算部分结束
mov ax, state
mov ds, ax
mov si, 90
mov dh, 0
mov dl, 25
call show_str
mov dh, 1 ;小组成员说明
mov dl, 9
mov cl, 34H
mov si, 0
call show_str
mov bx, 0 ;设置背景
mov dl, 3CH
mov cx, 2
s1: call Background
add bx, 40
loop s1
mov bx, 20
mov dl, 5AH
mov cx, 2
s2: call Background
add bx, 40
loop s2
mov cx, 160
mov bx, 1
mov ax, 0B800H
mov es, ax
s3: mov byte ptr es:[bx], 4BH
add bx, 2
loop s3
mov si, 60 ;打印表头
mov dh, 2
mov dl, 0
mov cl, 49H
call show_str
add si, 6
mov dl, 20
call show_str
add si, 7
mov dl, 40
call show_str
add si, 8
mov dl, 60
call show_str
mov cx, 21 ;打印年份
mov ax, data
mov ds, ax
mov si, 0
mov dh, 3
mov dl, 0
printy: push cx
mov cl, 4AH ;设置颜色
call show_str
inc dh
add si, 5
pop cx
loop printy ;打印年份结束
mov cx, 21
mov dh, 3
mov bx, 105
print1: push cx
push dx
mov ax, string ;打印总收入,转化字符串到string段
mov es, ax
mov si, 0
mov ax, data
mov ds, ax
mov ax, ds:[bx]
add bx, 2
mov dx, ds:[bx]
add bx, 2
call dwtoc
pop dx
mov dl, 20 ;打印转化好的字符串
mov cl, 4AH
mov ax, string
mov ds, ax
mov si, 0
call show_str
inc dh
pop cx
loop print1
mov cx, 21
mov dh, 3
mov bx, 189
print2: push cx
push dx
mov ax, string ;打印雇员人数,转化字符串到string段
mov es, ax
mov si, 0
mov ax, data
mov ds, ax
mov ax, ds:[bx]
add bx, 2
call dtoc
pop dx
mov dl, 40 ;打印转化好的字符串
mov cl, 4AH
mov ax, string
mov ds, ax
mov si, 0
call show_str
inc dh
pop cx
loop print2
mov cx, 21
mov dh, 3
mov bx, 231
print3: push cx
push dx
mov ax, string ;打印人均收入,转化字符串到string段
mov es, ax
mov si, 0
mov ax, data
mov ds, ax
mov ax, ds:[bx]
add bx, 2
call dtoc
pop dx
mov dl, 60 ;打印转化好的字符串
mov cl, 4AH
mov ax, string
mov ds, ax
mov si, 0
call show_str
inc dh
pop cx
loop print3
mov bh, 0 ;设置光标
mov dh, 21
mov dl, 0
mov ah, 2
int 10H
mov ax, 4C00H ;程序返回
int 21H
;名称:show_str
;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串
;参数:(dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79),ds:si指向字符串的首地址
;返回:无
show_str: push es
push ax
push cx
push si
mov ax, 0B800H
mov es, ax
mov al, 0A0H
mul dh
mov di, ax
mov al, 02H
mul dl
add di, ax ;设置di的值
show_str_s1:
mov ch, 0
mov cl, ds:[si]
jcxz show_str_s2
mov al, ds:[si]
mov es:[di], al
add di, 2
inc si
jmp short show_str_s1
show_str_s2:
pop si
pop cx
pop ax
pop es
ret
;名称:divdw
;功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型
;参数:(ax)=dword型数据的低16位
; (dx)=dword型数据的高16位
; (cx)=除数
;返回:(dx)=结果的高16位,(ax)=结果的低16位
; (cx)=余数
divdw: push bx ;保存调用子程序前bx的值
push ax
mov ax, dx
mov dx, 0
div cx
mov bx, ax ;保存商的高16位
pop ax
div cx
mov cx, dx ;余数放入cx中
mov dx, bx
pop bx ;恢复bx的值
ret
;名称:dtoc
;功能:将word型数据转变为表示十进制数的字符串,字符串以0为结尾符。
;参数:(ax)=word型数据
; es:si指向字符串的首地址
;返回:无
dtoc: push bp ;保存环境
push bx
push cx
push dx
mov bp, 0 ;记录除法的次数
dtoc_s1: mov bx, 10
mov dx, 0
div bx
add dx, 30H
push dx ;将分离出来的数字以ASCII码值入栈
inc bp
mov cx, ax ;判断商是否为0
jcxz dtoc_s2
jmp short dtoc_s1
dtoc_s2: mov cx, bp
dtoc_s3: pop ax
mov es:[si], al
inc si
loop dtoc_s3
mov byte ptr es:[si], 0 ;字符串以0为结尾符
pop dx ;恢复环境
pop cx
pop bx
pop bp
ret
;名称:dwtoc
;功能:将dword型数据转变为表示十进制数的字符串,字符串以0为结尾符。
;参数:(ax)=dword型数据的低16位
; (dx)=dword型数据的高16位
; es:si指向字符串的首地址
;返回:无
dwtoc: push bp ;保存环境
push bx
push cx
mov bp, 0 ;记录除法的次数
dwtoc_s1: mov cx, 10
call divdw
add cx, 30H
push cx ;将分离出来的数字以ASCII码值入栈
inc bp
mov cx, dx
jcxz dwtoc_s2
jmp short dwtoc_s1
dwtoc_s2: mov cx, ax
jcxz dwtoc_s3
jmp short dwtoc_s1
dwtoc_s3: mov cx, bp
dwtoc_s4: pop ax
mov es:[si], al
inc si
loop dwtoc_s4
mov byte ptr es:[si], 0 ;字符串以0为结尾符
pop cx ;恢复环境
pop bx
pop bp
ret
;名称:Background
;功能:设置背景颜色
;参数:(bx)=列数,(dl)=颜色
Background:
push es
push ax
push cx
push dx
push bx
mov ax, 0B800H
mov es, ax
add bx, bx
add bx, 321
mov cx, 22
Back1: push cx
mov cx, 20
Back2: mov byte ptr es:[bx], dl
add bx, 2
loop Back2
add bx, 120
pop cx
loop Back1
pop bx
pop dx
pop cx
pop ax
pop es
ret
code ends
end start