EIP
登録するジャンプ命令として登録するパラメータを渡そうとしていますEBX
。
2 に答える
簡潔な答え
JMP EBX
EBX
現在のコード セグメント内のレジスタに格納されているアドレスにジャンプします。 が指すコード セグメント内のJMP DWORD PTR DS:[EBX]
メモリ オフセットに格納されているアドレスにジャンプします。EBX
DS
たとえば、 let DS
= 0x0440 , EBX
= 0x00006200で、アドレス0x00006200のメモリの最初の 4 バイトは0x00003500になります (リトルエンディアン マシンでは00 35 00 00として格納されます)。
JMP EBX
になりJMP 0x00006200
ます。
JMP DWORD PTR DS:[EBX]
になるJMP 0x0440:0x00003500
長い答え
JMP EBX
次の署名があります。
JMP r/m32
この場合、ジャンプアドレスは32ビットレジスタ(あなたの場合)またはメモリ内の32ビット変数として格納されます。プロセッサは、値を にロードすることにより、オペランドで指定されたアドレスでニア ジャンプEIP
(同じコード セグメント内) を実行します。
JMP DWORD PTR DS:[EBX]
一方、次の署名があります。
JMP ptr16:32
ここでは、ジャンプ アドレスが 2 つの部分に分かれて提供されます。最初の値 (コロンの前) はジャンプ先のコード セグメントのアドレスを示し、2 番目 (コロンの後の値) はそのコード セグメント内のオフセットを示します。ジャンプは、現在のものとは異なるコード セグメントへのジャンプである可能性があるため、ファー ジャンプです。プロセッサは、最初の値を にロードしCS
、2 番目の値を にロードしてジャンプを実行しEIP
ます。
さらに、最初の命令とは[EBX]
対照的に、2 番目の命令は を使用しEBX
ます。つまり、格納されているオフセットでメモリを読み取り、EBX
その値を使用します。メモリを 32 ビット整数として扱う必要があることをアセンブラに伝える
DWORD PTR
サイズディレクティブです。
JMP EBX
EBX
レジスタ値が指すアドレスにジャンプするように CPU に指示することを意味します。の場合、アドレスEBX
に12345678h
ジャンプします12345678h
。したがって、命令は次のように解釈されJMP 12345678h
ます。
JMP DWORD PTR DS:[EBX]
レジスタ値が指すメモリアドレスとセレクタDWORD
から読み出した値が指すアドレスにジャンプするようCPUに指示する手段。がの場合、CPU はアドレス のメモリから値を読み取り、その値 (メモリからの値)が指すアドレスにジャンプします。メモリからの値が の場合、アドレス にジャンプします。したがって、命令は次のように解釈されます。メモリが読み取られた後、それは として解釈されます。EBX
DS
EBX
11111111h
DWORD
DS:11111111h
DWORD
DWORD
22222222h
22222222h
JMP DWORD PTR DS:[11111111h]
JMP 22222222h