2016-10-20 4 views
1

TST、およびARMアセンブリでの操作。 LSBitだけが検討されるのはなぜですか? ARMアセンブリへの参照で

私は数が偶数か奇数であるかどうかを確認するためのテストコードの次の行でTST操作に関するいくつかの混乱を持っている:

mov R0, #167 

TST R0, #1 //AND operation 
addeq ... //add if even 
addne ... //add if not even 

である理由私の質問があります番号が偶数であるかどうかを判断するために最下位ビット(LSB)のみを考慮し、#167(LSBの0111を有する)の残りのビットを見ないことを考慮してTSt動作を実行する。

TST 167,1 AND 167と1はAND LSB(0111と0001)になりますが、LSBはAND 1になりますがANDingしません2番目のLSBがTST動作の出力を0にしますか?

+0

"1"の他のすべてのビットがゼロであるため、R0_cannot_の非LSBが結果に影響するため、R0の(単一の)LSBのみがテストされます。 – barny

+0

'0x000000a7&0x00000001 == 0x00000001(!= 0) ' - それがすべてです。私はここに尋ねられているものの前提を理解していません.../ – Notlikethat

+0

"なぜLSBitだけが考慮されるのですか?":これはパリティビットなのでです。 –

答えて

0

Zフラグは、結果全体がゼロかどうかに基づいて設定されます。即ち、167 & 1の全てのビットの水平ORである。

32ビットごとのゼロまたはノットの結果が必要な場合は、ANDを使用して、フラグ結果ではなく整数レジスタの結果を調べます。

3

バイナリの数値が偶数か奇数かを調べるには、右端(最下位)のビットを調べるだけです。他のビットは、それらの「値」のすべてが2の非ゼロのべき乗、すなわち偶数であるので重要ではない。

偶数を足しても奇数は生成されないため、関係はありません。

ビットごとのAND演算167と1の結果は1で、ゼロではありません。ビット単位のANDへの第2引数はLSBの問題以外のビットではないため、残りのビットについては心配する必要はありません(暗黙の結果ではマスクされ、強制的に0になります)。

+0

私は、唯一のAND 1 = 1を忘れていました。そうでなければ、残りのビットをANDINGすると0になり、#1 = 0001であるので、非LSBはすべて0であるため、それらと一緒にもゼロになります。ありがとう。 – SeesSound

+0

数字が10で割り切れるかどうかを調べるための基数10では、最下位桁がゼロであるかどうかを調べます。数字が偶数か奇数かを調べるための基数10では、それが偶数か奇数かを見るために最下位桁を見ます。ベース2では、同じ意味で、最下位桁も偶数(0)または奇数(1)です。ベース8、ベース16は、同じルールに従っていなければならないすべて同じベースで、奇妙なベースについて考える必要があります。 –

関連する問題