assume cs:code,ds:data,ss:stack,es:table
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991'
db '1992','1993','1994','1995'
;以上是表示21年的21个字符串
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417
dd 197514,345980,590827,803530,1183000,1843000,2759000,3753000
dd 4649000,5937000
;以上表示21年公司总收入
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037
dw 5635,8226,11542,14430,15257,17800
;以上是表示21年的公司雇员人数
data ends
stack segment
dd 30 dup (0)
stack ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
code segment
start:mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,30
mov ax,table
mov es,ax
mov cx,21
mov bx,0
mov si,0
mov bp,0
mov di,0
s1:mov ax,[bx][si]
mov es:[bp][di],ax
mov ax,[bx][si + 2]
mov es:[bp][di + 2],ax ;存入年份
add bx,84
mov ax,[bx][si]
mov dx,[bx][si + 2]
mov es:[bp][di + 5],ax
mov es:[bp][di + 7],dx ;存入当年的收入
mov bx,0
add si,4
add bp,16
loop s1
mov cx,21
mov bx,168
mov si,0
mov bp,0
mov di,0
s2:push cx
mov ax,[bx][si]
mov es:[bp][di + 10],ax ;存入当年的雇员人数
mov ax,es:[bp][di + 5] ;L
mov dx,es:[bp][di + 7] ;H
mov cx,es:[bp][di + 10] ;除数
call divdw
mov es:[bp][di + 13],ax ;存入人均工资
add si,2
add bp,16
pop cx
loop s2
;所有数据都迁移至 table 后,开始进行显示工作
mov cx,21
mov ax,table
mov ds,ax
mov bx,0
mov si,0
mov di,1
show1:push cx ;显示年份
mov ax,di
mov dh,al
mov dl,1
mov cl,2
call show_str1
mov ax,16
mul di
mov si,ax
inc di
pop cx
loop show1
mov cx,21
mov di,1
mov ax,stack
mov ss,ax
mov sp,30
mov ax,table
mov es,ax
mov bx,0
show2:
push cx
push bx
push di
mov ax,table
mov es,ax
mov ax,es:[bx + 5] ;要显示的数据的低4位
mov dx,es:[bx + 7] ;要显示的数据的高4位
mov bx,data
mov ds,bx
mov si,0
mov di,0 ;计算位数
call dtoc
pop di
mov ax,di
mov dh,al ;行号
mov dl,10 ;列号
mov cl,2
mov ax,data
mov ds,ax
mov si,0
call show_str2
pop bx
add bx,16
pop cx
inc di
loop show2
mov cx,21
mov di,1
mov ax,stack
mov ss,ax
mov sp,30
mov ax,table
mov es,ax
mov bx,0
show3:
push cx
push bx
push di
mov ax,table
mov es,ax
mov ax,es:[bx + 10] ;要显示的数据的低4位
mov dx,0 ;要显示的数据的高4位
mov bx,data
mov ds,bx
mov si,0
mov di,0 ;计算位数
call dtoc
pop di
mov ax,di
mov dh,al ;行号
mov dl,25 ;列号
mov cl,2
mov ax,data
mov ds,ax
mov si,0
call show_str2
pop bx
add bx,16
pop cx
inc di
loop show3
mov cx,21
mov di,1
mov ax,stack
mov ss,ax
mov sp,30
mov ax,table
mov es,ax
mov bx,0
show4:
push cx
push bx
push di
mov ax,table
mov es,ax
mov ax,es:[bx + 13] ;要显示的数据的低4位
mov dx,0 ;要显示的数据的高4位
mov bx,data
mov ds,bx
mov si,0
mov di,0 ;计算位数
call dtoc
pop di
mov ax,di
mov dh,al ;行号
mov dl,45 ;列号
mov cl,2
mov ax,data
mov ds,ax
mov si,0
call show_str2
pop bx
add bx,16
pop cx
inc di
loop show4
mov ax,4c00h
int 21h
dtoc:mov bx,10 ;dtoc的功能:先将各个位置的数字压入栈中,再调用
push ax
mov ax,dx ;将H放到低4位
mov dx,0
div bx ;此时ax中存储int(H/N),dx中存储rem(H/N)
mov bp,ax
;乘上65536=16^4,相当于左移四位,也就是将数据放入高4位
pop ax
div bx ;此时ax中存储int(rem(H/N)*65536+L)/N 的商,dx储存余数
add dx,30h
push dx
inc di
mov dx,bp
mov cx,ax ;判断商的低4位是否为0,为0则跳转到dtoc1,继续判断商的高4位是否为0
jcxz dtoc1
inc cx
loop dtoc
dtoc1:mov cx,dx
jcxz dtoc2 ;商的高4位也为0,说明dtoc的运算可以结束了
inc cx
loop dtoc ;否则继续运算
dtoc2:mov cx,di
dtoc3:pop ax
mov [si],ax
inc si
loop dtoc3
ret
divdw:push bp
push ax
mov ax,dx ;将H放到低4位
mov dx,0
div cx ;此时ax中存储int(H/N),dx中存储rem(H/N)
mov bp,ax
;乘上65536=16^4,相当于左移四位,也就是将数据放入高4位
pop ax
div cx ;此时ax中存储int(rem(H/N)*65536+L)/N,dx储存余数
mov cx,dx
mov dx,bp
pop bp
ret
show_str1:mov ah,0
mov al,dl
mov bp,ax
sub bp,1
add bp,bp
mov ax,0b800h
mov es,ax
mov ch,0
push cx
mov cl,dh
sub cx,1
jcxz str1
ss1:add bp,0a0h
loop ss1
str1:mov ch,0
mov cl,ds:[si]
sub cl,20h
jcxz ok1 ;获取当前元素后,判断是否为0
mov al,ds:[si]
mov es:[bp],al
pop cx ;取出字的属性
inc bp
mov es:[bp],cl
push cx ;保存字的属性
inc si
inc bp
loop str1
ok1:pop cx
ret
show_str2:mov ah,0
mov al,dl
mov bp,ax
sub bp,1
add bp,bp
mov ax,0b800h
mov es,ax
mov ch,0
push cx
mov cl,dh
sub cx,1
jcxz str2
sss:add bp,0a0h
loop sss
str2:mov ch,0
mov cl,ds:[si]
jcxz ok2 ;获取当前元素后,判断是否为0
mov al,ds:[si]
mov es:[bp],al
pop cx ;取出字的属性
inc bp
mov es:[bp],cl
push cx ;保存字的属性
inc si
inc bp
loop str2
ok2:pop cx
ret
code ends
end start
【汇编语言第四版 课程设计1代码(自己敲的)】
最新推荐文章于 2024-02-22 21:57:12 发布