這個問題最近出現了好幾次。該算法類似於使用鉛筆和紙張進行分割,將多個數字的分配除以單個數字除數。這是一個代碼片段,64位保留在edi:esi中。請注意,同樣的方法可以擴展爲將存儲在存儲器中的非常大的除數除以32位除數。
.data
decstr db 24 dup (0)
pfstr db '%','s',0dh,0ah,0
.code
extrn _printf:NEAR
_main proc near
mov edi,000000002h ;edi = high order dvnd
mov esi,04CB016EAh ;esi = low order dvnd
lea ebx,decstr+23 ;ebx = ptr to end string
mov ecx,10 ;ecx = 10 (constant)
div0: xor edx,edx ;clear edx
mov eax,edi ;divide high order
div ecx
mov edi,eax
mov eax,esi ;divide low order
div ecx
mov esi,eax
add dl,'0' ;store ascii digit
dec ebx
mov [ebx],dl
mov eax,edi ;repeat till dvnd == 0
or eax,esi
jnz div0
push ebx ;display string
push offset pfstr
call _printf
add sp,8
xor eax,eax
ret
_main endp
我建議你使用迭代減法,這應該很容易實現,你甚至可以以正確的順序數字;) – Jester
[DIV](http://www.felixcloutier.com/x86/DIV .html)已經將edx:eax除以源操作數,做64b/32b => 32b除法。問題在於,如果商不符合eax,它會出現分割錯誤(與零除相同)。在Linux上這會觸發一個SIGFPE。如果你只需要rcgldr的答案,如果商可能需要64位。 –