汇编语言中的逻辑指令具有强大的功能,它们可以实现的不只是逻辑计算,也常常用于屏蔽位,组合位等功能。
逻辑指令中的R-指令
MIPS中的逻辑操作包括and,or,xor,nor,都是按位操作。这些逻辑操作都有相应的指令,也有各自不同的用法功能。
and
and可以用于屏蔽位,即将不用的位清零。
and $s1, $s2, $s3
# $s2 = 0xFFFF0000
# $s3 = 0x8A4C5321
# add指令执行后,$s1 = 0x8A4C0000
从例中可见,add屏蔽了$s3
的低16位。
通过改变$s2
中为0的位,可以屏蔽$s3
中任何一个子集,对于以其他寄存器为操作数的and指令也是如此。
看到这个,我不禁联想到C语言中数组的清零,感觉如果数组中每个元素都与$0
进行and操作,就可以实现清零,不知道实际操作是什么样的
or
or可以用于组合位,将不同寄存器中的内容组合在一起。
or $s1, $s2, $s3
# $s2 = 0xFFFF0000
# $s3 = 0x00005321
# add指令执行后,$s1 = 0xFFFF5321
这里可以见到$s2
的高十六位与$s3
的低十六位组合在了一起,其他实现组合作用的or指令也都像这样。
nor
注意到,MIPS逻辑操作中并没有not指令。其实not指令可以由nor轻松实现。
将需要取否的寄存器作为操作数与$0
进行nor操作,该寄存器中为1的位由于与0不同,故成为0,为0的位与0相同,故为1。
如此就实现了not操作。
逻辑操作中的I-指令
MIPS中逻辑的立即数操作有andi,ori,xori。
ori
把一个立即数与$0
一同进行ori操作,则可以将该立即数载入目的寄存器,实现赋值作用,但这里只能赋值目的寄存器的低十六位。
对寄存器的高十六位进行赋值时,常常采用lui指令。方便记忆,我把它看作load upper immediate。
这两个方式结合在一起,就可以对一个字赋值。
低十六位赋值还有其他的赋值方式,用addi指令,将$0
与立即数相加即可。
nori
注意到所给出的逻辑操作中并没有nori,这是因为nori也可以由其他指令实现。
先进行赋值操作,再用nor即可实现。