質問

ARMアセンブリでは、イミディエートは8ビットの回転値でエンコードされます。つまり、エンコードのみが可能です

(0-256)^2n.

今私の問題は、r0の上位16ビットをクリアし、格納されているr1のハーフワードで置き換えたいということです。しかし、私がしなければならないイミディエイトの範囲が限られているため:-

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

2つのbic命令を単一の命令に置き換えることは可能ですか? 0xffff0000はエンコードできません。おそらく、別の論理演算を使用して上位16ビットをクリアする必要がありますか?

ありがとう

編集:r1の上位16ビットが空であり、ARM7TDMIを使用していると言うのを忘れてしまいました

役に立ちましたか?

解決

方法:

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

(これは、参照コードがしたように、r1の上位ハーフワードが空であると想定しています。) 状況によっては、最後のmovを後のコードとマージすることで、ここで省略できます。

他のヒント

十分に新しいARMコアがある場合、質問は簡単です:

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

http://www.keil.com/support/manを参照/docs/armasm/armasm_cjagdjbf.htm

ただし、ARMv6 +を使用している場合は、引用された例全体を一度に実行できます。

pkhbt   r0, r0, r1,lsl#16

http://www.keil.com/support/manを参照/docs/armasm/armasm_cihjedjg.htm

"格納されているハーフワードr1と置き換えます" -これは、r1の上位16ビットがゼロであると想定できるということですか?もしそうなら、

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

movをプレースホルダーとして考えてください。r0を次に入力としてr0を使用するものに移動し、同じサイクルで実際に有用な作業を行うことができます。

ARMv6(MPCoreなど)では、次のように言うことができます

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

すべてをクリアできる場合は、それ自体で xor できます。

下半分を保持する必要がある場合、レジスタを8ビット左にシフトして戻しますか?しかし、それは同じ数の命令かもしれません。

Cコードの場合

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

gccが生成します

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

即値を使用しません-それでも2つの命令です。

BFC命令を使用できます。ビットフィールドクリア。この命令は、mビットからnビットをクリアします

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top