2010-12-31 11 views
0

fooの呼び出し文があるとします。私はレジスタEBXでのリターンアドレスを持っているx86関数呼び出し中にjmpアドレスを見つける方法は?

push ip + 6 
jmp <addr of foo> 

- だから、アセンブラは、呼び出し文に遭遇したとき、それがにそれを分解します。今私は "fooのaddr"を見つけたいと思っています。どうすればいいのですか? push文がjmpの前にあることを確認したい。メモリマップはこのように見えるでしょうか?

------- 
push (what will be the value stored in this byte?? opcode ??) 
------- 
jmp (what will be the value stored in this byte?? opcode ??) 
------- 
jmp byte 1 
------- 
jmp byte 2 
------- 
jmp byte 3 
------- 
jmp byte 4 
------- 
return address stored in ebx 
------- 

プッシュとjmpのオペコードは何ですか?

+1

'call'は、プロセッサーによって実行される命令です。アセンブラは変換しません。あなたは 'プッシュ'と 'jmp'と同等であると考えることができますが、それらは同じものではありません。 – wj32

+0

@ wj32:呼び出しがプロセッサによって実行された場合はokです。どのようにジャンプ先の住所を取得するのですか? – Bruce

+0

@ wj32:呼び出し文のメモリマップは何ですか? – Bruce

答えて

4

callを2つの命令に分解しません。 callは、独自の機械語のオペコードを持つ独立した命令です。

コールのタイプ(相対値または間接的にメモリの内容などに指定されたnearまたはfarアドレス)によって、callのオペコードが異なります。32ビットモードの通常のタイプのコール呼び出し)の場合は、オペコードE8の後に、callの後の次の命令を基準にして、ターゲットアドレスを指定する4バイトの値が続きます。詳細については

Intel Manualcallのエントリを参照して、ボリューム2.

+0

コールのオペコードを取得した参照先を教えてください。 – Bruce

+0

@Bruce:標準参照へのリンクを追加しました。 – interjay

2

wj32は、上記のコメントで述べている@として、CALLは単一の命令である - それがに「分解」されません。 PUSHおよびJMPCALLのオペコードは、宛先アドレスの指定方法に応じてE8,9AまたはFFになります。さまざまなオペコードの詳細については、セクション3.2の「CALL」のIntel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2A: Instruction Set Reference, A-Mを参照してください。

1

callの種類によって異なります。あなたは必要なすべての情報をIntel manualsから得ることができます。

ターゲット・オペランドのいずれかのコードセグメント(コード・セグメントのベースからのオフセット で絶対オフセットを指定します。これは私が(近コールに対して)以下の関連するビットを引用します命令エンコーディングなどを含みます)または相対オフセット(EIPレジスタ内の命令ポインタの現在の値に対する相対的な符号付き変位 ;この値 は、CALL命令に続く命令を指します)。 CSレジスタは、ニアコール時に が変更されていません。

0

私はfooの絶対アドレスで終わるかもしれないと思います!リンカーがそれを行い、コンパイルされたコードには名前がないためです。グローバル変数でも同じです 例えば、uをアセンブルすると、j fooが得られます。 がコンパイルされ、コンパイルされてコンパイルされます。nd ull get j 0X45335

+0

どのディムブンラーをお使いですか? – Bruce

関連する問題