|
主题 : : 实验七divide overflow问题,很奇怪,到了cx=6时才出现 [待解决] |
回复[ 4次 ]
点击[ 384次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2011-10-25 16:25 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-10-20 18:19 |
代码是这样的
assume cs:codesg,ds:data
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'
;以上是表示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,45257,17800
;以上是表示21年公司雇员人数的21个word型数据
data ends
table segment
db 21 dup ('year sume ne ?? ')
table ends
codesg segment
start: mov ax,table
mov es,ax ;table段地址送es
mov ax,data
mov ds,ax ;把data段送ds
mov bx,0
mov si,0
mov di,0
mov cx,15h ;设置循环数
s: mov ax,ds:[0]
mov es:[bx],ax ;把19送table中
mov ax,ds:[si].2h
mov es:[bx].2h,ax ;把年份后两个ascii码送table中
;以上实现年份送table
mov ax,ds:[di].08ah
mov es:[bx].0ah,ax
;以上实现雇员数送table中
mov ax,ds:[si].54h
mov dx,ds:[si].56h
mov es:[bx].5h,ax
mov es:[bx].07h,ax ;把收入放入dx.ax并送至table
div word ptr es:[bx].0ah ;就是这里,当循环到cx=6时就divide overflow。
mov es:[bx].0dh,ax ;做除法并把商放进table中
add bx,10h
add si,4h
add di,2h
loop s
mov ax,4c00h
int 21h
codesg ends
end start
一开始我是直接到loop那里p,结果就出现divide overflow,后来逐步调试,直到循环到cx=6时才出现divide overflow,编译的exe却没问题,很奇怪,希望各位能够指导一下。 | | |
|
|
|
|
[第1楼]
[ 回复时间:2011-10-25 21:54 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-10-20 18:19 |
|
|
|
|
|
[第2楼]
[ 回复时间:2011-10-26 13:30 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-10-20 18:19 |
又有一个新问题:
assume cs:code,ds:data
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'
;以上是表示21年的21个字符串
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,853530,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型数据
data ends
table segment
db 21 dup ('year sume ne ?? ')
table ends
code segment
start: mov ax,table
mov es,ax ;table段地址送es
mov ax,data
mov ds,ax ;把data送ds
mov bx,0
mov si,0
mov di,0 ;寄存器清零
mov cx,21 ;设置循环数
s: mov ax,ds:[di].0a8h
mov es:[bx].0ah,ax
;以上把雇员数送table中
mov ax,ds:[0]
mov es:[bx],ax ;把19送table
mov dx,[si].2h
mov es:[bx].2h,dx ;把年份后两个ascii码送table
;以上把所有年份送table
mov ax,ds:[si].54h
mov dx,ds:[si].56h ;把总收入的低字节放ax,高字节放dx
mov es:[bx].5h,ax
mov es:[bx].7h,dx ;把收入送入table
div word ptr es:[bx].0ah
mov es:[bx].0dh,ax
;以上作除法后把结果送table
add di,2h
add bx,10h
add si,4h
loop s
mov ax,4c00h
int 21h
code ends
end start
这个代码是正确的,可以编译,执行后夜不会有divide overflow,debug的时候也不会出问题。楼下有另外一段代码,那是有问题的。 | | |
|
|
|
|
[第3楼]
[ 回复时间:2011-10-26 13:36 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-10-20 18:19 |
assume cs:codesg,ds:data
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'
;以上是表示21年的21个字符串
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,853530,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型数据
data ends
table segment
db 21 dup ('year sume ne ?? ')
table ends
codesg segment
start: mov ax,table
mov es,ax ;table段地址送es
mov ax,data
mov ds,ax ;把data段送ds
mov bx,0
mov si,0
mov di,0
mov cx,21 ;设置循环数
s: mov ax,ds:[di].08ah
mov es:[bx].0ah,ax
;以上实现雇员数送table中
mov ax,ds:[0]
mov es:[bx],ax ;把19送table中
mov dx,[si].2h
mov es:[bx].2h,dx ;把年份后两个ascii码送table中
;以上实现年份送table
mov ax,ds:[si].54h
mov dx,ds:[si].56h
mov es:[bx].5h,ax
mov es:[bx].7h,dx ;把收入放入dx.ax并送至table
div word ptr es:[bx].0ah
mov es:[bx].0dh,ax ;做除法并把商放进table中
add bx,10h
add si,4h
add di,2h
loop s
mov ax,4c00h
int 21h
codesg ends
end start
这段是有问题的,在debug的时候用p会出现divide overflow,实际上这两段代码基本上区别是不大的,我就搞不明白了,到底是什么原因导致出现divide overflow这个情况?希望有人可以解释一下。 | | |
|
|
|
|
[第4楼]
[ 回复时间:2012-02-09 17:41 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2012-02-08 18:30 |
s: mov ax,ds:[di].08ah // 这里是a8吧 | | |
|