MIPS反转位代码(从C代码转换)......但它不起作用

时间:2013-12-05 07:55:38

标签: c assembly reverse mips32 mips64

这是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 个答案:

答案 0 :(得分:0)

我建议您也尝试使用mips编译器在汇编阶段后停止编译,以防您遇到麻烦。然后,您可以比较生成的代码。我建议不进行优化编译。

此链接可以帮助您(假设您可以访问mips编译器)。 How can I compile to assembly with gcc

答案 1 :(得分:0)

我犯了一个大错。我不希望输出为ASCII码。当我们输入1时它等于00000031并且它意味着二进制比特0000 0000 0000 0000 0000 0000 0011 0001 ..但我认为数字1的二进制比特等于0000 0001 ..这就是为什么输出与我的不同期待.. - user3003505