X を出力する場合と出力しない場合がある理由を理解するには、セグメントを理解する必要があります。
ケースバイケースですべてを説明するつもりはありません。代わりに、いくつかの事実、いくつかの分解、およびいくつかの議論を残します.
まず、BIOS はCS=7C0h
andIP=0
またはCS=0
andのいずれかでブートセクタを開始できますIP=7C00h
。どちらも同じ物理アドレスを指しています: 7C0h * 16 + 0
= 0 * 16 + 7C00h
= 7C00h
.
差し当たり、どちらの場合DS=CS
でも (または のいずれ7C0h
か0
)、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」にアクセスするいくつかの方法が、ある場合には機能し、別の場合には機能しない理由、およびその逆の理由が明確にわかります。
DS
BIOS はブートセクタの実行開始時に特定の値を保証しないため、次のDS≠CS
4 つのケースが考えられます。
CS=0
、DS=7C0h
- 一部のアクセス方法はX
機能します
CS=7C0h
、DS=0
- アクセスする他のいくつかの方法X
が機能します
CS=0
、DS≠7C0h
- アクセスする方法はどれもX
機能しません
CS=7C0h
、DS≠0
- アクセスする方法はどれもX
機能しません