組合語言使用加減法實現有符號數除法

2021-05-21 10:25:58 字數 1523 閱讀 6699

老問題了,今天突然想起來實現一下。主要有幾個問題要注意:

(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...