老问题了,今天突然想起来实现一下。主要有几个问题要注意:
(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
可能不是最优实现,希望有更好的实现交流。