2012-02-23 22 views
5

Hola, solo tengo una pregunta básica sobre el borrado de un poco en Assembly. Esto es lo que intento a continuación.BIC Instruction

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 

Al realizar lo anterior, coloca el siguiente valor en R0 (0xFFFFFF4F) Me pregunto por qué es esto?

, si lo hago poco clara que pone el valor 0xFFFFFFBF

MOV R0, #OxFFFFFFFF ;Load R0 with the HEX Values FFFFFFFF 
BIC R0, R0, #00000000000000000000000001000000b 

Puede alguien ayudarme a entender estos resultados?

+0

Disculpe esto no está relacionado pero ¿BIC se puede escribir en C? –

Respuesta

6

Me parece interesante que el ensamblador (de gas) le permite tratar de mover con más de 8 bits significativos sin error ... simplemente codifica un mvn para usted.

d6008030 <TESTFUN>: 
d6008030: e3e00000 mvn r0, #0 
d6008034: e3c000bf bic r0, r0, #191 ; 0xbf 
d6008038: e12fff1e bx lr 

obtengo 0xFFFFFF40, que es la respuesta esperada.

Si desea establecer el bit 7, a continuación,

orr r0,r0,#0x80 ;@ (corrected from 0x70) 

O Quiso decir que quería establecer el bit 6

orr r0,r0,#0x40 

si quisiera quitarse todos los bits excepto el bit 6 , dejando solo el bit 6 establecido.

and r0,r0,#0x40 

Si desea dejar todo, pero bit 6 set (poco clara 6) (BIC = poco claro)

bic r0,r0,#0x40 

O estabas tratando de hacer esto

mov r0,#0xFFFFFFFF ;@ this is an interesting shortcut 
mov r1,#0xFFFFFFBF ;@ might as well keep using it 
bic r0,r0,r1 

cuales da 0x00000040, que es lo mismo que

mov r0,#0xFFFFFFFF ;@ this is an interesting shortcut 
and r0,r0,#0x40 

excepto el último usa menos instrucciones y registra

2

Creo que lo verás mejor si piensas en lo que BIC significa/hace: BIC Rd, Rn significa "Rd AND NOT Rn".

Así, con su último ejemplo:

Rn = 00000000000000000000000001000000b = 0x40 
NOT Rn = 0xFFFFFFBF = 11111111111111111111111110111111b 
Rd = 0xFFFFFFFF = 11111111111111111111111111111111b 
Rd AND NOT Rn = 0xFFFFFFFBF = 11111111111111111111111110111111b 

Así, con BIC Rd, # 0x40 están limpiando número de bit 7 del RD. El mismo pensamiento se aplica a su ejemplo anterior.

Espero que esto ayude.

0

Probé las cajas con arm-none-eabi-gcc 4.8.2 en Arduino Due, pero el primer caso es diferente.

// the results is 0xffffff40, but not 0xffffff4f 
mov r2, #0xffffffff 
bic r2, r2, #0xbf 

El otro caso es el mismo.

De modo que el resultado del primer caso es claro tal como lo explicó @Fernando anteriormente.

operand2 = 0xbf 
NOT operand2 = 0xffffff40 
r2 = 0xffffffff 
r2 AND NOT operand2 = 0xffffff40 

El (Bit Clear) instrucción BIC realiza una operación AND sobre los bits en Rn con los complementos de los bits correspondientes en el valor de operando2. Puede verlo here.

Cuestiones relacionadas