assume cs:codesg,ds:datasg,ss:stacksg
datasg segment
dw 4 dup (0);保存计算结果,低16位,高16位,余数
datasg ends
stacksg segment
db 128 dup (0)
stacksg ends
codesg segment
start:
mov ax,datasg
mov ds,ax
mov di,0
mov ax,stacksg
mov ss,ax
mov sp,128
mov ax,8480h ;被除数低16位
mov dx,001eh ;被除数高16位
mov cx,0ah ;除数
call divdw
mov ax,4c00h
int 21h
divdw:
;名称:divdw
;功能:进行不会产生溢出的除法运算,
; 被除数为dword型,除数为word
; 型,结果为dword型。
;参数:(ax)=dword型数据的低16位
; (dx)=dword型数据的高16位
; (cx)=除数
;返回:(dx)=结果的高16位
; (ax)=结果的低16位
; (cx)=余数
push ax
push dx
push cx
push bx
push si
mov si,ax ;被除数低16位L暂存
mov ax,dx ;被除数高16位放入ax中
div cl ;(ah)=余数,(al)=商
mov bl,al ;bl暂存计算结果的商
mov dl,ah ;将余数放在dx中准备再除,
mov dh,0 ;相当于乘上65536
mov ax,si ;将被除数低16位L恢复到ax中
div cx
mov cx,dx ;保存余数
mov dl,bl ;保存结果高16位
mov dh,0
mov [di],ax
mov [di+2],dx
mov [di+4],cx
pop si
pop bx
pop cx
pop dx
pop ax
ret
;子程序到此结束
codesg ends
end start
子程序解决除法溢出问题 基于8086汇编
最新推荐文章于 2023-03-16 17:59:17 发布