1
.set AD0GDR,        0xE0034004 
... 
bitextract: .int 65472
...
 LDR r3, =(AD0GDR)
 LDR r4, [r3]
 /*load #65472 into r5 that will be used to extract bits 6-15*/
 LDR r5, =(bitextract)  
 ADD r6, r4, r5 // extracts bits 6-15 and stores into r6
 ADD r0, r0, r6, LSR #15 // shift r6 bites off and add into r0

私はARMを初めて使用しているため、正確な答えがどこにも見つかりません。与えられたデータから特定のビット数、具体的にはビット 6 ~ 15 のみを抽出しようとしています。ビット 6 ~ 15 の 10 進数は 65427 です。

以前の考えから、私が与えられた値に 65472 を追加すると、この場合は 3758309380 である AD0GDR は 3758374852 になります。

さて、私の理解では、答えに相当するバイナリでは、65472 を追加すると、ビット 6 ~ 15 に「1」が入ります。しかし、そうではありません。では、与えられた値に 65427 を追加するとどうなるでしょうか? 編集:より良い質問は、なぜ 65472 を追加するとビット 6 ~ 15 が抽出されるのかということだと思います。そうでない場合は、正確に何が起こっているのか。

2 番目の質問は LSR に関するものです。

前に質問した理由は、「ビット 6:15 から純粋なサンプルを抽出し、レジスタの右端までシフトする」必要があるためです。その値を別のレジスタに追加します。レジスタの最後の 15 ビットをシフトする必要がありますか? 私はこの状況での言葉遣いに混乱していると思います。

4

2 に答える 2

2

より小さい値を検討してください:

   000 101 xxx        000 010 xxx        000 000 xxx 
 + 000 111 000      + 000 111 000     +  000 111 000
--------------   vs. ------------   vs. ------------
     1 100 xxx          1 001 xxx          0 111 xxx

つまり、その値 + マスク >> n は、値が 0 の場合は 0 を抽出し、値がゼロ以外の場合は 1 を抽出します。前提条件は、対象の値の左側にゼロ以外のビットがないことです。考えられる説明の 1 つは、議論された操作が実際には ADD ではなく AND だったということです。

EDIT : マスクを追加すると半分のキャリーになりますが、これは LSR #15 が抽出するものではありません。キャリー (つまり、式 (bitfield != 0)) は、次の式で追加できます。add r0,r0,r6 LSR #16

代わりに、重み 2 のキャリーと「式 (ビットフィールド - 1) の新しい符号ビット」の 2 つのビットが追加されます。または表形式で:

BF    as int    C  BF+M   LSR #2
000 = 0 (0)     (0) 111    + 1
001 = 1 (1)     (1) 000    + 2
010 = 2 (2)     (1) 001    + 2
011 = 3 (3)     (1) 010    + 2
100 = 4 (-4)    (1) 011    + 2
101 = 5 (-3)    (1) 100    + 3
110 = 6 (-2)    (1) 101    + 3
111 = 7 (-3)    (1) 110    + 3

残念ながら、サンプリング定理や DSP の分野からそれを行う理由を見つけることができません。

于 2013-11-12T05:30:59.397 に答える
1

(プラットフォームに関係なく) 特定のビットを取得するには、通常、ビットごとの AND を実行し、その後に論理シフトを実行します。あなたの場合、16進数のビット6〜15は0xFFCOであり、最後に6ビット右にシフトする必要があります(ビットを最後に右揃えにしたい場合)。それはあなたがしたいことを意味します

(num & 0xFFC0) >> 6

それを自分の言語に翻訳する必要があります…</p>

これを行う別の編集方法は、最初に右シフトしてから、不要なビットをマスクすることです。

(num >> 6) & 0x3FF

下位 10 ビットのみが必要で、それ以外はすべてゼロにする必要があるためです。

「数値を追加するとビットがどのように抽出されるか」という他の質問に対処するには、答えは「そうではありません」です。AND演算は、「加算」ではなく、論理 (ビット単位) 演算です。簡単な例:

abcdefgh & 0x34 =
abcdefgh & 00111000b =
00cde000

つまり、論理 AND はcde上記の数のビットを保持し、他のすべてのビットをゼロに設定します (この例では)。それがあなたにとって物事をより明確にすることを願っています。

于 2013-11-12T03:53:08.950 に答える