MIPS обратный код битов (преобразованный из кода C) ... Но это не работает
Вот код C:
unsigned int reverse(register unsigned int x)
{
x = (((x & 0xaaaaaaaa) >> 1) | ((x & 0x55555555) << 1));
x = (((x & 0xcccccccc) >> 2) | ((x & 0x33333333) << 2));
x = (((x & 0xf0f0f0f0) >> 4) | ((x & 0x0f0f0f0f) << 4));
x = (((x & 0xff00ff00) >> 8) | ((x & 0x00ff00ff) << 8));
return((x >> 16) | (x << 16));
}
А вот мой код сборки MIPS:
.data
prompt:
.asciiz " please enter a binary number of up to 8 digits: \n"
prompt2:
.asciiz " / "
.text
.globl main
main:
la $a0, prompt
li $v0,4
syscall
li $v0,5
syscall
move $t3,$v0
andi $t0,$t3,0xAAAAAAAA
srl $t1,$t0,1
andi $t0,$t3,0x55555555
sll $t2,$t0,1
or $t3,$t2,$t1
andi $t0,$t3,0xCCCCCCCC
srl $t1,$t0,2
andi $t0,$t3,0x33333333
sll $t2,$t0,2
or $t3,$t2,$t1
andi $t0,$t3,0xF0F0F0F0
srl $t1,$t0,4
andi $t0,$t3,0x0F0F0F0F
sll $t2,$t0,4
or $t3,$t2,$t1
andi $t0,$t3,0xFF00FF00
srl $t1,$t0,8
andi $t0,$t3,0x00FF00FF
sll $t2,$t0,8
or $t3,$t2,$t1
srl $t1,$t3,16
sll $t2,$t3,16
or $t3,$t2,$t1
la $a0,prompt2
li $v0,4
syscall
move $a0,$t3
li $v0,1
syscall
li $v0,10
syscall
Я пытался преобразовать код C в MIPS, но он не работает должным образом. Выходные данные обычно являются отрицательными целыми числами. Пожалуйста, помогите мне преобразовать этот код в сборку MIPS. Что не так с моим кодом?
2 ответа
Я делал огромную ошибку. я не ожидал выходных данных в виде кода ASCII. когда мы вводим 1, это равняется 00000031, и это означает, что двоичные биты 0000 0000 0000 0000 0000 0000 0011 0001.. но я думал, что двоичные биты числа 1 равны 0000 0001.. Именно поэтому выходные данные отличались от того, что я ожидал.. - user3003505
Я бы посоветовал вам также попробовать использовать компилятор mips, чтобы остановить компиляцию после этапа сборки на случай, если у вас по-прежнему возникают проблемы. Затем вы можете сравнить сгенерированный код. Я бы предложил компилировать без оптимизаций.
Эта ссылка должна вам помочь (при условии, что у вас есть доступ к компилятору mips). Как я могу скомпилировать в сборку с GCC