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

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top