你好,我只是在汇编中有一些清点的基本问题.这是我在下面尝试的.
MOV R0, #OxFFFFFFFF ;Load R0 with the HEX Values FFFFFFFF
BIC R0, R0, #0xBF ;This should set bit 7 from my understanding as B is 1011 in hex
Run Code Online (Sandbox Code Playgroud)
执行上述操作时,将以下值放入R0(0xFFFFFF4F)我想知道为什么会这样?
如果我这样做清除它将值0xFFFFFFBF
MOV R0, #OxFFFFFFFF ;Load R0 with the HEX Values FFFFFFFF
BIC R0, R0, #00000000000000000000000001000000b
Run Code Online (Sandbox Code Playgroud)
谁能帮我理解这些结果?
我觉得有趣的是汇编程序(气体)让你尝试用超过8个有效位进行移动而没有错误...它只是为你编码一个mvn.
d6008030 <TESTFUN>:
d6008030: e3e00000 mvn r0, #0
d6008034: e3c000bf bic r0, r0, #191 ; 0xbf
d6008038: e12fff1e bx lr
Run Code Online (Sandbox Code Playgroud)
我得到0xFFFFFF40,这是预期的答案.
如果你想设置第7位,那么
orr r0,r0,#0x80 ;@ (corrected from 0x70)
Run Code Online (Sandbox Code Playgroud)
或者你的意思是你想要设置第6位
orr r0,r0,#0x40
Run Code Online (Sandbox Code Playgroud)
如果你想剥离除第6位以外的所有位,只留下第6位.
and r0,r0,#0x40
Run Code Online (Sandbox Code Playgroud)
如果你想保留除第6位之外的所有设置(清除第6位)(bic =位清除)
bic r0,r0,#0x40
Run Code Online (Sandbox Code Playgroud)
或者你想要这样做
mov r0,#0xFFFFFFFF ;@ this is an interesting shortcut
mov r1,#0xFFFFFFBF ;@ might as well keep using it
bic r0,r0,r1
Run Code Online (Sandbox Code Playgroud)
它给出了0x00000040,与之相同
mov r0,#0xFFFFFFFF ;@ this is an interesting shortcut
and r0,r0,#0x40
Run Code Online (Sandbox Code Playgroud)
除了后者使用较少的指令和寄存器
小智 5
我想如果您考虑一下 BIC 的含义/用途,您会看得更清楚:BIC Rd, Rn 代表“Rd AND NOT Rn”。
所以,用你的最后一个例子:
Rn = 00000000000000000000000001000000b = 0x40
NOT Rn = 0xFFFFFFBF = 11111111111111111111111110111111b
Rd = 0xFFFFFFFF = 11111111111111111111111111111111b
Rd AND NOT Rn = 0xFFFFFFFBF = 11111111111111111111111110111111b
Run Code Online (Sandbox Code Playgroud)
因此,使用 BIC Rd, #0x40,您将清除 Rd 的第 7 位。同样的想法也适用于你之前的例子。
希望这可以帮助。