2011-09-26 91 views
1

是否有任何方法可以在MIPS中找到32位整數的MSB,然後將其替換爲另一個整數的LSB?在MIPS中獲取32位整數的MSB

爲了闡述,假設A = 1000,B = 1001

我需要得到乙即1的MSB和LSB的A的交換這個現在應該成爲1001

+0

1001的最高有效位是1?!你對「MSB」的定義是什麼?這些數字是二元的嗎?即便如此,1001的MSB僅在4位架構上爲1。 –

+0

您應該在MIPS教科書中查找「條件分支」,並使用一個或多個條件分支來選擇要執行的代碼。 – markgz

回答

2
# Integer 1 -> $a0 
# Integer 2 -> $a1 
# Result -> $a3 
# Setting up retreiving mask 
xor  $t0, $t0, $t0 
lui  $t0, 0x8000 

# Extracting MSB 
and  $t1, $a0, $t0 

# Moving MSB to LSB 
srl  $t1, $t1, 31 

# Setting up setting mask 
xor  $t0, $t0, $t0 
li  $t0, 0x0001 

# Applying r = a^((a^b) & mask) 
# a = $a1 
# b = $t1 
# mask = $t0 
xor  $t2, $a1, $t1 
and  $t2, $t2, $t0 
xor  $a3, $a1, $t2 

大會很有趣!

+1

一個很好的無分支解決方案。 (您不需要在LI之前執行異或操作,LI是一個合成指令,可以使彙編器根據需要發出清除目標寄存器的代碼,並且不需要SRL之前的代碼 - 無需清零位那將會被移開。) – markgz

+0

根據我的經驗,你確實需要XOR。 AFAIK LI沒有清除寄存器。例如,如果我做LUI然後LI,寄存器不會被清除,並且上半字保持該值(謝謝MIPS God ...)。是的,你是對的,AND掩碼沒有用,我沒有注意到,但無論如何,它顯示瞭如何設置和使用AND掩碼。此外,編程組裝相當多,我寧願確保註冊表被清除,因爲追逐這樣的錯誤是一個該死的頭痛;) – m0skit0

+0

你是正確的關於LI指令 – m0skit0