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

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top