3

ARM アセンブリでは、即値は 8 ビットのローテーションされた値によってエンコードされます。つまり、エンコードできるのは

(0-256)^2n.

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

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

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

ありがとう

編集:申し訳ありませんが、r1 の上位 16 ビットが空であることを忘れていました。ARM7TDMI を使用しています。

4

7 に答える 7

5

十分に新しい 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を参照してください。

于 2008-11-17T12:42:35.290 に答える
4

どうですか:

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

(これは、参照コードのように、r1 のトップ ハーフワードが空であることを前提としています。) 状況によっては、後のコードとマージすることで、ここで最後の mov を省略できる場合があります。

于 2008-11-16T22:35:28.433 に答える
2

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

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

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

于 2008-11-16T21:57:05.717 に答える
1

ARMv6 (MPCore など) では、次のように言えます。

    uxth    r1, r1
    orr     r0, r1, r0, asl #16
于 2008-11-16T21:43:41.593 に答える
0

全体をクリアできれば、xorそれ自体でクリアできます。

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

于 2008-11-16T18:56:34.757 に答える
0

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

于 2014-04-29T14:37:01.177 に答える
0

Cコードの場合

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

gcc が生成する

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

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

于 2008-11-16T19:42:46.003 に答える