您需要了解細分理解爲什麼一個或另一個可能會或可能無法打印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
的方法,將工作
@AntoineMathys我集中在這個問題上的原因。雖然修正是正確的,但第二種情況會起作用。 – 2013-04-21 10:30:59