assume cs:code,ss:stack
stack segment
?? ?dw 16 dup(0)
stack ends
code segment
start:?? ?mov ax,4240H
?? ??? ?mov dx,000FH
?? ??? ?mov cx,0AH
?? ??? ?call divdw
?? ??? ?mov ax,4C00H
?? ??? ?int 21H
;子程序说明
;参数????ax 存放被除数低16位
;????????? dx 存放被除数高16位
;?? ??? ?? cx 存放除数
;返回值?? ?dx 存放商的高16位
;?? ??? ?????? ax 存放商果的低16位
;?? ??? ?????? cx 存放余数
?? ?divdw:
?? ??? ?push si?? ???? ;这个子程序只需要入栈保护si一个寄存器 因为ax,cx,dx是要作为出口参数返回的,如果子程序结束出栈恢复寄存器则会覆盖作为出口参数的值
?? ??? ?push ax?? ??? ? ;保存被除数低位 此操作不是为了保护原寄存器
?? ??? ?mov ax,dx?? ? ;准备做被除数高位的除法
?? ??? ?mov dx,0?????? ;除数是16位则被除数是32位,dx放高位
?? ??? ?div cx?????????????;执行完后ax存放高位除法的商,dx存放高位除法的余数
?? ??? ?mov si,ax?? ??? ;高位除法商保存
?? ??? ?pop ax?? ??? ??? ;低位还原到ax寄存器,此时dx是余数,刚好对应了公式中的rem(H/N)*65536+L
?? ??? ?div cx?? ??? ???? ;执行结束后ax存放低位除法的商,dx是余数
?? ??? ?mov cx,dx?? ? ;将余数存到cx用于返回
?? ??? ?mov dx,si?? ?? ;将高位商存到dx用于返回
?? ??? ?
?? ??? ?pop si
?? ??? ?ret
code ends
end start
;突破点:乘65536指的是高16位和低16位的关系 并不是要进行乘法运算