MIPS汇编 - 如何清除一下

时间:2015-04-23 20:08:47

标签: bit-manipulation mips

我正在为一个班级完成一项任务,而且教练对于我们应该如何“清楚一点”一直非常清楚。 该任命是:

clr0获取其参数值,清除该值中的位0,并返回结果。例如1011变为1010”

我试过了:

 clr0:
   andi $v0, $a0, 0
   jr $ra

但该值不会将第0位设置为0。 我做错了什么?

3 个答案:

答案 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