assume cs:code,ds:date
date segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984','1985','1986'
db '1987','1988','1989','1990','1991','1992','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,8226
dw 11542,11430,1527,17800
date ends
table segment
db 21 dup('year summ ne ?? ')
table ends
code segment
start: mov ax,date
mov ds,ax
mov bx,0
mov ax,table
mov es,ax
mov di,0
mov si,0
mov cx,21
s: mov ax,ds:[bx]
mov es:[di],ax
mov ax,ds:[bx+2]
mov es:[di+2],ax
mov ax,ds:54H[bx]
mov es:[di+5],ax
mov ax,ds:54H[bx+2]
mov es:[di+7],ax
mov ax,ds:[si+0A8H]
mov es:[di+10],ax
mov ax,ds:[bx]
mov dx,ds:[bx+2]
div word ptr ds:[si+0A8H]
mov es:[si+14],ax
add bx,4
add si,2
add di,16
loop s
mov ax,4C00H
int 21H
code ends
end start
运行程序的时候说是除法溢出 搞不明白 为什么会溢出 请高手指点 谢谢了
用 DEBUG 跟踪你的程序,发现,溢出的原因,确实是这条除法指令。
不知道你为什么弄这么大的数字,来除以 3 !
这肯定是会溢出的。
-------------------------------
80x86 CPU 具有两种除法指令:16 位除以 8 位数、32 位除以 16 位数。
它们的商,分别是 8 位和 16 位数。
如果,参加运算的被除数较大,或除数较小,那么,商,就会超出预定的位数。
此时,你贸然使用除法指令,就要溢出了。
由此可知,CPU 自身的指令,有局限性,不要轻易的动用。
-------------------------------
为了避免溢出,执行除法指令之前,应该加以判断:
如果被除数的高位,小于除数,就不会发生“溢出”。
但是,最好,是你自己编写一个“不会溢出的”程序。
编程思路如下:
看懂了,就会发现,这程序其实也非常简单。
你自己动手编写,一定会成功的。
在图中,被除数是四个字节:1A 2B 3C 4D。
除以 BL 后,得到的商,也是四个字节。
按照图中的步骤,需要执行四次 DIV BL。
只要 BL 不为零,就绝对不会发生溢出。
按此思路,被除数的字节数,可以继续增加,仅受制于内存的大小。
这就是说:被除数,可以认为是无限的。