您需要了解段以了解为什么一个或另一个可能会或可能不会打印 X。
我不会逐案解释所有事情。相反,我会给你一些事实、一些拆解和一些讨论。
首先,BIOS 可以使用CS=7C0h 和IP=0 或CS=0 和IP=7C00h 启动您的引导扇区。两者都指向同一个物理地址:7C0h * 16 + 0 = 0 * 16 + 7C00h = 7C00h。
暂时假设在这两种情况下DS=CS(无论是7C0h 或0),CPU 将拥有引导扇区的同一机器代码的这两种不同视图之一:
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”的方法应该在一种情况下工作,而在另一种情况下不应该工作,反之亦然。
现在,由于 BIOS 不保证在您的引导扇区开始执行时 DS 中的任何特定值,您可能有 DS≠CS,这里有四种可能的情况:
-
CS=0、DS=7C0h - 一些访问X 的方法将起作用
-
CS=7C0h、DS=0 - 其他一些访问 X 的方法也可以使用
-
CS=0、DS≠7C0h - 访问 X 的方法都不起作用
-
CS=7C0h、DS≠0 - 访问 X 的方法都不起作用