我正在为一个班级完成一项任务,而且教练对于我们应该如何“清楚一点”一直非常清楚。 该任命是:
“clr0
获取其参数值,清除该值中的位0,并返回结果。例如1011变为1010”
我试过了:
clr0:
andi $v0, $a0, 0
jr $ra
但该值不会将第0位设置为0。 我做错了什么?
答案 0 :(得分:0)
让我们来看看and
的作用。来自Wikipedia:
and $d,$s,$t $d = $s & $t
因此,代码中的$v
将被设置为$a0
与0进行对比。好吧,任何与0的AND都是0.所以如果你有32位寄存器,你不会想要像< / p>
clr0: lui $a1, 65535 # start constructing the constant, so upper bits of v1 are all 1
ori $a1, $a1, 65534 # finish constructing the constant, so that only 0th bit is 0
and $v0, $a0, $a1 #mask out the 0th bit of a0
jr $ra
这意味着除了第0位之外的所有位都保持不变,并且第0位被强制为0。
我刚刚对此进行了编辑,考虑到andi
只需要16位常量 - 所以首先我们在自由寄存器中构造常量,然后是AND。我没有方便的编译器,也不记得哪个MIPS寄存器可以免费用于派对功能,但是与此非常相似的东西应该可以完成工作。
这是一个小型驱动程序,可以调用clr0
main: li $a0, 5
and $v0, $v0, 0
jal clr0 #after this, investigate the value of $v0.
jr $ra # retrun to caller
答案 1 :(得分:0)
li $t0, 1 # $t0 = 0x00000001
not $t0, $t0 # $t0 = 0xfffffffe
and $v0, $a0, $t0 # clear bit 0 of $v0
前两条指令将$t0
中的所有位设置为1
,但位0除外。And
- 1
位使该位保持不变。 And
0
稍微将该位设置为0
。因此$a0
的所有位都移动到$v0
,但位0设置为0
除外。
答案 2 :(得分:0)
#Here is the program
#A Program to clear bit. Suppose we have 11 = 1011 (in binary) &
#when we apply bit manipulation for a clearing last bit,
#it changes from 1011 to 1010 #that is 10(decimal)
#To do this we need a mask.
.data
.text
main:
li $v0, 5
syscall
move $a0, $v0
jal bitmanipulate
#when bitmanipulate function ends, the $v0 still have
#the result of the bitmanipulate.
move $s0, $v0
li $v0, 1
move $a0, $s0
syscall
li $v0, 10 #terminating the program
syscall
bitmanipulate:
#making mask, following two line is the making of mask.
addi $s0, $zero, -1 #s0 = -1, so it will be
#presented as ...11111111 (32 times 1, if presenting number in 32 bit)
sll $s0, $s0, 1 #now $s0 = ...11111110,
#shifting one bit to left
and $v0, $a0, $s0 #
#$v0 store the result of the function
jr $ra