Cancella 16 bit superiori in 1 istruzione ARM
-
08-07-2019 - |
Domanda
Nell'assemblaggio ARM gli immediati sono codificati da un valore ruotato di 8 bit, il che significa che possiamo solo codificare
(0-256)^2n.
Ora il mio problema è che voglio cancellare i 16 bit superiori di r0 e sostituirli con la mezza parola memorizzata r1. Ma a causa della gamma limitata degli immediati devo fare: -
bic r0, r0, #0xff000000
bic r0, r0, #0x00ff0000
add r0, r0, r1, LSL #16
È possibile sostituire le 2 istruzioni bic con una singola istruzione? 0xffff0000 non è codificabile. Forse dovrei usare un'altra operazione logica per cancellare i 16 bit superiori?
Grazie
EDIT: mi dispiace di aver dimenticato di dire che i primi 16 bit di r1 sono vuoti e sto usando un ARM7TDMI
Soluzione
Che ne dici di:
orr r0,r1,r0,lsl #16
mov r0,r0,ror #16
(Ciò presuppone che la mezza parola in alto di r1 sia vuota, come ha fatto il tuo codice di riferimento.) A seconda delle circostanze, potresti essere in grado di omettere il mov finale qui unendolo ad un codice successivo.
Altri suggerimenti
Se si dispone di un nuovo core ARM sufficiente, la domanda posta è semplice:
movt r0, #0
orr r0, r0, r1,lsl#16
Vedi http://www.keil.com/support/man /docs/armasm/armasm_cjagdjbf.htm
Tuttavia, se hai ARMv6 + puoi effettivamente fare l'intero esempio citato in una volta sola:
pkhbt r0, r0, r1,lsl#16
Vedi http://www.keil.com/support/man /docs/armasm/armasm_cihjedjg.htm
" sostituiscilo con la mezza parola memorizzata r1 " - significa che puoi supporre che i primi 16 bit di r1 siano zero? In tal caso,
add r0, r1, r0 lsl #16
mov r0, r0 ror #16
Pensa al mov come a un segnaposto, dal momento che si spera che tu possa spostare il ror su qualunque cosa prenderebbe r0 come input successivo e fare effettivamente un lavoro utile nello stesso ciclo.
Su ARMv6 (ad esempio MPCore), puoi dire
uxth r1, r1
orr r0, r1, r0, asl #16
Se riesci a cancellare tutto, puoi xor
con se stesso.
Se è necessario conservare la metà inferiore, è possibile spostare a sinistra il registro di 8 bit e viceversa? Tuttavia, potrebbe trattarsi dello stesso numero di istruzioni.
Per il codice C
(a<<16)|((short)b)
gcc genera
mov r1, r1, asl #16
mov r1, r1, asr #16
orr r0, r1, r0, asl #16
che non usa alcun immediato - tuttavia sono ancora due istruzioni.
È possibile utilizzare l'istruzione BFC. Bit Field Clear. Questa istruzione cancella n bit da m bit