老問題了,今天突然想起來實現一下。主要有幾個問題要注意:
(1)同號則做減法,異號則做加法
(2)運算結束:若“被除數-或+除數”爲0結束,或其符號和“被除數”相反則結束,兩種情況還要做不同的處理
;使用加減法實現有符號數除法
;(1)同號則做減法,異號則做加法
;(2)運算結束:若“被除數-或+除數”爲0結束,或其符號和“被除數”相反則結束,兩種情況還要做不同的處理
;Denlee, 2010/01/14
;macro--testmacro
;測試2個數的符號位
;調用前將2個有符號數分別送入esi和edi
testsign macro
mov ecx, 80000000h
and esi, ecx
and edi, ecx
cmp esi, edi
endm
;procedure--division
;使用加減法實現有符號數除法
;入口:
; eax--被除數
; ebx--除數
;出口:
; eax--餘數
; edx--商
division proc
push ecx
push esi
push edi
mov edx, 0 ;商賦初值0
cmp ebx, edx
;除數爲0退出
jz exit
;同號做減法, 異號做加法
mov esi, eax
mov edi, ebx
testsign
jnz addition
subtraction:
inc edx
mov esi, eax
sub eax, ebx
cmp eax, 0
jz exit
mov edi, eax
;符號變反則結束
testsign
jnz exitsub
jmp subtraction
addition:
dec edx
mov esi, eax
add eax, ebx
cmp eax, 0
jz exit
;符號變反則結束
mov edi, eax
testsign
jnz exitadd
jmp addition
exitadd:
;恢復商
inc edx
;恢復餘數
sub eax, ebx
jmp exit
exitsub:
;恢復商
dec edx
;恢復餘數
add eax, ebx
jmp exit
exit:
pop edi
pop esi
pop ecx
ret
division endp
可能不是最優實現,希望有更好的實現交流。