2013-04-20 41 views
2

我目前正在開發一個教程,演示如何從零開始構建操作系統。裝配中的尋址

在本教程的某些部分中,有一些彙編代碼演示了尋址。

代碼只是試圖以4種不同的方式打印'X'。

本教程聲明只有最後2種方法才能成功打印'X'。

當我試過,我的機器上只有第三個嘗試成功

下面是代碼:

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 

現在,我明白了爲什麼前兩次嘗試失敗。

,我相信最後的兩次嘗試應打印X

那麼,爲什麼第四次嘗試打印失敗「X」?

任何幫助,將不勝感激

感謝

回答

-2

使用TASM代替NASM Theoretcically它會工作

3

您需要了解細分理解爲什麼一個或另一個可能會或可能無法打印X

我不打算根據具體情況解釋一切。相反,我會給你留下一些事實,一些反彙編和一些討論。

首先,BIOS可以使用CS=7C0hIP=0或使用CS=0IP=7C00h啓動引導扇區。兩者都指向相同的物理地址:7C0h * 16 + 0 = 0 * 16 + 7C00h = 7C00h

承擔,在這兩種情況下DS=CS(無論它是,7C0h0),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=0DS=7C0h - 一些方法訪問X將工作
  • CS=7C0hDS=0 - 一些其他的訪問X的方法,將工作
  • CS=0DS≠7C0h - 沒有任何訪問X的方法,將工作
  • CS=7C0hDS≠0 - 沒有任何訪問X的方法,將工作
+0

@AntoineMathys我集中在這個問題上的原因。雖然修正是正確的,但第二種情況會起作用。 – 2013-04-21 10:30:59