2

私は現在、OS をゼロから構築する方法を示すチュートリアルに取り組んでいます。

チュートリアルの一部のセクションでは、アドレス指定を示すアセンブリ コードがいくつかありました。

このコードは、単に 'X' を 4 つの異なる方法で出力しようとします。

チュートリアルでは、最後の 2 つの方法だけが「X」の出力に成功すると主張しています。

私のマシンでそれを試したとき、3回目の試行だけが成功しました

コードは次のとおりです。

mov ah,0x0e

;first attempt
mov al,the_secret
int 0x10

;second attempt
mov al,[the_secret]
int 0x10

;third attempt
mov bx,the_secret
add bx,0x7c00      ; 0x7c00 is where bios loads our boot sector code
mov al,[bx]
int 0x10


;fourth attempt
mov al,[0x7c1e] 
int 0x10

jmp $

the_secret:
    db "X"

times 510 -( $ - $$ ) db 0
dw 0xaa55

これで、最初の 2 回の試行が失敗した理由がわかりました。

そして、最後の2回の試行でXが出力されるはずだと思います

では、なぜ 4 回目の試行で 'X' の出力に失敗するのでしょうか?

どんな助けでも大歓迎です

ありがとう

4

2 に答える 2

3

X を出力する場合と出力しない場合がある理由を理解するには、セグメントを理解する必要があります。

ケースバイケースですべてを説明するつもりはありません。代わりに、いくつかの事実、いくつかの分解、およびいくつかの議論を残します.

まず、BIOS はCS=7C0handIP=0またはCS=0andのいずれかでブートセクタを開始できますIP=7C00h。どちらも同じ物理アドレスを指しています: 7C0h * 16 + 0= 0 * 16 + 7C00h= 7C00h.

差し当たり、どちらの場合DS=CSでも (または のいずれ7C0h0)、CPU はブートセクタの同じマシン コードの次の 2 つの異なるビューのいずれかを持つと仮定します。

IP        instruction bytes instruction
00000000  B40E              mov ah,0xe
00000002  B01E              mov al,0x1e
00000004  CD10              int 0x10
00000006  A01E00            mov al,[0x1e]
00000009  CD10              int 0x10
0000000B  BB1E00            mov bx,0x1e
0000000E  81C3007C          add bx,0x7c00
00000012  8A07              mov al,[bx]
00000014  CD10              int 0x10
00000016  A01E7C            mov al,[0x7c1e]
00000019  CD10              int 0x10
0000001B  E9FDFF            jmp word 0x1b
0000001E  58                pop ax        ; this is your 'X'
...

また

IP        instruction bytes instruction
00007C00  B40E              mov ah,0xe
00007C02  B01E              mov al,0x1e
00007C04  CD10              int 0x10
00007C06  A01E00            mov al,[0x1e]
00007C09  CD10              int 0x10
00007C0B  BB1E00            mov bx,0x1e
00007C0E  81C3007C          add bx,0x7c00
00007C12  8A07              mov al,[bx]
00007C14  CD10              int 0x10
00007C16  A01E7C            mov al,[0x7c1e]
00007C19  CD10              int 0x10
00007C1B  E9FDFF            jmp word 0x7c1b
00007C1E  58                pop ax          ; this is your 'X'
...

「X」にアクセスするいくつかの方法が、ある場合には機能し、別の場合には機能しない理由、およびその逆の理由が明確にわかります。

DSBIOS はブートセクタの実行開始時に特定の値を保証しないため、次のDS≠CS4 つのケースが考えられます。

  • CS=0DS=7C0h- 一部のアクセス方法はX機能します
  • CS=7C0hDS=0- アクセスする他のいくつかの方法Xが機能します
  • CS=0DS≠7C0h- アクセスする方法はどれもX機能しません
  • CS=7C0hDS≠0- アクセスする方法はどれもX機能しません
于 2013-04-21T03:06:51.693 に答える
-2

nasm の代わりに tasm を使用します 理論的には動作します

于 2013-04-20T23:47:48.583 に答える