当前位置: 代码迷 >> 汇编语言 >> 求教一个关于不会溢出的除法解决方案
  详细解决方案

求教一个关于不会溢出的除法解决方案

热度:7184   发布时间:2013-02-26 00:00:00.0
求教一个关于不会溢出的除法
名称:divdw
进行不会yi出的除法运算,被除数dword型除数word型结果dword
参数:ax=dword型的底16位
dx=dword型的高16位
返回:dx=结果的高16位
ax=结果的底16位
cx=余数
计算1000000/10(F4240H/0AH)


------解决方案--------------------------------------------------------
你是在做王爽老师汇编书里的题目吧.

自己写的.注释混乱,将就着看;)
assume cs:codesg

datasg segment
dw 32 dup(0)
datasg ends

codesg segment

start:
mov ax,datasg
mov ds,ax
mov si,0

mov ax,4240h
mov dx,0fh
mov cx,0ah
call divdw


mov ax,4c00h
int 21h

divdw:


push si
push bx


mov [si],ax ;save L
mov ax,dx
mov dx,0h
div cx
mov [si+2],dx ;save rem(H/N)
mov bx,1000h ;cut 65536 for 1000h and 10h
mul bx
mov [si+4],dx ;保存int(H/N)*1000h的商的高16位
mov bx,10h
mul bx
mov [si+6],dx ;保存int(H/N)*1000h的低16位乘10h的商的高16位
mov [si+8],ax ;保存int(H/N)*1000h的低16位乘10h的商的低16位(暨int(H/N)*65536的商的低16位)
mov ax,[si+4] ;提取int(H/N)*1000h的商的高16位
mul bx
add ax,[si+6]
mov [si+10],ax ;保存int(H/N)*65536的高16位

mov ax,[si+2] ;提取rem(H/N)
mov bx,1000h
mul bx
mov [si+12],dx ;保存rem(H/N)*1000h的商的高16位
mov bx,10h
mul bx
mov [si+14],ax ;保存renm(H/N)*1000h的商的低16位乘10h的商的低16位
mov [si+16],dx ;保存rem(H/N)*1000h的商的低16位乘10h的商的高16位
mov ax,[si+12]
mul bx
add ax,[si+16]
mov dx,ax ;保存rem(H/N)*65536的商的高16位
mov ax,[si+14] ;提取rem(H/N)*65536的商的低16位
add ax,[si] ;rem(H/N)*65536的商的低16位加L
div cx
mov cx,dx

mov dx,[si+10]
add ax,[si+8]


pop bx
pop si
ret


codesg ends
end start
------解决方案--------------------------------------------------------
帮顶,混个脸熟!
  相关解决方案