您的位置:首页 > 其它

汇编语言使用加减法实现有符号数除法

2010-01-14 17:34 447 查看
老问题了,今天突然想起来实现一下。主要有几个问题要注意:

(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

 

可能不是最优实现,希望有更好的实现交流。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  汇编 语言 测试 2010