老問題了,今天突然想起來實現一下。主要有幾個問題要注意:
(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
retdivision endp
可能不是最優實現,希望有更好的實現交流。
有符號數加減法
題目 設計乙個有符號32位加減法器,輸入opa opb,控制訊號sub為1時,result opa opb,sub為0時,result opa opb.輸出nzcv是符號位,result為負時n 1,result為0時z 1,c是加減法器的carry,v是overflow。分析 對於有符號數,用二進...
組合語言中加減法運算的溢位處理
1.無符號數運算 只有相加才有可能溢位 以及小減大肯定溢位,大減小不會溢位 相加前在編碼前加個0,作為符號位.如果結果的符號為1,則溢位.舉例,12 7 19 溢位 01100 00111 10011 2.有符號數運算 兩個異號數相加或兩個同號數相減,其結果不會溢位 僅當兩個同號數相加或兩個異號數相...
使用移位運算和加減法實現乘除法
這個想法是在做leetcode 的題目29 divide two integers時產生的,原題描述如下 divide two integers without using multiplication,division and mod operator.if it is overflow,retu...