Limpar 16 bits superiores em instrução 1 ARM
-
08-07-2019 - |
Pergunta
NO BRAÇO imediatos de montagem são codificados por um valor de 8 bits rodado o que significa que só pode codificar
(0-256)^2n.
Agora o meu problema é que eu quero para limpar os 16 bits superiores de r0 e substituí-lo com a meia-palavra armazenada R1. Mas por causa da gama limitada dos imediatos eu tenho que fazer: -
bic r0, r0, #0xff000000
bic r0, r0, #0x00ff0000
add r0, r0, r1, LSL #16
É possível que substituir os 2 instruções BIC com uma única instrução? 0xffff0000 é unencodable. Talvez eu deveria estar usando outra operação lógica para limpar os 16 bits superiores?
Graças
EDIT: Desculpe eu esqueci de dizer que o Top 16-bits de R1 está vazio, e eu estou usando um ARM7TDMI
Solução
Como sobre: ??
orr r0,r1,r0,lsl #16
mov r0,r0,ror #16
(Isso pressupõe que a parte superior halfword de R1 está vazio, como o seu código de referência fez.) Dependendo das circunstâncias, você pode ser capaz de omitir o mov final aqui, fundindo-a com algum código mais tarde.
Outras dicas
Se você tem um novo núcleo ARM suficiente a pergunta é simples:
movt r0, #0
orr r0, r0, r1,lsl#16
http://www.keil.com/support/man /docs/armasm/armasm_cjagdjbf.htm
No entanto, se você tem ARMv6 + você pode realmente fazer toda a exemplo citado de uma só vez:
pkhbt r0, r0, r1,lsl#16
http://www.keil.com/support/man /docs/armasm/armasm_cihjedjg.htm
"substituí-lo com a meia-palavra armazenada r1" - isso significa que você pode assumir o topo 16 bits de R1 são zero? Se assim for,
add r0, r1, r0 lsl #16
mov r0, r0 ror #16
Pense no mov como um espaço reservado, desde que você pode espero mover o ror a tudo o que levaria r0 como entrada seguinte e realmente fazer trabalho útil no mesmo ciclo.
Em ARMv6 (por exemplo MPCore), você pode dizer
uxth r1, r1
orr r0, r1, r0, asl #16
Se você pode limpar a coisa toda, você poderia xor
isso com ele mesmo.
Se você precisa manter a metade inferior, pode-lhe ser capaz de esquerda para deslocar o registo de 8 bits e volta? Isso pode ser mesmo número de instruções, no entanto.
Para o código C
(a<<16)|((short)b)
gcc gera
mov r1, r1, asl #16
mov r1, r1, asr #16
orr r0, r1, r0, asl #16
que não usa nenhum imediatos -. Ainda é duas instruções, embora
Você pode usar instruções BFC. Bit campo Clear. Esta instrução zera n bits de m bit