組み込みの除算演算を使用せずに、MIPS で 2 つの符号付き整数の間で除算を実行する方法を誰かが知っているかどうか疑問に思っています。
問題の仕様では、除数レジスタ、ALU、商レジスタはすべて 32 ビット幅で、剰余レジスタは 64 ビットであると言われています。
さまざまな方法があります -シンプルで高速で、乗算と減算のみを使用するNewton-Raphsonをお勧めします。
乗算が許可されていない場合は、シフト、ビット単位の演算、および加算/減算のみを使用する整数除算アルゴリズムもたくさんあるようです。たとえば、Google で最初にヒットしたもの: www.bearcave.com/software/divide.htm
手でバイナリ除算を実行する方法を考えてみてください。
# a/b, where a=2011 and b=18
1101111 ←quotient
┌──────────── ↓
10010 │ 11111011011 a
-10010↓↓↓↓↓↓ -64b × 1
───────↓↓↓↓↓
11010↓↓↓↓↓
-10010↓↓↓↓↓ -32b × 1
───────↓↓↓↓
10001↓↓↓↓
-00000↓↓↓↓ -16b × 0
───────↓↓↓
100011↓↓↓
-10010↓↓↓ -8b × 1
───────↓↓
100010↓↓
-10010↓↓ -4b × 1
───────↓
100001↓
-10010↓ -2b × 1
───────
11111
-10010 -1b × 1
──────
1101 remainder
この「小学校」の長除算アルゴリズムは (Python で — MIPS に変換させます) 次のように記述できます。
def unsigned_divide(dividend, divisor):
if divisor == 0:
raise ZeroDivisionError()
if dividend < divisor:
return 0
# Determine the position of the first digit of the quotient
shift_amt = dividend.bit_length() - divisor.bit_length()
# Loop to find each bit of the quotient
quotient = 0
while shift_amt >= 0:
# Calculate one bit of the quotient
if dividend >= (divisor << shift_amt):
# new bit is 1
dividend -= (divisor << shift_amt)
quotient |= (1 << shift_amt)
# Move to the next digit
shift_amt -= 1
return quotient
符号付き除算の場合、符号を追跡しながら絶対値を除算できます (C スタイルの切り捨て除算が必要であると仮定します)。
def signed_divide(dividend, divisor):
is_negative = (dividend < 0) ^ (divisor < 0)
abs_quotient = unsigned_divide(abs(dividend), abs(divisor))
return -abs_quotient if is_negative else abs_quotient