其他两个子程序:
1.编写子程序-显示字符串 https://blog.csdn.net/qq_41700629/article/details/89426234
3.编写子程序-数值显示 https://blog.csdn.net/qq_41700629/article/details/89447439
2.编写子程序-解决除法溢出的问题
子程序描述
名称:divdw
功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。
参数:(ax)=dword型数据的低16位
(dx)=dword型数据的高16位
(cx)=除数
返回:(dx)=结果的高16位,(ax)=结果的低16位
(cx)=余数
应用举例:计算1000000/10(FA240H/0AH)
提示
结出一个公式:
X: 被除数,范围:[0,FFFFFFFF]
N: 除数,范围:[0,FFFF]
H: X高16位,范围:[0,FFFF]
L: X低16位,范围:[0,FFFF]
int():描述性运算符,取商,比如:int(38/10)=3
rem():描述性运算符,取余数,比如:rem(38/10)=8
公式:X/N=int(H/N)*65536+[rem(H/N)*65536+L]/N
这里的65536为10000H,也就是说,int(H/N)*10000H为高16位的商,而[rem(H/N)*65536+L]/N得到的是低16位的商和余数;
这个公式将可能产生溢出的除法运算:X/N,转变为多个不会产生溢出的除法运算公式中,等号右边的所有除法运算都可以用div指令来做,肯定不会导致溢出。
参考代码:
assume cs:code
data segment
data ends
stack segment
dw 0,0,0,0,0,0,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 cx,4200h
int 21h
divdw:
push ax ;保存被除数低16位
mov ax,dx
mov dx,0h
div cx ;高16位先除
mov si,ax ;高16位先除的商放在si,商还在dx中,当做低16位除的高16位
pop ax ;恢复低16位到ax中
div cx
mov cx,dx ;最终商的余数
mov dx,si ;高16位先除的商也是最终商的高16位,最终商的低16为就在ax中
ret
code ends
end start
结果图: