3.2移位操作与流控制
2026-03-22计组汇编
引入~逻辑操作:也叫位操作,一般处理AND与,OR或,NOT非,EOR异或
一:移位操作
[[IMG:https://p.cldisk.com/star4/814e06bd719622e04681d4880f9f30c0/origin.jpg?rw=1296&rh=399&_fileSize=141178]]
与操作:也就是如果和1相与则保留原位,如果和0,相与那就是0,可以进行保留操作,要保留的和1进行与操作,通常如图所示:与00001111可以保留后四位(即原位和0)
或操作:也就是如果和1相或则全为1,如果和0相或则保留原位,可以进行合并操作,即把不保留的位全换成0,要保留的位留下,与0相进行或操作,通常如图所示:或00001111,保留高四位(即原位和1)
非操作:即取反操作
异或操作:两个相同取0,不同取1(通常和1异或即取反,和0异或操作得到本身)
应用:
[[IMG:https://p.cldisk.com/star4/bf0c6d2fa6987afa7dbeaef07facf6fd/origin.jpg?rw=1458&rh=639&_fileSize=148236]]
展示一个例子~
[[IMG:https://p.cldisk.com/star4/9db07e9d57520c6a85f3667b7f38472f/origin.jpg?rw=1476&rh=407&_fileSize=191863]]
这个就是我们先把r0与10101111即保留除了第二位b和第四位d的其他位,把这两位清为0,之后我们再和10001100进行或操作,保留bcd位和gh位,其余替换为1,因为bd这两位已经是0,aef替换为1,所以是10c011gh,再将h位取反,如果h为0那就是1,如果h是1,那就是0,所以是取反
二.特殊指令
[[IMG:https://p.cldisk.com/star4/a5760055d21e874c4b25f631a1495acc/origin.jpg?rw=1427&rh=678&_fileSize=153831]]
BIC是位清0指令:用BIC配合立即数,可以高效地清零任意指定的位段,同时保留其余位
我们看最后的例子~,0xFF也就是八位二进制1111 1111拓展到32位也就是0000……000后八位是1,进行取反之后前24位是1,后8位是0,之后再进行与操作,所以与1的地方保留,0的地方请0,实现复制加清0操作
补充:
1.BFC位域清0指令
BFC Rd,#,#
即是将Rd指定位域从第Isb开始的width宽度清0,Isb是位域中的最低有效位也就是我们默认32位二进制的低位开始数数,width为宽度,即Isb和他的左边
BFC,R0,#4,#10 就是从R0的第四位到第13位清0,也就是对应第五个位置到第14个位置清0
2.BFI位域插入指令
BFI.W Rd,Rn,#,# (W是write)将Rn插入指定位域,也依旧是从Rd的第Isb开始,之后加上宽度的位置,需要替换,但是我们的宽度位数是从Rn的第0位开始计算的,不是Isb对应位置
Rn = 0x3456789A(我们只关心它的低几位)
- 执行 BFI Rd, Rn, #8, #16
那么:
- 从 Rn 的低 16 位(即 0x789A)取出.
- 将它们插入到 Rd 的 bit 8 到 bit 23 的位置.
- Rd 的其他位(bit 0~7 和 bit 24~31)保持不变.