课程设计1
assume cs:codesg,ss:stack,ds:datadata 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'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,5635,8226
dw 11542,14430,15257,17800
data ends
stack segment
dd 16 dup(0) ;40h 空间
stack ends
codesg segment
start: mov ah,9
int 10h
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,40h
mov si,0 ;数据段的偏移地址
mov ax,0b828h ;显存的段地址
mov es,ax
call yaer ;先取出年份,一共20个年份
mov cx,21
add si,54H
mov bp,54H
mov di,ax
s1: push cx
mov ax,ds: ;总工资
mov dx,ds:
mov bx,28h
call dtoc
mov cx,ds: ;公司人数
push ax
push dx
push cx
mov ax,cx
mov dx,0
mov bx,50h
call dtoc
pop cx
pop dx
pop ax
div cx ;得到最后的人均值 ax
mov dx,0
mov bx,78h
call dtoc
add bp,4
add si,2
add di,0ah
mov es,di
pop cx
loop s1
mov ax,4c00h
int 21h
;保存年
yaer:
mov cx,21
mov bx,0
push ax
y:
mov dx,ds:
mov es:,dl
mov byte ptr es:,07h
mov es:,dh
mov byte ptr es:,07h
mov dx,ds:
mov es:,dl
mov byte ptr es:,07h
mov es:,dh
mov byte ptr es:,07h
add si,4
add ax,0ah ;跳转到下一行
mov es,ax
loop y
pop ax
mov es,ax
ret
dtoc: push ax
push dx
push si
mov si,0
mov cx,10
s2: ;取余
call divdw ; dx高位ax 低位cx余数
push cx
mov cx,ax
inc si
jcxz ok_dtoc1 ;完成取余工作inc si
mov cx,0bH
loop s2
ok_dtoc1:
mov cx,si ;开始颠倒刚开始取余的值
mov si,0
ss1: pop ax
add ax,30h
mov ah,07h
mov es:,ax
add si,2
loop ss1
mov word ptr es:,0h ;表示已经结束
pop si
pop dx
pop ax
ret ;已经完成对字量常数的转变
;16位不溢出除法
divdw: push bx
push ax ;底地址入栈s
mov ax,dx
mov dx,0
div cx ;除以高地址
mov bx,ax ;将结果保存
pop ax ;取出低地址进行剩下的16位计算
div cx
mov cx,dx ;保存余数
mov dx,bx ;保存高位
pop bx
ret
codesg ends
end start
野路子,除了溢出除法不是自己写的其他的都是自己独立完成(除法那个实在是思考不出来,或则说 路 走错了)
如果不加前面的mov ah,9int 10h 中断,那就无法显示(或者说显示了,但是太快了)
其他的都还好,一步一步debug还是能发现自己构思的过程中的一些不严谨的地方.然后加以改成,
好的程序是改出来的,
页:
[1]