兩數相除比較麻煩。先解釋一下過程(16位CPU, 無符號整數為例 32位數/16位除數)。 DIV命令: 32位的被除數在DX:AX中,DX為高位字; 16位除數為源運算元,結果的16位商在AX中,16位餘數在DX中。 (AX)<-(DX, AX)/(SRC)的商 (DX)<-(DX, AX)/(SRC)的餘數 這裡產生一個問題:16位數最大表示數值為:65535,而如果一個超過16位的被除數,除以1,數學結果應該是商放在AX中,但很顯然,餘數超出了AX的表達範圍,產生了溢位。 所以,解決這個問題,就需要我們設計數學演算法。 1個數,可以以一個比例,分解為高位與低位,比如: 1623,我們以100為比例,可以分隔為高位(16),與低位(23),那麼做除法方式呢?假設除以10 16/10 = 1 餘6 (6*100 + 23)/10 = 62 餘3 1* 100 + 62 = 162 (商) 所結果就是1623/10 = 162 餘 3 ,這明顯計算正確。總結一下: 假定被除數X的高位部分H,低位部分L,除數N,而比例我們則取16位暫存器的進位值 2^16=65536,我們用D表示。 所以,演算法表示為:X/N = int(H/N) * D + [rem(H/N)*D + L]/N int表示數的整數部分,rem表示數的餘數部分。 根據這個演算法,我們就可以編寫一個不產生溢位的彙編除法程式了。 可以參照 我的附件caldiv.asm中的實際。 ----------------------------------------------------------------- 寫完上面部分,才發現我好像偏題了。你是想要一個彙編寫的除法程式做例子吧,而不是想知道如何做彙編不產生溢位的除法。 簡單點寫: code segment assume cs:code start: mov ax, 0ABCDH mov bx, 15 xor dx, dx ; 做0ABCDH/15的除法操作, 16位 div bx ;商在ax中,餘數在dx中 ; 處理 ax的程式碼 ;處理 dx的程式碼,這裡全留空了。 ;除法2, 8位 mov al, 88 mov ah,0 mov cl, 3 div cl ; (ax)/(cl) ,商在al中,餘數在ah中,然後再對計算結果進行處理。 mov ah,4ch int 21h code ends end start
兩數相除比較麻煩。先解釋一下過程(16位CPU, 無符號整數為例 32位數/16位除數)。 DIV命令: 32位的被除數在DX:AX中,DX為高位字; 16位除數為源運算元,結果的16位商在AX中,16位餘數在DX中。 (AX)<-(DX, AX)/(SRC)的商 (DX)<-(DX, AX)/(SRC)的餘數 這裡產生一個問題:16位數最大表示數值為:65535,而如果一個超過16位的被除數,除以1,數學結果應該是商放在AX中,但很顯然,餘數超出了AX的表達範圍,產生了溢位。 所以,解決這個問題,就需要我們設計數學演算法。 1個數,可以以一個比例,分解為高位與低位,比如: 1623,我們以100為比例,可以分隔為高位(16),與低位(23),那麼做除法方式呢?假設除以10 16/10 = 1 餘6 (6*100 + 23)/10 = 62 餘3 1* 100 + 62 = 162 (商) 所結果就是1623/10 = 162 餘 3 ,這明顯計算正確。總結一下: 假定被除數X的高位部分H,低位部分L,除數N,而比例我們則取16位暫存器的進位值 2^16=65536,我們用D表示。 所以,演算法表示為:X/N = int(H/N) * D + [rem(H/N)*D + L]/N int表示數的整數部分,rem表示數的餘數部分。 根據這個演算法,我們就可以編寫一個不產生溢位的彙編除法程式了。 可以參照 我的附件caldiv.asm中的實際。 ----------------------------------------------------------------- 寫完上面部分,才發現我好像偏題了。你是想要一個彙編寫的除法程式做例子吧,而不是想知道如何做彙編不產生溢位的除法。 簡單點寫: code segment assume cs:code start: mov ax, 0ABCDH mov bx, 15 xor dx, dx ; 做0ABCDH/15的除法操作, 16位 div bx ;商在ax中,餘數在dx中 ; 處理 ax的程式碼 ;處理 dx的程式碼,這裡全留空了。 ;除法2, 8位 mov al, 88 mov ah,0 mov cl, 3 div cl ; (ax)/(cl) ,商在al中,餘數在ah中,然後再對計算結果進行處理。 mov ah,4ch int 21h code ends end start