;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;名稱:divdw
;功能:不會(huì)溢出的除法運(yùn)算
;參數(shù):ax=dword的低16位
;      dx=dword的高16位
;      cx=除數(shù)
;返回:ax=結(jié)果的低16位
;      dx=結(jié)果的高16位
;      cx=余數(shù)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
divdw:
      push bx
      push ax   ;保存低16位
      mov ax,dx
      mov dx,0
      div cx
      mov bx,ax
      pop ax
      div cx
      mov cx,dx
      mov dx,bx
      pop bx
      ret
====================================
該段程序截取自一個(gè)程序,按照程序運(yùn)行結(jié)果是正確的
a.CBW,字節(jié)型擴(kuò)展成字型數(shù)據(jù)
b.CWD,字型擴(kuò)展成雙字型數(shù)據(jù)
c.CWDE,是80386新增的指令。格式:CWDE。功能:將AX的符號(hào)位擴(kuò)展到EAX的高16位中。
d.CDQ,是80386新增的指令。格式:CDQ。功能,將EAX的符號(hào)位擴(kuò)展到EDX中。
e.以上四條指令均不影響標(biāo)志位。
--------------------------
mov eax,600000
mov ecx,1000
idiv ecx 
--------------------------
上面會(huì)出現(xiàn)除法溢出錯(cuò)誤
查找資料是這樣解決的
--------------------------
mov     eax, 600000
  cdq
  mov     ecx, 1000
  idiv    ecx 
--------------------------
還有一個(gè)人是這樣的解決的
這種情況下,用
xor  edx, edx
代替cdq也可以,因?yàn)楸怀龜?shù)是正數(shù)
總之,注意edx寄存器的值!

這種理解就深刻的多了
--------------------------
mov eax,6527363
mov ecx,28732
div ecx
--------------------------
被除數(shù)達(dá)到了雙精度值,所以不能用符號(hào)擴(kuò)展,而只能將高16位送0
我們只要保證edx為0就可以了
--------------------------
xor edx,edx
mov eax,6527363
mov ecx,28732
div ecx
--------------------------
 由此推斷
xor  edx, edx
代替cdq也可以,因?yàn)?#8220;被除數(shù)是正數(shù)”。這樣就不影響符號(hào)位了
問題一:但是假既是負(fù)數(shù)又是雙精度值呢?符號(hào)位如何處理呢?怎么解決的呢?
看來只能按高位低位分別擴(kuò)展,去除符號(hào)位后做無符號(hào)除法。

廢話說了那么多,起初那個(gè)程序的意思也就可以明白了
--------------------------
divdw:
      push bx
      push ax       ;保存低16位
      mov ax,dx   ;高16位值送入ax做除法
      mov dx,0     ;dx置0,[xor dx,dx]
      div cx          ;ax為高16位商,dx為高16位余數(shù)
      mov bx,ax   ;保存高16位結(jié)果在bx中
      pop ax         ;低16位值放入ax
      div cx          ;這里與上面的區(qū)別就是dx未置零,這是理解的關(guān)鍵
                         ;此時(shí)的被除數(shù)包含了上次余數(shù)與低16位拼合的值
                         ;求出的余數(shù)就是32位值的余數(shù),并保存在dx中
                         ;ax中此時(shí)是低16位的商
      mov cx,dx   ;cx中保存余數(shù)
      mov dx,bx   ;高16位結(jié)果放入dx中
      pop bx
      ret
--------------------------
綠色文字是結(jié)果,與文章開始描述一致,紅色文字是理解的關(guān)鍵!