1

这是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 程序集。我的代码有什么问题?

4

2 回答 2

0

我建议您也尝试使用 mips 编译器在组装阶段之后停止编译,以防您仍然遇到问题。然后您可以比较生成的代码。我建议在没有优化的情况下进行编译。

此链接应该可以帮助您(假设您可以访问 mips 编译器)。 如何使用 gcc 编译为程序集

于 2013-12-05T08:25:23.157 回答
0

我犯了一个巨大的错误。我没想到输出是 ASCII 码。当我们输入 1 时,它等于 00000031,这意味着二进制位 0000 0000 0000 0000 0000 0000 0011 0001 .. 但我认为数字 1 的二进制位等于 0000 0001 ..这就是为什么输出与我不同的原因期待.. – user3003505

于 2016-11-03T07:46:42.343 回答