《汇编语⾔》实验10.2解决除法溢出问题
实验10.2
关于div指令
汇编语言要什么基础
div是除法指令,使⽤div做除法的时候应该注意以下问题:
1. 除数:有8位和16位两种,在⼀个reg或内存单元中。
2. 被除数:默认放在AX或DX和AX中,如果除数为8位,被除数则为16位,默认在AX中存放;如果除数为16位,被除数则为32位,
在DX和AX中存放,DX存放⾼16位,AX存放低16位
3. 结果:如果除数为8位,则AL存储出发操作的商,AH存储除法操作的余数;如果除数为16位,则AX存储出发操作的商,DX存储出
发操作的余数。
除法溢出:我们再⽤div指令做除法的时候,很可能发⽣上⾯的情况:为8位除法,除以1000H,其中8位
除法指的是除数为8位,⽐如处以1H,那么结果1000H很明显在AL中是存储不了的,这时这种错误就叫做除法溢出。
我们应该怎样解决这个问题呢?
assume cs:code,ss:stack
stack segement
dw 0,0
stack ends
code segment
start:  mov ax,stack
mov ss,ax
mov sp,10h
mov ax,4240h
mov dx,000fh
mov cx,0ah
call divdw
mov ax,4c00h
int 21h
divdw:  push ax
mov ax,dx
mov dx,0
div cx
mov bx,ax
pop ax
div cx
mov cx,dx
mov dx,bx
ret
code ends
end start
记住,汇编语⾔说到底就是数据的移动转移,因为地⽅有限,所以,这⾥移动⼀点,那⾥移动⼀点。
使⽤“数据流“的思想,会很好理解的。
我们把结果放在ax中,商放在dx中。
⽽被除数默认放在ax和dx中,这难免不了移动。
思路解析:
先开始处理dx吧,那么ax放被除数和结果的,那么ax本⾝的数据就要被移动⼊栈了,就是push ax。
之后应该把要处理的dx放进ax中,但我们要处理的是8位啊,那么dx中还会存在数据,怎么办?当然清零啊!
故有mov ax,dx;mov dx,0
完成之后就可以来进⾏除法运算,除数在cx中,故div cx。算出来的结果商在ax中,我们还要进⾏出栈,要快点把它拿开,放到哪⾥呢?寄存器bx还空闲着,故有mov bx,ax。
⽽之后就可以出栈了pop ax,此时DX还保留着上次的余数呢!
当然啊,因为它是⾼位哇!余数依然作为这次的⾼位啊!
这样,我们只要把低位ax提出来,然后再进⾏除法运算!div cx
结果ax为商,dx为余数,这时dx就是实实在在的余数了。
我们把这些整理⼀下
mov cx,dx mov dx,bx
这样:cx–最后的余数 dx–⾼⼋位的商 ax–低⼋位的商!
可以看出,所谓汇编语⾔难理解,是因为你缺乏机器的思维语⾔,这是你需要明确的,你必须清楚你的数据来⾃哪⾥,要⼲什么,要放哪⾥,遇到冲突怎么办,相关指令的处理机制,当明⽩这些时,你切问题都不是问题了!
你要⽆时⽆刻牢记你原先存储数据的位置,这点⼀定要明确!