MIPS反转位代码(从C代码转换而来)…但它不工作
下面是C代码:MIPS反转位代码(从C代码转换而来)…但它不工作,c,assembly,reverse,mips32,mips64,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) &
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));
}
我试图将C代码转换为MIPS,但它不能正常工作。输出通常是负整数。请帮助我将此代码转换为MIPS程序集。我的代码出了什么问题?我建议您也尝试使用mips编译器在汇编阶段之后停止编译,以防仍然遇到问题。然后可以比较生成的代码。我建议编译时不要进行优化 此链接应该对您有所帮助(假设您可以访问mips编译器)。
我犯了一个巨大的错误。我不希望输出为ASCII码。当我们输入1时,它等于00000031,表示二进制位0000 0011 0001。。但我认为数字1的二进制位等于0000 0001..这就是为什么输出与我预期的不同user3003505我找不到将用户输入的字符串转换为
int
的位置。或者$t3,$t2,$t1:我假设这会产生t3=t2或t1的效果,而不是t3=t3或t2或t1……如果是这样,我认为您在每一步的结果都是过火了……如果您试图打印刚刚输入的值……而没有任何位操作;你得到预期的输出了吗?…我已经(再次)检查了代码,它看起来很好。因此,传递参数可能有问题……我是个白痴:)我犯了一个巨大的错误。我不希望输出为ASCII码。当我们输入1时,它等于00000031,表示二进制位0000 0011 0001。。但我认为数字1的二进制位等于0000 0001..这就是为什么输出与我预期的不同。。
.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