assume cs:code
data segment
dd 0,0,0,0,0,0,0,0
dw 0,0,0,0,0,0,0,0
data ends
code segment
start:
mov ax,4240h
mov dx,000fh
mov cx,0ah
call divdw
mov ax,4c00h
int 21h
divdw:
mov bx,data
mov ds,bx ;定义存储单元地址
mov ds:[0],dx
mov dx,0
div cx ;做低位除法
mov ds:[2],ax ;存储低位商
mov ds:[4],dx ;存储低位余数
mov dx,0
mov ax,ds:[0]
div cx ;做高位除法
mov ds:[6],ax ;存储高位商
mov ds:[8],dx ;存储高位余数
mov ax,0
div cx ;用高位余数继续做除法(断言:该除法不超界)
mov ds:[10],ax ;存储高位余数除法的商
mov ds:[12],dx ;存储高位余数除法的余数
mov ax,ds:[4]
add dx,ax
mov ax,dx
mov dx,0
div cx ;用余数之和继续做除法(这里存疑,因为余数之和可能超界)
mov ds:[14],ax ;存储余数之和除法的商
mov ds:[16],dx ;存储余数之和除法的余数
mov cx,ds:[16] ;给出最终余数
mov ax,ds:[2]
mov dx,ds:[10]
add ax,dx
mov dx,ds:[14]
add ax,dx ;给出最终商的低16位(断言:该加法不超界)
mov dx,ds:[6] ;给出最终商的高16位
ret
code ends
end start
问题:解决标示存疑处加法溢出问题,以及该方案的效率