汇编MIPS:带有伪旋转的十进制到32位二进制

时间:2017-01-07 23:01:10

标签: assembly bit-manipulation mips bit-shift

我最近发现MIPS不会旋转位,但只会移动它们,所以我一直在挖这个洞,为MIPS做一个类似旋转的功能,只要我测试它就可以工作(函数名为“shift”at the代码如下)。基本上它存储给定数字的4个MSB,将其转换为LSB,将数字4位向左移动,然后将前MSB转向的LSB与移位数相关联。

Aaaannnd alakazam!该数字向左“旋转”4位。

所以我一直在想通过检查每次旋转的最后4位来完成打印全二进制数的工作。

假设给定的数字如下所示:

aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii

向左旋转4位,我们检查aaaa

的值
bbbb cccc dddd eeee ffff gggg hhhh iiii aaaa

继续旋转,检查并打印bbbb

的值
cccc dddd eeee ffff gggg hhhh iiii aaaa bbbb

直到我们最终得到我们开始的相同数字并检查最后4位,iiii

。 。

aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii

但是我的代码一直存在问题,一直在添加0,直到编译器崩溃。

.text
main:
li  $v0, 5          #v0 = the given integer
syscall

move $t1, $v0           moving the integer to t1

add $s1, $zero, $zero   #s1 = counter

shifting:
    andi    $t2, $t1, 0xF0000000    #t2 = the 4 MSB's that get pushed to the left
    srl     $t3, $t2, 28        #turning them to LSB's

    sll     $t4, $t1, 4         #shifting the integer

    or      $t5, $t3, $t4       #$t5 = the pseudo-rotated number


loop:
    andi    $t6, $t5, 0xF       #isolating the 4 new LSB's
    beq $t6, 0xF, one           #print 1's where is necessary 

    li  $v0, 1         #else print 0's
    la  $a0, 0
    syscall
j shifting  

next:
    addi    $s1, $s1, 1
    beq     $s1, 32, exit    #stop printing at 32 numbers

one:                #printing the aces
    li  $v0, 1
    la  $a0, 1
    syscall
j shifting  

exit:
li  $v0, 10
syscall

似乎我已经厌倦了对这件事的思考,我无法真正跟上循环。

我的代码出了什么问题?

1 个答案:

答案 0 :(得分:0)

所以我暂时失去了一点焦点,但我得到了它的工作:

.text
main:
li  $v0, 5          #v0 = the given integer
syscall

move    $t1, $v0        #moving integer to t1

add $s2, $zero, $zero   #counter for all the 4bits

shifting:

    andi    $t2, $t1, 0xF0000000    #t2 = the 4 MSB's that get pushed to the left
    srl $t3, $t2, 28         #turning them to LSB's

    sll     $t4, $t1, 4          #shifting the integer

    or  $t5, $t3, $t4       #$t5 = the pseudo-rotated number  

    andi    $t6, $t5, 0xF       #isolating the 4 LSB's

check:  

    beq     $s2, 8, exit        #32 bits = 8x 4bits
    addi    $s2, $s2, 1     #adding the counter for the 4bits

    li  $v0, 11         #spaces between 4bits
    li  $a0, ' '
    syscall

    add $s1, $zero, $zero   #counter for each bit in a 4bit

bts:
    andi    $a0, $t6, 8         #4bit AND 8
    beq     $a0, 8, one     #if a0 = 8 print 1

    li  $v0, 1          #else print 0
    li  $a0, 0
    syscall

next:
    sll     $t6, $t6, 1     #shift the bit to the left

    addi    $s1, $s1, 1     #adding the counter for one 4bit

    move    $t1, $t5        #shift the pseudo-rotated number next time

    beq $s1, 4, shifting    #make sure the 4bit will have 4 bits

one:            #function that prints 1's
    li  $v0, 1
    li  $a0, 1
    syscall
j next  

exit:
li  $v0, 10
syscall

当我有时间的时候,我会尝试让它适用于浮点数。