2016-07-11 8 views
1

今、私はアセンブリ言語でARM GPIOを制御する方法を研究しています。 私はCソースをアセンブリ言語に変更しようとしています。ARMアセンブリif(data&0x01)rGPGDAT&=〜(0x1 << 7);

しかし、私は私がTSTを使用すべきだと思うこの部分

if(data & 0x01) rGPGDAT &= ~(0x1<<7); 

if(data & 0x02) rGPGDAT &= ~(0x1<<6); 

if(data & 0x03) rGPGDAT &= ~(0x1<<5); 

if(data & 0x04) rGPGDAT &= ~(0x1<<4); 

を書くことでは困難です。私はに対処する方法がわからない「であれば」

+1

結局、 'tst'は実際にはビット単位の比較に適しています。条件付きコードを一般的に実装する方法がわからない場合は、最初にアセンブリチュートリアルを検討する価値があります。また、比較的シンプルなコードシーケンスの場合、-O1でコンパイルされたCコードの逆アセンブリを見ると、通常、かなり有益です(-O0は非常に多くの重複したロード/ストア/移動を発生させてツリーの木が見えにくい傾向があります)。 – Notlikethat

+0

通常、いくつかのフラグを設定します(ここではtstが良い考えです)。そして、偽の条件に分岐するか、真の条件に分岐します。フルサイズの腕の指示(親指ではない)の条件付き実行が良い場合はここでBICを見てください。 –

+0

"if"が正しいことを確認していますか? if(data&0x01) '、' if(data&0x02) 'と' if(data&0x04) 'は正しいビットテストのようですが、if(data&0x03)'が間違っていますか?なぜあなたはアーカイブしようとしていますか?それとも、それは単にタイプミスですか? – Tommylee2k

答えて

0

あなたは枝せずにこれを行うことができるようになります。

mov r1, <your data> ; change this accordingly 
mov r2, <rGPGDAT> ; change this accordingly 
tst r1,#1 
andne r2,#$FF -1 
tst r1,#2 
andne r2,#$FF -2 
tst r1,#4 
andne r2,#$FF -4 
tst r1,#8 
andne r2,#$FF -8 

キーは命令で、命令があるために、あなたはcontitionを定義することができる場所実行ビットがR1に設定されている場合(この場合はZ = 0) は、tstはゼロフラグをクリアし、 andneはR2のビットをクリアします

(わからないあなたがここにandNEまたはandEQが必要な場合。また、ループはよりエレガントですが、私はatmではないので、プロッパーコードを書くことはできません)

+0

ありがとうございました。私はtstとinsturctionsについてもっと研究する必要があると思う。 –

+0

ヒント: 'bic'は' and'よりも細かいでしょう(これは正確に存在する仕事です!);比較結果がゼロでないことを探しているので、実際には正しい条件です。 – Notlikethat

関連する問題