汇编MIPS如何逐位检查值?
Assembly MIPS how to check the value bit by bit?
我正在创建一个程序,让用户输入一个整数,然后检查每一位并计算其二进制值中有多少个 1。因此,如果我输入 4673,我应该得到“4”作为输出,因为有 4 个。这是我下面的代码,出于某种原因,我只得到“0”作为输出。我的猜测是我没有正确地用“andi”和“srl”加载每一位。我一步一步检查它,当涉及到 andi 和 srl $t0 时,$t0 的值永远不会为 1,所以我不能一点一点地移动吗?
.data
Msg: .asciiz "Enter an integer: "
.text
# Print the first message
li $v0, 4
la $a0, Msg
syscall
# Prompt the user to enter the first integer
li $v0, 5
syscall
# Store the first integer in $t0
move $t0, $v0
addi $t3, $zero, 1
main:
bgt $t3, 31, exit
addi $t3, $t3, 1
andi $t0, $v0, 1
srl $t0, $t0, 1
bne $t0, $zero, count
j main
count:
addi, $t1, $t1, 1
# Shift to the next bit and then go back to main
j main
exit:
# Tell the interpreter to get read to print an integer
li $v0, 1
add $a0, $zero, $t1
#Print the integer
syscall
# End the program
li $v0, 10
syscall
您的循环中有这条指令 andi $t0, $v0, 1
。但是 $v0
在循环中永远不会改变,所以你总是得到相同的值。而且无论该值是 0 还是 1,在下一行的 srl
之后都将是 0。
整个 bit-counting 循环可以用这样的东西代替:
li $t1, 0 # number of 1-bits
count_ones:
andi $t2, $t0, 1 # t2 = input & 1
addu $t1, $t1, $t2 # count += (input & 1)
srl $t0, $t0, 1 # input >>= 1
bne $t0, $zero, count_ones # loop until no 1-bits left
请注意,有更有效的方法可以做到这一点,根本没有任何循环。参见 How to count the number of set bits in a 32-bit integer?
我正在创建一个程序,让用户输入一个整数,然后检查每一位并计算其二进制值中有多少个 1。因此,如果我输入 4673,我应该得到“4”作为输出,因为有 4 个。这是我下面的代码,出于某种原因,我只得到“0”作为输出。我的猜测是我没有正确地用“andi”和“srl”加载每一位。我一步一步检查它,当涉及到 andi 和 srl $t0 时,$t0 的值永远不会为 1,所以我不能一点一点地移动吗?
.data
Msg: .asciiz "Enter an integer: "
.text
# Print the first message
li $v0, 4
la $a0, Msg
syscall
# Prompt the user to enter the first integer
li $v0, 5
syscall
# Store the first integer in $t0
move $t0, $v0
addi $t3, $zero, 1
main:
bgt $t3, 31, exit
addi $t3, $t3, 1
andi $t0, $v0, 1
srl $t0, $t0, 1
bne $t0, $zero, count
j main
count:
addi, $t1, $t1, 1
# Shift to the next bit and then go back to main
j main
exit:
# Tell the interpreter to get read to print an integer
li $v0, 1
add $a0, $zero, $t1
#Print the integer
syscall
# End the program
li $v0, 10
syscall
您的循环中有这条指令 andi $t0, $v0, 1
。但是 $v0
在循环中永远不会改变,所以你总是得到相同的值。而且无论该值是 0 还是 1,在下一行的 srl
之后都将是 0。
整个 bit-counting 循环可以用这样的东西代替:
li $t1, 0 # number of 1-bits
count_ones:
andi $t2, $t0, 1 # t2 = input & 1
addu $t1, $t1, $t2 # count += (input & 1)
srl $t0, $t0, 1 # input >>= 1
bne $t0, $zero, count_ones # loop until no 1-bits left
请注意,有更有效的方法可以做到这一点,根本没有任何循环。参见 How to count the number of set bits in a 32-bit integer?