helloosをステップ実行する(2)実行編

プログラミング
スポンサーリンク

ステップ実行の続きです。

まず、次の命令に移動したときにそのあとの5命令が表示されるようにします。
「disp/5i $pc」 とタイプ 

逆アセンブルしたときの表記をintel風にします。 

「set disassembly-flavor intel」

「si」で一つ命令を進めます。

次に実行される命令は
「0xe05b: add BYTE PTR [eax],al」
です。ひとつづつ実行していくといくら時間があってもたりないのでジャンプします。

ブレークポイントを設定してそこまでステップを進めます。

「b *0x7c00」 で 「メモリ上のアドレス」にブレイクポイントを設定します。

「c」で コンティニュー。ブレークポイントまで処理を進めます。

0x7c00にジャンプしました

「si」で一つ命令を進めます。


命令を進めていくと  「 0x7c6d: int 0x10」 という命令があります。一文字表示関数のようです。

「si」で進めると「0x7c6d」からはかなり離れたの場所へジャンプしました。 

「 0x566d: add BYTE PTR [eax],al」
ここが一文字表示関数の入り口なのでしょう。(わかりませんが)

「si」を連打していますがいつまでたっても「0x7c6d」の次の命令に戻ってこれません。

あと、「si 数字」 とすると 数字ステップだけ命令を進められます。
100ステップ進めてみました

まだ戻ってこれません。

一文字表示関数へのジャンプ元の次のアドレス「0x7c6f」にブレークポイントを設定して「c」。 戻ってきました。

一文字表示関数を一回実行したのでqemuの画面に変化が現れました。改行をしたのでカーソルの位置が1行下へ移動しています。(よく見ないとわからないです)

この状態で「c」とタイプすると またブレークポイント「0x7c6f」まで進みます。一文字表示関数を実行して再び「0x7c6f」に戻ってきました。

更にcとタイプしていくと
1文字ずつ画面に表示されていくのが確認できます。

「hello,world」が表示されました