0

いくつかのチュートリアルの助けを借りて、フロッピーから起動した後に文字列を表示するための小さなコードを書きました。

私の問題は今、いくつかの行を理解していないことです。あなたが私を助けてくれることを願っていますか、私が正しければ教えてください。

コード:

mov ax, 07C0h
add ax, 288         ; (512 + 4096) / 16 = 288
mov ss, ax
mov sp, 4096

mov ax, 07C0h
mov ds, ax
  1. 行: アドレス 07C0h でプログラムを開始します (これを変更できますか?)
  2. ax に 288 段落分のスペースを追加する
  3. ?
  4. プログラム用に 4096 バイトのスペース (変数などを格納するため?)
  5. 開始アドレスに移動
  6. ?

ご協力いただきありがとうございます。

4

2 に答える 2

6
mov ax, 07C0h   
add ax, 288         ; (512 + 4096) / 16 = 288
mov ss, ax

これにより、セグメント番号 07C0h + 288 にスタック セグメント (ss) の開始点が配置されます。ブートローダーは、セグメント番号 07C0h の開始点にロードされます。ブートローダのサイズは 512 バイトで、各セグメントは 16 バイトです。これは、スタック セグメントがブートローダーの終了後 4096 バイトで始まることを意味します。

mov sp, 4096

これにより、スタック ポインターが 4096 に設定されます。つまり、スタックの先頭は、スタック セグメントの先頭から 4096 バイト後になります。実際には、これによりスタックに 4096 バイトが割り当てられました。

mov ax, 07C0h
mov ds, ax

これにより、データ セグメントが 07C0h (ブートローダーが開始するセグメント) に設定されます。後でブートローダでデータ ラベルを参照する場合、それらはデータ セグメントを使用するため、ブートローダはメモリ内の正しい位置を見つけることができるようにデータ セグメントの先頭にある必要があります。

于 2012-09-14T17:48:16.947 に答える
3
mov ax, 07C0h   // copy the address 07C0h into the register ax
add ax, 288     // add the number 288 to the address in ax
mov ss, ax      // copy the result to the stack segment register (07C0h + 288)
mov sp, 4096    // set the stack pointer to 4096

mov ax, 07C0h   // copy the address 07C0h to ax again
mov ds, ax      // copy the address 07c0h from ax into ds

.. それはあなたが与えたすべてです。

于 2012-09-14T15:36:15.917 に答える