汇编 MIPS:带伪旋转的十进制到 32 位二进制
Assembly MIPS: decimal to 32-bit binary with pseudo-rotating
我最近发现 MIPS 不旋转位,而只移动它们,所以我一直在挖掘这个洞,为 MIPS 制作一个类似旋转的函数,就我测试它而言它可以工作(函数名为 "shifting" 在下面的代码中)。基本上它存储给定数字的 4 个 MSB,将其转换为 LSB,将数字向左移动 4 位,然后将前 MSB 转换为 LSB 与移位后的数字连接起来。
啊啊啊啊啊啊!数字是"rotated"向左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
看来我对这件事想得太多了,我真的跟不上循环了。
我的代码有什么问题?
所以我暂时失去了一点注意力,但我开始工作了:
.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
有空的时候,我会尝试让它适用于浮点数。
我最近发现 MIPS 不旋转位,而只移动它们,所以我一直在挖掘这个洞,为 MIPS 制作一个类似旋转的函数,就我测试它而言它可以工作(函数名为 "shifting" 在下面的代码中)。基本上它存储给定数字的 4 个 MSB,将其转换为 LSB,将数字向左移动 4 位,然后将前 MSB 转换为 LSB 与移位后的数字连接起来。
啊啊啊啊啊啊!数字是"rotated"向左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
看来我对这件事想得太多了,我真的跟不上循环了。
我的代码有什么问题?
所以我暂时失去了一点注意力,但我开始工作了:
.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
有空的时候,我会尝试让它适用于浮点数。