2017-02-03 26 views
1

私はTriCore TC1797コードを参照しており、対応する命令セットのマニュアルTriCore V1.3.1命令セットを参照しています。Infineon TriCore TC1797アセンブリ命令JGE

私の質問は簡単ですが、Taskingコンパイラで生成されたアセンブリコードは私に困惑しています。コードは永遠にループするように見えますが、コードは機能しません。どのように可能ですか?

は、これらの命令行を(コメントは運転の私の理解されている)を取ることができます:D9は常に正の数であるので、私は(?右)、決してに行くされていない、理解していない何

MOVH.A a12, #@HIS(VAR_ADDRESS) 
LEA a12, [a12]@LOS(VAR_ADDRESS) 
LD.H d15, [a12]0   ; d15 = 4 (half-word) passed to this function 
          ; values passed are either 0x04 or 0x10 or 0xA8 

loop_addr: 
ADD d15, d15, #-0x10  ; d15 = 4 - 0x10 = 0xFFFFFFF4 
EXTR d9, d15, #0, #16  ; d9 = 0x0000FFF4 
          ; edit: THIS IS MY MISTAKE 
          ; correct is d9 = 0xFFFFFFF4 
... 
    other code here, never touching d9 
... 
ST.H [a12], d9   ; store decremented value back 
JGE d9, #1, loop_addr ; ???? comparing 0x0000FFF4 to 1 
          ; will it loop forever? 

ゼロにして、どのようにループが終了する可能性がありますか?

ありがとう、私はマニュアルでこれを再読み込みしましたが、この状況の説明は見つかりません。

+0

通常、符号付き比較と符号なし比較の両方に対して条件付きジャンプがあります。 'ja'命令のようなものがありますか? – fuz

+0

署名されていないものに 'JGE.U'があるので、明らかに' JGE'が署名されています。したがって、あなたの 'd9'が' 0x0000FFF4'にマスクされているので、署名されたとして扱われますが、肯定的です。したがって、符号付き比較と符号なし比較のどちらを使用するかは関係ありません。 – Jester

+0

fuz:これは間違いなくJGE(JGE.Uではない)命令なので、符号付きの比較です – EmbeddedGuy

答えて

2
ADD d15, d15, #-0x10  ; d15 = 4 - 0x10 = 0xFFFFFFF4 
EXTR d9, d15, #0, #16  ; d9 = 0x0000FFF4 

これは間違いです。 EXTR符号は抽出されたビットフィールドを拡張します。 manualを引用する:

をEXTR命令が 符号拡張ビットフィールドは、抽出された(ビットフィールドの 最上位ビットを複製する)ことにより、結果の最上位ビットを埋めます。

したがって、d9は、実際には0xFFFFFFF4です。 JGEは符号付き比較を使用するため、適切には-12として処理され、ループが終了します。

+0

ありがとうございました!私はこの正しい答えをアップビンしましたが、私の評判が15を超えた後にのみ表示されます。 – EmbeddedGuy

関連する問題