2017-10-06 50 views
2

質問がありましたまともな答えが見つからないようでした。
私はこのコードを与えられている:x86アセンブリレジスタとmov命令とジャンプオフセット

0020 mov eax, [ebp+0x0c]; value inside = 0x000000ff 
0023 mov cl, [ebp+ox08]; value inside- 0x82 
0026 cmp al, cl 
0028 jl label    ;label is at address 003c, jl is signed 
002a nop 
002b 
... 
003c label:sub al,cl 

[ebp+0x08]の値が0x82とし、ecxこのコードを実行する前に0xabcd1234ある場合は、 このコードを実行した後eaxの値は何ですか?
ecxが0x00000082、またはecxが0xabcd1282になるように上位ビットをクリアしますか?

また、jl命令のオフセットが計算されるアドレスは何ですか?
jl命令のオフセット値はどのようにして決まりますか?

alの値がclより大きい値ではありませんか。そうでないでしょうjlジャンプ? clが0xabcd1282でロードした後、予め

+0

'jl'は* signed * less-thanです。あなたは符号付き2の補数としてあなたの数を解釈する必要があります。それらは両方とも符号ビットがセットされているので、「0xff_256」および「0x82_256」である。 –

+1

low8/low16レジスタを書き込んでも、上位バイトは変更されません。これは、完全な64ビット・レジスタを0にする32ビット・レジスタの書き方とは異なります。 https://stackoverflow.com/questions/11177137/why-do-most-x64-instructions-zero-the-upper-part-of-a-32-bit-register –

+0

少なくとも3つの質問があります。しないでください、[ask]を見てください。アセンブラが命令の終わりからjmpの変位をどのように計算するかを知りたい場合は、そのコードをアセンブルして、マシンコードバイトの逆アセンブル+ hexdumpを見てください。マニュアルとガイドへのリンクについては、https://stackoverflow.com/tags/x86/infoも参照してください。インテルのx86マニュアルには、命令エンコーディングの詳細がすべて含まれています。 –

答えて

3

おかげecxの値。

cl(符号付き-126 /符号なし130)はal(符号付き-1 /符号なし255)未満です。符号付きまたは符号なしとして扱われます。 (この場合は、jlによって署名されているように扱われます)。ジャンプは行われません。 0x2bと0x3cの間の命令はわからないので、eaxecxの最終値が何であるかを知る方法はありません。

ジャンプのオフセットは0x12(0x3c - 0x2a、デスティネーションのアドレスから次の命令のアドレスを引いたもの)です。

+0

すごく、ありがとう! – Monica

関連する問題