2012-03-27 14 views
5

特定のレジスタから特定の値を読み取ろうとしています。このマニュアルでは、まず16ビットLSBアクセスと16ビットMSBアクセスに次にアクセスする必要があることを指定しています。一度に32ビットすべてを読み込んだ後、必要に応じてそれぞれ残りの16 msb/lsbをマスクしますか?または、16ビットの拳だけを読み取る方法がありますか?32ビットレジスタから16ビットを読み取る

おかげで、 ネコ

+0

。 –

+0

あなたはどのアーキテクチャで作業していますか?どの登録? –

+0

これはARM-leプロセッサです。 – Falcata

答えて

8

マニュアルは、最初のアクセスに16ビットのLSB、その後、16ビットのMSBを言う場合は、マニュアルが言うように行います。例えば

(リトルエンディアン):時々アクセスHIとLOの識別子を提供するものコンパイラ

#define REG (*(volatile uint32_t *) 0x1234) 

uint16_t val_hi, val_lo; 

val_lo = *((volatile uint16_t *) &REG); 
val_hi = *((volatile uint16_t *) &REG + 1); 

注LSBまたはMSB、等例でREGに加えて:

#define REGL (*(volatile uint16_t *) 0x1234) 
#define REGH (*(volatile uint16_t *) 0x1236) 
+2

しかし、これは、レジスタがローとハイの間で変化するという意味での「アトミック性」を保証するものではありません。 –

+0

@OliCharlesworthこのマニュアルでは、アトミックでないように32ビットレジスタにアクセスする必要があります。最初は16ビットLSB、次に16ビットMSBです。これは珍しい要件ではありません。このコードで保証されていないのは、2つの16ビット読み出しのアトムアクセスです。組み込みコンパイラは、通常、揮発性オブジェクトへのアクセスに関してかなり慎重ですが、疑わしいアセンブリコードを使用することができます。 – ouah

+0

低16ビットを読み取ると上位16ビットがレジスタに転送されます。おそらくドキュメントがそれを伝えるかどうかはわかりません; –

2

これを行うためにどの言語を使用しているのかは不明です。私はあなたがCでインラインアセンブリを使用していると仮定します。

私はNASMをよく知っています。 i386用NASM構文を使用:

mov eax, 0x12345678 ; load whatever value 
mov bx, ax   ; put LSW in bx 
shr eax, 16   ; shift MSW to ax 
        ; now ax = MSW, bx = LSW 

私はガス(C)のコードはこのようなものになるだろう推測している:あなたは、あなたが話しているかのプロセッサ指定されていればそれが私たちを助ける

movl $0x12345678, %eax # load whatever value 
movw %ax, %bx   # put LSW in bx 
shrl $16, %eax   # shift MSW to ax 
         # now ax = MSW, bx = LSW 
+0

x86ではなくARMタグが既に存在しました。 –

関連する問題