Question

Dans l'assemblage ARM, les émetteurs immédiats sont codés par une valeur de rotation de 8 bits, ce qui signifie que nous ne pouvons coder que

(0-256)^2n.

Maintenant, mon problème est que je veux effacer les 16 bits supérieurs de r0 et les remplacer par le demi-mot stocké r1. Mais à cause de la gamme limitée d'immédiats, je dois faire: -

bic r0, r0, #0xff000000
bic r0, r0, #0x00ff0000
add r0, r0, r1, LSL #16

Est-il possible de remplacer les 2 instructions bic par une seule instruction? 0xffff0000 est non codable. Peut-être devrais-je utiliser une autre opération logique pour effacer les 16 bits supérieurs?

Merci

EDIT: Désolé, j'ai oublié de dire que les 16 bits supérieurs de r1 sont vides et que j'utilise un ARM7TDMI

Était-ce utile?

La solution

Que diriez-vous de:

orr r0,r1,r0,lsl #16
mov r0,r0,ror #16

(Cela suppose que le demi-mot en haut de r1 est vide, comme l'a fait votre code de référence.) Selon les circonstances, vous pourrez peut-être omettre le dernier mov en le fusionnant avec un code ultérieur.

Autres conseils

Si vous avez un noyau ARM suffisamment nouveau, la question posée est simple:

movt    r0, #0
orr     r0, r0, r1,lsl#16

Voir http://www.keil.com/support/man /docs/armasm/armasm_cjagdjbf.htm

Cependant, si vous avez ARMv6 +, vous pouvez réellement faire l’exemple cité en une fois:

pkhbt   r0, r0, r1,lsl#16

Voir http://www.keil.com/support/man /docs/armasm/armasm_cihjedjg.htm

"Remplacez-le par le demi-mot enregistré r1" - Cela signifie-t-il que vous pouvez supposer que les 16 premiers bits de r1 sont nuls? Si oui,

add r0, r1, r0 lsl #16
mov r0, r0 ror #16

Pensez à mov comme à un espace réservé, car vous pouvez, si tout va bien, déplacer le curseur vers ce que prend r0 en entrée et faire un travail utile dans le même cycle.

Sur ARMv6 (par exemple, MPCore), vous pouvez dire

    uxth    r1, r1
    orr     r0, r1, r0, asl #16

Si vous pouvez tout effacer, vous pouvez xor avec lui-même.

Si vous devez conserver la moitié inférieure, pourriez-vous décaler le registre de 8 bits vers la gauche et revenir à la position de gauche? Cela peut être le même nombre d’instructions, cependant.

Pour le code C

 (a<<16)|((short)b)

gcc génère

    mov     r1, r1, asl #16
    mov     r1, r1, asr #16
    orr     r0, r1, r0, asl #16

qui n’utilise pas d’immédiat - c’est quand même deux instructions.

Vous pouvez utiliser l'instruction BFC. Bit Field Clear. Cette instruction efface n bits de m bits

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top