|
10鱼币
啊啊啊,表示楼主受不了,课程设计一已经做了好几天了,但是仍然做不出来,我的问题是:
1.首先人均收入到底是哪个寄存器的值,人均收入如何计算,人均收入如何放置啊
2.为何别人的代码可以直接用div (总收入/人数),却没有出现除法溢出,而我试下不行啊,他的代码如下:(是狂潮的,我复制下)- assume cs:codesg, ds:data, es:data2
- data segment
- db 32 dup(20H)
- data ends
- data2 segment
- ; 年份
- db '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982'
- db '1983', '1984', '1985', '1986', '1987', '1988', '1989', '1990'
- db '1991', '1992', '1993', '1994', '1995'
-
- ; 收入
- dd 16, 22, 382, 1356, 2390, 8000, 16000, 24486, 50065, 97479
- dd 140417,197514, 345980, 590827, 803530, 1183000, 1843000
- dd 2759000, 3753000, 4649000, 5937000
-
- ; 雇员数
- dw 3, 7, 9, 13, 28, 38, 130, 220, 476, 778, 1001, 1442, 2258, 2793
- dw 4037, 5635, 8226, 11542, 14430, 15257, 17800
- data2 ends
- codesg segment
- start:
- mov ax, data
- mov ds, ax
- mov ax, data2
- mov es, ax
-
- mov cx, 21
- mov bp, 0 ; 年份的首地址
- mov bx, 54H ; 收入的首地址
- mov di, 0a8H ; 雇员数的首地址
- mov dh, 4 ; 从第4行开始逐行显示表格
- mov dl, 0 ; 从第0列显示每行信息
- s:
- push cx
- push dx
- mov si, 0 ; 字符串的首地址
- ; 复制年份
- mov ax, es:[bp]
- mov [si], ax
- mov ax, es:2[bp]
- mov 2[si], ax
- add si, 9 ; 9列显示年份
-
- ; 复制收入
- mov ax, es:[bx] ; 收入的低16位
- mov dx, es:2[bx] ; 收入的高16位
- call dtoc
- add si, 9 ; 9列显示收入
-
- ; 复制雇员数
- mov ax, es:[di]
- mov dx, 0
- call dtoc
- add si, 9 ; 9列显示雇员数
-
- ; 复制人均收入
- mov ax, es:[bx] ; 收入的低16位
- mov dx, es:2[bx] ; 收入的高16位
- div word ptr es:[di]
- mov dx, 0
- call dtoc
-
- mov byte ptr 3[si], 0 ; 字符串结束标志设为0
- pop dx
- mov cl, 2 ; 字符显示为绿色
- call show_str
- inc dh ; 行数+1
- add bp, 4 ; 下一个年份
- add bx, 4 ; 下一个收入
- add di, 2 ; 下一个雇员数
- pop cx
- loop s
-
- mov ax, 4c00H
- int 21H
-
- ; 子程序dtoc
- dtoc:
- push bx
- push cx
- push si
-
- mov bx, 0
- s00:
- mov cx, ax
- jcxz ok
- mov cx, 10
- call divdw
- add cx, 30H ; 余数转换为ASCII
- push cx ; 余数入栈
- inc bx ; 数字位数+1
- jmp short s00
- ok:
- mov cx, bx
- c2m:
- pop bx
- mov [si], bl
- inc si
- loop c2m
-
- pop si
- pop cx
- pop bx
- ret
-
- ; 子程序divdw
- divdw:
- push bx
-
- mov bx, ax ; 低16位L暂时存在bx
- mov ax, dx ; 高16位H送到ax
- mov dx, 0
- div cx ; H/N
- push ax ; int(H/N)入栈
- mov ax, bx
- div cx ; [rem(H/N)*65536+L]/N
- mov cx, dx ; 余数送到cx
- pop dx ; int(H/N)出栈
-
- pop bx
- ret
- ; 子程序show_str
- show_str:
- push ax
- push bx
- push bp
- push cx
- push si
- push di
- push es
-
- mov bl, cl ; 字体颜色存在bl中
- mov ax, 0b800H
- mov es, ax ; 显示缓冲区的段地址存在es
- mov ax, 0a0H
- mul dh
- mov bp, ax ; 将第n行的首地址存在bp
- mov ax, 2
- mul dl
- mov di, ax ; 将第n列存在di
- mov si, 0
- ctom:
- mov ch, 0
- mov cl, [si]
- jcxz exit
- mov es:[bp][di], cl
- inc di
- mov es:[bp][di], bl
- inc si
- inc di
- jmp short ctom
- exit:
- pop es
- pop di
- pop si
- pop cx
- pop bp
- pop bx
- pop ax
- ret
- codesg ends
- end start
复制代码
为何他的代码直接除,就可以,我试下就不行.,唉,真受不了了,求解啊.
我的代码为何除法溢出了- assume cs:code,ds:data,es:table
- data 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,2795000,3753000,4649000,5937000
- dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
- dw 11542,14430,15257,17800
- dw 5,3,42,104,85,210,123,111,105,125,140,136,153,211,199,209,224,239
- dw 260,304,333
- data ends
- table segment
- db 21 dup ('year summ ne ?? ')
- table ends
- code segment
- start:
- mov si,0
- mov di,0
- mov bx,0
- mov ax,data
- mov ds,ax
- mov ax,table
- mov es,ax
- mov cx,21
- push cx
- s5:
- mov ax,ds:[si]
- mov es:[di],ax
- mov ax,ds:[si+2]
- mov es:[di+2],ax
- mov ax,ds:[si+84]
- mov es:[di+5],ax
- mov dx,ds:[si+86]
- mov es:[di+7],dx
- mov cx,ds:[bx+168]
- mov es:[di+10],cx
- call chufa
- mov es:[di+13],ax
- add di,16
- add si,4
- add bx,2
- pop cx
- loop s5
- ;kaishi
- mov ax,table
- mov ds,ax
- mov ax,0b800h
- mov es,ax
- mov di,0
- mov si,0
- mov cx,21
- s4:
- push cx
- mov ax,ds:[di]
- mov es:[si],al
- mov es:[si+2],ah
- mov ax,ds:[di+2]
- mov es:[si+4],al
- mov es:[si+6],ah
- mov ax,2
- mov es:[si+1],al
- mov es:[si+3],al
- mov es:[si+5],al
- mov es:[si+7],al ;year
- add si,32
- call dtoc2
-
- mov ax,ds:[di+5]
- mov dx,ds:[di+7] ;sum income
- add si,32
- call dtoc2
-
- mov ax,ds:[di+10]
- add si,64 ;people
- call dtoc2
-
- mov ax,ds:[di+13] ;average
- call dtoc2
-
- add di,16
- add si,32
- pop cx
- loop s4
-
- mov ax,4c00h
- int 21h
- ;除法
- chufa:
- push bx
- push ax
- mov ax,dx
- mov dx,0
- div cx
- mov bx,ax
- pop ax
- div cx
- mov cx,dx
- mov dx,bx
- pop bx
- ret
- ;转换2进制数据,并且变为ascii值
- dtoc2:
- push cx
- push di
- push bx
- push si
- push dx
- mov si,0
- mov di,0
- mov bx,10
- s: mov dx,0
- div bx
- mov cx,ax
- jcxz keyi
- add dx,30h
- push dx
- inc di
- jmp s
- keyi:
- add dx,30h
- push dx
- inc di
- mov cx,di
- s3:
- pop dx
- mov es:[si],dl
- mov ax,2
- mov es:[si+1],al
- add si,2
- loop s3
-
- pop dx
- pop si
- pop bx
- pop di
- pop cx
- ret
- code ends
- end start
复制代码 求解
|
最佳答案
查看完整内容
还有你是想显示完年份,隔开32列,再显示总收入:你在主程序中设置了si=32,但你调用子程序来显示时,有改为了0。所以。。。。。不用我说了吧
|