EIP登録するジャンプ命令として登録するパラメータを渡そうとしていますEBX。
2 に答える
簡潔な答え
JMP EBXEBX現在のコード セグメント内のレジスタに格納されているアドレスにジャンプします。 が指すコード セグメント内のJMP DWORD PTR DS:[EBX]メモリ オフセットに格納されているアドレスにジャンプします。EBXDS
たとえば、 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 EBXEBXレジスタ値が指すアドレスにジャンプするように CPU に指示することを意味します。の場合、アドレスEBXに12345678hジャンプします12345678h。したがって、命令は次のように解釈されJMP 12345678hます。
JMP DWORD PTR DS:[EBX]レジスタ値が指すメモリアドレスとセレクタDWORDから読み出した値が指すアドレスにジャンプするようCPUに指示する手段。がの場合、CPU はアドレス のメモリから値を読み取り、その値 (メモリからの値)が指すアドレスにジャンプします。メモリからの値が の場合、アドレス にジャンプします。したがって、命令は次のように解釈されます。メモリが読み取られた後、それは として解釈されます。EBXDSEBX11111111hDWORDDS:11111111hDWORDDWORD22222222h22222222hJMP DWORD PTR DS:[11111111h]JMP 22222222h