MIPS 無符號除法

2022-06-18 04:12:07 字數 1810 閱讀 2910

用mips實現divu,被除數$a0,除數$a1,商$v0,餘數$v1,具體細節已寫在注釋。如有錯誤請指正。

.data

error:

.ascii

"the divisor can't not be zero!

"#若除數為0則報錯

space:

.ascii ""

#空格,輸出時將商和餘數分開

.text

main:

li $v0

5#輸入被除數$a0 同時作為餘數

syscall

addu $a0 $v0 $

0li $v0

5#輸入除數$a1,並且除數開始放在高32位

syscall

addu $a1 $v0 $

0beq $a1

0print_error #若除數為0則報錯

li $s0

0#$s0儲存除數的低32位

li $t2

0#$t2記錄過程執行次數

li $v0

0#$v0儲存商

divv:

slti $t1 $a1

1#判斷除數的高32位是否為0 若不為0被除數必定小於除數 直接進入移位部分

beq $t1

0shift

sleu $t1 $s0 $a0 #判斷除數是否大於餘數 若大於直接進入移位部分

beq $t1

0shift

sub $a0 $a0 $s0 #餘數不小於除數 餘數=餘數-除數

shift:

sll $v0 $v0

1#商左移一位

add $v0 $v0 $t1 #根據上面的判斷情況對最後一位置位:若餘數大於除數置1 否則置0

andi $t1 $a1

1#$t1取除數的高32位的最後一位

srl $a1 $a1

1#除數的高32位右移一位

srl $s0 $s0

1#除數的低32位右移一位

sll $t1 $t1

31#$t1左移31位

or $s0 $s0 $t1 #將除數的低32位與$t1取或 這樣便能將原先高32位最後一位成功右移到低32位

addi $t2 $t2

1#計數器加1

slti $t1 $t2

33#判斷執行次數是否達到33次 若未達到進入下一次迴圈

bne $t1

0divv

print:

move $v1 $a0 #將餘數儲存到$v1

move $a0 $v0 #列印商

li $v0

1syscall

la $a0 space

li $v0

4syscall

move $a0 $v1 #列印餘數

li $v0

1syscall

j exit

print_error: #列印錯誤資訊

la $a0 error

li $v0

4syscall

exit: #退出程式

li $v0

10syscall

用移位和加減運算實現無符號整數除法

同樣是同學遇到的面試題,面試官問的原題是如何用移位和加減實現除以3的操作,在此略微擴充一下,實現無符號整數除法,但是返回值也為無符號整型。方法一 類似小學學習的除法運算,從高位開始減去除數,此處用除數左移到跟被除數對齊,在相減之前商也同樣需要左移,如下。include using namespace...

有符號與無符號

最高位為1,表示這個數為負數 最高位為0,表示這個數為正數 include int main 執行結果 正數的補碼為正數本身 負數的補碼為負數的絕對值各位取反後加1 8位整數5的補碼為 0000 0101 8位整數 7的補碼為 1111 1001 16位整數20的補碼為 0000 0000 0001...

無符號與有符號

一,小精度往大精度轉換。1.1c語言中比int小的整型 包括short unsigned short unsigned char和char 在運算中都要轉換成int然後進行運算 unsigned char a unsigned char b a b 10,a和b分別先轉換成int,再計算 1.2同精...