是否有任何方法可以在MIPS中找到32位整數的MSB,然後將其替換爲另一個整數的LSB?在MIPS中獲取32位整數的MSB
爲了闡述,假設A = 1000,B = 1001
我需要得到乙即1的MSB和LSB的A的交換這個現在應該成爲1001
是否有任何方法可以在MIPS中找到32位整數的MSB,然後將其替換爲另一個整數的LSB?在MIPS中獲取32位整數的MSB
爲了闡述,假設A = 1000,B = 1001
我需要得到乙即1的MSB和LSB的A的交換這個現在應該成爲1001
# 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
大會很有趣!
一個很好的無分支解決方案。 (您不需要在LI之前執行異或操作,LI是一個合成指令,可以使彙編器根據需要發出清除目標寄存器的代碼,並且不需要SRL之前的代碼 - 無需清零位那將會被移開。) – markgz
根據我的經驗,你確實需要XOR。 AFAIK LI沒有清除寄存器。例如,如果我做LUI然後LI,寄存器不會被清除,並且上半字保持該值(謝謝MIPS God ...)。是的,你是對的,AND掩碼沒有用,我沒有注意到,但無論如何,它顯示瞭如何設置和使用AND掩碼。此外,編程組裝相當多,我寧願確保註冊表被清除,因爲追逐這樣的錯誤是一個該死的頭痛;) – m0skit0
你是正確的關於LI指令 – m0skit0
1001的最高有效位是1?!你對「MSB」的定義是什麼?這些數字是二元的嗎?即便如此,1001的MSB僅在4位架構上爲1。 –
您應該在MIPS教科書中查找「條件分支」,並使用一個或多個條件分支來選擇要執行的代碼。 – markgz