assume cs:code,ss:stack
;年份
year 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'
year ends
;收入
income segment
dd 16,22,382,1356,2390,8000,1600,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5973000
income ends
;雇员
employee segment
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,11430,15257,17800
employee ends
table segment
db 756 dup (' ')
table ends
stack segment
dw 32 dup (0)
stack ends
code segment
start:
mov ax,year
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,64
mov bx,0;定义年份递增量
mov si,0;定义table递增量
mov cx,21;循环添加8组数据到table中
loopyear:
;添加年份到table中
mov ax,table
mov es,ax
mov al,[bx]
mov es:[si],al
mov al,[bx+1]
mov es:[si+1],al
mov al,[bx+2]
mov es:[si+2],al
mov al,[bx+3]
mov es:[si+3],al
add bx,4;增加偏移量
add si,36
loop loopyear
mov bx,0;定义收入的递增量
mov si,0;定义table的递增量
mov cx,21;循环添加8组数据到table中
loopincome:
;转换收入为数字字符, 添加到table中
push bx
push si
mov ax,table
mov ds,ax
mov ax,income
mov es,ax
add si,9
mov ax,es:[bx]
mov dx,es:[bx+2]
call ddtoc
pop si
pop bx
add bx,4
add si,36
loop loopincome
mov bx,0;定义雇员的递增量
mov si,0;定义table的递增量
mov cx,21;循环添加8组数据到table中
mov ax,table
mov ds,ax
mov ax,employee
mov es,ax
loopemployee:
push si
mov ax,es:[bx]
mov dx,0
add si,18
call ddtoc
pop si
add bx,2
add si,36
loop loopemployee
mov bx,0;定义收入的递增量
mov si,0;定义table的递增量
mov di,0;定义雇员的递增量
mov cx,21;循环添加8组数据到table中
loopaverage:
push cx
push si
mov ax,income
mov ds,ax
mov ax,employee
mov es,ax
mov ax,ds:[bx]
mov dx,ds:[bx+2]
mov cx,es:[di]
call divdw;商存在dx,ax中, 余数存在cx中
mov cx,table
mov ds,cx
add si,27
call ddtoc
pop si
pop cx
;最后的空格号存为0表示这一行数据的结束,方便打印
mov byte ptr ds:[si+35],0
add bx,4
add si,36
add di,2
loop loopaverage
mov dh,8;行号
mov dl,8;列号
mov cl,02h;绿色字
mov ax,table
mov ds,ax
mov si,0;循环加入字
mov bl,cl
mov cx,21
loopprint:
push cx
push bx
mov cl,bl
call show_str
pop bx
pop cx
mov al,dh;dh+1
mov ah,0
inc ax
mov dh,al
add si,36
loop loopprint
mov ax,4c00h
int 21h
show_str:
;将ds:[si]指向数据一整行打印出来, 0位数据结尾, 打印到es中
push ax
push bx
push es
push cx
push dx
push si
mov ax,0b800h
mov es,ax
mov ax,0a0h
dec dh;从0开始
mul dh
mov bx,ax;保存行结果
mov al,2
mul dl
sub ax,2
add bx,ax;算出起始位置,存在bx中
mov al,cl
mov ch,0
show1:
mov cl,[si]
jcxz ok
mov es:[bx],cl
mov es:[bx+1],al
add bx,2
inc si
jmp short show1
ok:
pop si
pop dx
pop cx
pop es
pop bx
pop ax
ret
ddtoc:
;dx,ax分别存放了数据的高低16位,ds:[si]指向输出位置的首地址
push ax
push cx
push dx
push si
push di
mov di,0;记录入栈次数
dds1:
mov cx,10d;除以10
call divdw;结果存在dx,ax中,余数存在cx中
push cx
mov cx,ax
jcxz dds4
dds5:
pop cx
add cx,30h
push cx
inc di
jmp short dds1
dds4:
mov cx,dx
jcxz dds2
jmp short dds5
dds2:
pop cx
add cx,30h
push cx
inc di
mov cx,di
dds3:
pop ax
mov ds:[si],al
inc si
loop dds3
pop di
pop si
pop dx
pop cx
pop ax
ret
divdw:
;dx,ax分别存放了数据的高低16位,cx位除数,商存储在dx,ax,余数存储在cx
push bx
push ax
mov ax,dx
mov dx,0
div cx;商存储在ax,余数存储在dx
mov bx,ax;保存高位结果
pop ax
div cx;商存储在ax,余数存储在dx
mov cx,dx
mov dx,bx
pop bx
ret
code ends
end start
王爽 汇编 课程设计1
最新推荐文章于 2024-08-23 18:13:09 发布