2012-01-17 8 views
0

アセンブリ言語で可能なブール論理演算の複雑さをすべて説明するチュートリアルがあります。アセンブリで使用されるブール論理に関するチュートリアル

mov  [ebp-8h], 31982853h 
mov  eax, [ebp+Ch] 
shl  eax, 8 
mov  ecx, [ebp+Ch] 
shr  ecx, 8 
or  eax, ecx 

は私は何がSHL、SHR理解し、または指示を行うが、その結合された結果については考えている:例えば、私は、次のアセンブリコードのブロックが何をするのか見当がつかない。 誰でもアセンブリのブール論理操作を詳しく説明しているチュートリアルを教えてもらえますか?

ありがとうございました。

+1

デモ値を使用してデバッガでステップ実行し、ビットが変化していることを確認します。それを書いてください。 – spraff

+0

まあ、左右にシフトされてからor'edにシフトされる値は関数の引数です。これは整数なので、異なる値を試すことは可能ですが、上記のアセンブリコードが直感的に理解できる方が良いと思います。 – pokiman

+0

[ebp + ch]に6ビットの値がある場合、このロジックはビット0をスワップします-2を最終結果(eax)のビット3〜5と比較する。その目的が何であるかは言うまでもありません。最初の命令はこのロジックの一部ではありません。 –

答えて

3

注釈付きコード:

mov  eax, [ebp+Ch] ; grab our 32-bit value 
shl  eax, 8   ; shift it left 8 bits, so the top 8 bits are shifted out 
         ; and the bottom 8 bits are filled w/ 0 
mov  ecx, [ebp+Ch] ; grab our 32-bit value again 
shr  ecx, 8   ; shift this copy right 8 bits, so the bottom 8 bits are 
         ; shifted out and the top 8 bits are filled w/ 0 
or  eax, ecx  ; perform A = A or C for each set of same-aligned bits in 
         ; EAX (A) and ECX (C) 

元の値がABCD(各文字は8ビット・バイトである)である場合、またはが実行される前だから、その後、EAXはBCD0とECXは0ABCを有することになるだろう。

1

[ebp+Ch]における変数(すなわち、わずか16個の最下位ビットがゼロであることができる)16ビットの値を保持している場合、コードのこの部分はefectivelyそのバイト(ビット15を介して8とビット0〜7)をスワップ。ただし、eaxの代わりにaxを使用しない限り、or eax, ecxの後にeaxの結果を0FFFFhでマスクする必要があります(and 'ed)。

関連する問題