2012-02-23 10 views
5

Ciao, ho solo una domanda di base su un po 'di compensazione in Assembly. Ecco cosa sto cercando di seguito.Istruzione BIC

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 

Quando si esegue quanto sopra pone il seguente valore in R0 (0xFFFFFF4F) Mi chiedo perché questo è?

se faccio questo bit chiaro mette il valore 0xFFFFFFBF

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

Qualcuno può aiutarmi a capire questi risultati?

+0

scusa, questo è un po 'non correlato ma è possibile che il BIC sia scritto in C? –

risposta

6

Trovo interessante il fatto che l'assemblatore (gas) ti permetta di provare a mov con più di 8 bit significativi senza errori ... codifica semplicemente un MVN per te.

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

Ottengo 0xFFFFFF40 che è la risposta prevista.

Se si desidera impostare il bit 7, quindi

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

O volevi dire che si voleva impostare il bit 6

orr r0,r0,#0x40 

se si voleva togliere tutti i bit ad eccezione di bit 6 , lasciando solo il bit 6 impostato.

and r0,r0,#0x40 

Se si vuole lasciare tutto ma un po '6 set (bit trasparente 6) (BIC = bit chiaro)

bic r0,r0,#0x40 

O stavi cercando di fare questo

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

che dà 0x00000040, che è la stessa come

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

tranne quest'ultimo usa meno istruzioni e registri

2

Penso che lo vedrete meglio se pensate a cosa BIC significa/fa: BIC Rd, Rn sta per "Rd AND NOT Rn".

Così, con il tuo ultimo esempio:

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

Così, con BIC Rd, # 0x40 si sta cancellando bit numero 7 del Rd. Lo stesso pensiero vale per il tuo precedente esempio.

Spero che questo aiuti.

0

I test con arm-none-eabi-gcc 4.8.2 su Arduino Due, ma il primo caso è diverso.

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

L'altro caso è lo stesso.

Quindi il risultato del primo caso è chiaro proprio come @Fernando spiegato sopra.

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

Il (Bit Clear) istruzione BIC esegue un'operazione AND sui bit in Rn con i complementi dei bit corrispondenti del valore di Operand2. Lo puoi vedere here.