汇编语言 实验10.2 解决除法溢出的问题
写给自己的一些题外话: 因为各种各样(考试,加上萎靡的精神状态)的原因,在这一题卡了好几天,就是搞不懂商和余数的表示,直到今天才恍然大悟,下面我先总结一下div的用法,就当做自己的知识梳理了,我知道也没有人会看。。
div
这是汇编语言中的除法运算
格式为:div [bx]
有两种运算模式:
1. 被除数是16位,除数是8位。在这种情况下,被除数放在ax中,除数放在8位reg或者内存单元中。产生的结果:商放在al中,余数放在ah中
2. 被除数是32位,除数是16位。在这种情况下,被除数的高16位放在dx中,低16位放在ax中,除数放在16位reg或者内存单元中。产生的结果:商放在ax中,余数放在dx中。
3. 以上。是不是感觉很绕!
4. 下面开始程序描述
子程序描述
名称:divdw
功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。
参数:
(ax)=dword型数据的低16位
(dx)=dword型数据的高16位
(cx)=除数
返回:
(dx)=结果的高16位
(ax)=结果的低16位
(cx)=余数
应用举例:计算1000000/10(F4240H/0AH)
mov ax,4240H
mov dx,000FH
mov cx,0AH
call divdw
结果:(dx)=0001H,(ax)=86A0H,(cx)=0
代码
assume cs:code,ss:stack
stack segment
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;高八位的商
;此时ax中存储的就是低八位的商
ret
code ends
end start