質問がありましたまともな答えが見つからないようでした。
私はこのコードを与えられている: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でロードした後、予め
'jl'は* signed * less-thanです。あなたは符号付き2の補数としてあなたの数を解釈する必要があります。それらは両方とも符号ビットがセットされているので、「0xff_256」および「0x82_256」である。 –
low8/low16レジスタを書き込んでも、上位バイトは変更されません。これは、完全な64ビット・レジスタを0にする32ビット・レジスタの書き方とは異なります。 https://stackoverflow.com/questions/11177137/why-do-most-x64-instructions-zero-the-upper-part-of-a-32-bit-register –
少なくとも3つの質問があります。しないでください、[ask]を見てください。アセンブラが命令の終わりからjmpの変位をどのように計算するかを知りたい場合は、そのコードをアセンブルして、マシンコードバイトの逆アセンブル+ hexdumpを見てください。マニュアルとガイドへのリンクについては、https://stackoverflow.com/tags/x86/infoも参照してください。インテルのx86マニュアルには、命令エンコーディングの詳細がすべて含まれています。 –