2017-02-15 22 views
0

私はC言語でRH850コントロールとコンパイラgreenHillsを使用しています。範囲チェックでは次のようになります。値がディパーソン分解であることを確認してください

if ((x>=2) && (x<=5)) 
    y=1 

Osizeオプションでコンパイルされます。それがコンパイルされたとき、このように見えた:

zxb r7 
addi -2,r7,r1 
cmp 3,r1 
bnh .L1295 

.L1295y=1のラベル(このy=1はあまりにもいくつかの他の条件で、他の変更のために使用されている)です。どちらの命令も同じフラグに影響します。

チェック(x>=2)は、このコードで実現されます:addi -2,r7,r1。しかし、この命令のフラグ結果は、次の命令で掃除され、間違っています。少なくとも私はそう思う。

明らかに私は間違っています。誰かがこの逆アセンブラの断片を説明できますか?

+0

デバッグヘルプ(「なぜこのコードは機能していないのですか?)」には、目的の動作、特定の問題またはエラー、および質問自体に再現するのに必要な最短コードが含まれている必要があります。明確な問題文がない質問は、他の読者にとって有用ではありません。参照:最小、完全、および検証可能な例を作成する方法。 – Olaf

答えて

2

次のようにチェックを変換されます。

x >= 2 && x <= 5 
= (x - 2) >= (2 - 2) && (x - 2) <= (5 - 2) 
= (x - 2) >= 0 && (x - 2) <= 3 

コードが3に、x - 2である、r1を比較し0, 1, 2, or 3(または2, 3, 4, or 5x)でr1を意味する「枝高いそうでない場合は」に分岐しますy = 1と設定します。

+0

私の質問は論理ではありません。これはフラグです。私は "addi"がいくつかのフラグを設定すると思ったが、 "cmp"はそれらを再び変更するだろう。そして、私は "addi"からのフラグが失われますが。 –

+0

それらは失われていますが、 'cmp'の結果だけが必要です。 –

関連する問題