BIC指令

mit*_*ufc 5 assembly arm

你好,我只是在汇编中有一些清点的基本问题.这是我在下面尝试的.

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)

谁能帮我理解这些结果?

old*_*mer 6

我觉得有趣的是汇编程序(气体)让你尝试用超过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 位。同样的想法也适用于你之前的例子。

希望这可以帮助。