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. Что не так с моим кодом?


person user3003505    schedule 05.12.2013    source источник
comment
Я не могу найти, где вы конвертируете строку, введенную пользователем, в int.   -  person Klas Lindbäck    schedule 05.12.2013
comment
или $t3,$t2,$t1: я предполагаю, что это имеет эффект t3 = t2 ИЛИ t1 и НЕ t3=t3 ИЛИ t2 или t1... если это так, я думаю, что вы переоцениваете результаты на каждом шаге ....   -  person Pandrei    schedule 05.12.2013
comment
если вы попытаетесь напечатать значение, которое вы только что ввели... без каких-либо битовых манипуляций; Вы получаете ожидаемый результат?... Я проверил код (снова), и он выглядит нормально. Так что, возможно, есть проблема с передачей параметров...   -  person Pandrei    schedule 05.12.2013
comment
Я идиот :) я делал огромную ошибку. я не ожидал результатов в виде кода ASCII. когда мы вводим 1, он равен 00000031, и это означает, что двоичные биты 0000 0000 0000 0000 0000 0000 0011 0001 .. но я думал, что двоичные биты числа 1 равны 0000 0001 .. Вот почему выходные данные отличались от того, что я ожидал..   -  person user3003505    schedule 06.12.2013


Ответы (2)


Я бы посоветовал вам также попробовать использовать компилятор mips, чтобы остановить компиляцию после этапа сборки, если у вас все еще возникают проблемы. Затем вы можете сравнить сгенерированный код. Я бы предложил компилировать без оптимизации.

Эта ссылка должна вам помочь (при условии, что у вас есть доступ к компилятору mips). Как мне скомпилировать сборку с помощью gcc

person chotighoti    schedule 05.12.2013

я делал огромную ошибку. я не ожидал результатов в виде кода ASCII. когда мы вводим 1, он равен 00000031, и это означает, что двоичные биты 0000 0000 0000 0000 0000 0000 0011 0001 .. но я думал, что двоичные биты числа 1 равны 0000 0001 .. Вот почему выходные данные отличались от того, что я ожидал.. — user3003505

person Community    schedule 03.11.2016