• 締切済み

アセンブリ言語のjmpについて

実行ファイルを逆アセンブルして出てきたjmp(far)というのが良く分かりません。これはどういう動作なんですか? 対応するオブジェクトコードはFF 25 20 F1 40 00となっています。

みんなの回答

  • A88No8
  • ベストアンサー率52% (836/1606)
回答No.6

こんにちは No.5です。 >で、結局far jmp処理については分からないんですか?  その通りです。技術資料を読ませていただきましたが、くだんの様に答え合せをして間違いに気づく力量なのでご迷惑をおかけしないようにここで去ります。 >しかし後続の25が分からず、そのあとのアドレス0004F120というのもこれをどう処理しているのかも分かりません。  私の力量では、&HFF25が far jmp を決定づける(CALL, PUSH,JMP の候補から)ところまでです。  ヒントは第2.6章表2-1、表2-2にあるようなのですが「インデックスに加算される」という言葉から動作が想像できませんでした。これは一体どういう動作なの(^^;?でSTOPです。  考えられる可能性は[EDX]レジスタと&H0004F120を何らかのハードウェア的なルールで加算してからコードポインタにロードするんだろうな..とは思いますが、IA-32のハードに詳しい方にお願いしたいと思います。

  • A88No8
  • ベストアンサー率52% (836/1606)
回答No.5

こんにちは No.4です。 追加資料ありがとうございます。引用文の解釈が完全に間違っていました(;_;)  付録BのB-12(P.346)を見てください。  「&HFF25」、つまり「1111 1111:0010 1010」は、エンコーディングの 「1111 1111:mod 101 r/m」にはまります(mod とr/m は関係ない) 。  この命令及びフォーマットを見るとJMP -Unconditional Jump(to other segment) indirect intersegment であり、「&HFF25」はこれを示しているのでした。  ちなみに&HFFは、JMP命令とは限りません。付録Bをみたら、PUSH や CALL にもあります。  これだけの資料があるのだから、理解できるまで読み込みましょう(^.^;

sainte
質問者

補足

理解できなかったから質問しています で、結局far jmp処理については分からないんですか?

  • A88No8
  • ベストアンサー率52% (836/1606)
回答No.4

こんにちは No.3です。  3-411章を見ると &HFF のJUMP命令は、下記 4種類ありますね。 OpC.d Inst. FF /4 JMP r/m16 FF /4 JMP r/m32 FF /5 JMP m16:16 FF /5 JMP m16:32  このオペコードの /4 と/5 は、3.1.1.1章の最初に説明があります。 <引用>/digit - 0 から7 までの数字で、命令のModR/M バイトがr/mオペランドだけを使用することを示す。reg フィールドには、命令のオペコードを拡張する数字が入っている。  「命令のModR/M バイト」とは、2.1章に説明されているように[Mod],[レジスタ/オペコード],[R/M]のビット群から構成されていて、「命令のModR/M バイト」の「r/m」オペランドだけを使用すること。 その「r/m」オペランド(reg フィールド)には、命令のオペコードを拡張する数字が入っていることが判ります(多分 &HFF + 5バイト)。  つまり/4 とか/5 を指定ということからオペコードは、&HFFと「命令のModR/M バイト」(今回は&H25)の 2バイトであることが判ります。 &H25の意味は、JMP /5を決定づける働きを持つことと2.6章の表2-1に規定される働きを持つということです。 ..と思います。  以上が当たっているかは、付録A-Bの オペコード&HFF25 に答えがのっていると思うのです。

sainte
質問者

補足

お付き合いいただきありがとうございます ご指摘の参考資料を載せておきます 以下URLのIA-32 インテル® アーキテクチャー・ソフトウェア・デベロッパーズ・マニュアル、中巻 B: 命令セット・リファレンス N-Z(上から6番目)です http://www.intel.co.jp/jp/download/index.htm#ia32 直接URL(http://download.intel.com/jp/developer/jpdoc/IA32_Arh_Dev_Man_Vol2B_i.pdf

  • A88No8
  • ベストアンサー率52% (836/1606)
回答No.3

こんにちは  いい資料をお持ちですね(^^;  ところでこの資料は、途中で終わっています(命令リファレンスNの頭)。 おそらく質問者さんの疑問を解消するには、後編に収録されている「付録A、付録B」も必要に思います。

  • A88No8
  • ベストアンサー率52% (836/1606)
回答No.2

こんにちは  far jump 命令は一つだけではないはずで、FFのあとにモードフィールドやらレジスタ・メモリフィールドなにやらがあるはず。  質問者さんがターゲットにされているCPUのハードウェア(far があるということは、INTEL系でしょうけど)を明示した方がよいのでは?  それによってターゲットCPUのオペコード表をお持ちの方がいれば、話は早いのですが.. P.S.  最初に見た質問の文章が変わってますね(^^;

sainte
質問者

補足

IA32です。 以下のPDFのものです。 http://download.intel.com/jp/developer/jpdoc/IA32_Arh_Dev_Man_Vol2A_i.pdf これの451ページに該当のjmp farが載っています。 しかしこれを読んでもFF25 20F14000というのが解読できません。 FFというのはオペコードだと分かります。 しかし後続の25が分からず、そのあとのアドレス0004F120というのもこれをどう処理しているのかも分かりません。 ちなみにこの部分はcall後の他dll内関数呼び出し時のjmpです。 よろしくお願いします。

回答No.1

そのまま「ジャンプ」だと思いますが。 命令の後ろに書かれているアドレスに飛んで、続きはそこから実行されるはず。

sainte
質問者

補足

しかしfar jmpはnear jmpとは違いますよね near jmpは単純にオフセットを足すだけなのは分かるんですが、farの場合はどうなってるんですか? また、オペコードFFのあとの25ってのは何を表しているんですか?

関連するQ&A