エミュレータ本記事はPythonで簡単なx86エミュレータを作成します。前回ではModR/Mを実装し、オペランドを柔軟に指定する方法について学びました。今回はサブルーチンを呼び出す命令であるcall/retについて学んできます。call/retとは前回では、ModR/Mを実装し、オペランドを柔軟に指定する方法について学びました。今回はサブルーチンを呼び出す命令であるcallと、呼び出し元へ戻るretを実装していきます。以下のC言語プログラムについて見ていきます。add1(1);}上記はadd1()で与えられた引数に1を加算して返す単純なプログラムです。これを逆アセンブルしたものを以下に記します。espを実行していますが、これは呼び出し元へ確実に戻るために必要な作業で、これによりサブルーチンから新たなサブルーチンを呼び出したりするような連鎖が起きても、問題なく呼び出し元へ戻ることができます。+0x1をスタックに積んでadd1()を呼び出します。eax,[ebp+0x8]でスタックに積んだ引数(1)をeaxにコピーし、最終的にオペコード0x40のinc命令でeaxに1を加算します。C言語では戻り値はeaxに格納されることになっており、戻り値を2つ以上に指定することはできないため、その際はポインタを使用します。Pythonによるスクリプトの作成それでは、Pythonでcall/retを実装していきます。breakemu.dump_registers()動作確認それでは、上記で作成したスクリプトを実行してみます。事前にアセンブリ言語のプログラムはbinファイルとしてビルドしておきます。0x00000000問題なくサブルーチンを呼び出し、eaxに計算結果である2が格納できたことが確認できました。x86エミュレータの作成(bios)本記事はPythonで簡単なx86エミュレータを作成します。x86エミュレータの作成(in/out命令)本記事はPythonで簡単なx86エミュレータを作成します。x86エミュレータの作成(eflags)本記事はPythonで簡単なx86エミュレータを作成します。x86エミュレータの作成(ModR/M)本記事はPythonで簡単なx86エミュレータを作成します。x86エミュレータの作成(org疑似命令)本記事はPythonで簡単なx86エミュレータを作成します。入門)月別アーカイブこのサイトについてプライバシーポリシーはてなブログをはじめよう!s3cr3tさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。