宋桓公

arm学习——有关位操作的总结

0
阅读(3514)

在学习arm的过程中,感觉寄存器,基本不会提供位操作,而是整体的操作,
整体操作的就是要注意在对某位赋值的时候不要影响到其他位,看上去不简单,
其实,整体操作有技巧,
那么就来总结一下:

407610-20150917164719586-1121580542.png

1、首先要理解,“|”符号就是用来置1的,“&”就是用来置0的。
2、不管置1还是置0,”<<”左边总是以1的形式出现。要置0,加上取反符号。

结合上面两条规则,事情就很简单了:
比如先把某个寄存器的第6位置1,那么首先写出(1<<6)待用。
然后置1就用“|”的规则,所以就是:reg |= (1<<6);
要是第6位置0呢:
一样的,首先写出(1<<6)待用。
置0就用“&”,加上取反符号的规则。所以就是:reg &= ~(1<<6);

好了,现在理解一个难一点的:
reg &= ~( (1<<6) | (1<<7) | (1<<2) );
这个表示什么意思?看到“&=”就知道要将某位置0.
(1<<6) | (1<<7) | (1<<2)就表示,2,6,7都置1,在看到取反。
那么这句话的意思就是将2,6,7都置0.

我们再返回到程序 :

if(dwDat & (1<<2) )
这句有是什么意思呢?
就是判断swDat的第二位是否为1,第二位如果为1,则结果为1,if判断为真。
这个可以理解为一个读操作


顺便记忆一些汇编的,置0,置1,操作:


BIC R1, R1, #(1<<11) ; BIC 可以理解为 Bit Clear,这句话的含义就是将 R1的第十一位,置1,再存入R1。


ORR R1, R1 #(1<<10) ; ORR 可理解为or 或操作,这句话的含义就是将R1的第十位,置0,再存入R1。


//-------2015-10-19,新的感悟---

读关注的是不变的位。(需要读取的那几位) a &= (3ff << 7)//是为了读取bit7~bit17,所以保持这些位不变,其他位置0

写关注的是即将改变的位。(将被设置或清零的位)a &= ~(3ff << 7)//为了将bit7~bit17全部置0,且保持其他位不变。

//-------------------------

Baidu
map