2014-03-19 59 views
0

這是我從Bootloader的內存位置

`[ORG 0x00] 
[BITS 16] 

SECTION .text 

jmp 0x07c0:START    ; set CS(segment register) to 0x07C0 and jump to START label. 
TOTALSECTORCOUNT: 
    dw 0x02 
KERNEL32SECTORCOUNT: 
    dw 0x02 

START: 
    mov ax, 0x07c0 
    mov ds, ax     ; set DS(segment register) to the address of the bootloader. 

mov ax, 0xb800 
mov es, ax      ; set ES(segment register) to the address of the video memory starting address. 

; stack initialization 
mov ax, 0x0000 
mov ss, ax 
mov sp, 0xfffe 
mov bp, 0xfffe 

; clear the screen 
mov si, 0 
CLEARSCREEN: 
    mov byte[es:si], 0 
    mov byte[es:si + 1], 0x0a 

    add si, 2 
    cmp si, 80 * 25 * 2 

    jl CLEARSCREEN 

; print welcome message` 

我學習不明白一開始就引導程序的一部分:jmp 0x07C0:START它是如何設置的CS註冊? ,什麼是兩個變量TOTALSECTORCOUNTKERNEL32SECTORCOUNT呢?他們不啓動扇區文件的任何地方出現,如果刪除它們,引導加載程序加載失敗的歡迎信息。

刪除部件會導致操作系統無法加載。那麼jmp聲明和兩個變量的意義是什麼?

``[ORG 0x00] 
[BITS 16] 

jmp START 


START: 
    mov ax, 0x07c0 
    mov ds, ax     ; set DS(segment register) to the address of the bootloader. 

mov ax, 0xb800 
mov es, ax      ; set ES(segment register) to the address of the video memory starting address. 

; stack initialization 
mov ax, 0x0000 
mov ss, ax 
mov sp, 0xfffe 
mov bp, 0xfffe 
` 
+0

我不知道這兩個變量的想法沒有看到完整的代碼。 – Breavyn

回答

2

我與裝配不是很大,通常使用AT &牛逼語法也。然而我之前寫過一個bootloader。

希望您已經瞭解了16位應用中使用的分段尋址系統。所述cs寄存器保存代碼段http://wiki.osdev.org/Segmentation

jmp 0x07C0:START ;This is a long jump 
jmp segment:offset 

甲跳遠設置cs寄存器段參數,然後再執行跳轉到偏移參數。當你做一個短跳cs寄存器不會改變。我認爲它將包含0x0。您可以使用短暫的跳轉,但您必須必須告訴您的彙編器或鏈接器其中代碼將運行。

編輯:在再次讀取代碼後,有[org 0x00]行。這種默認設置cs寄存器0x00。如果你想用短跳轉嘗試改變這一行[org 0x7c00]

+0

我不小心刪除了這個問題。謝謝回答!我問另一個涉及兩個變量的問題。我不確定他們爲什麼在那裏,但它與圖片創作者有關。 http://stackoverflow.com/questions/22522879/floppy-disk-sector-count –

+0

'[org 0x00]'不會設置_CS_寄存器。設置段寄存器取決於要執行的代碼。 '[org 0x00]'將根據_ORG_指令生成虛擬內存地址。正確設置它們的責任取決於開發者的職責。 –

0

CS應該已經在BIOS中設置爲0x7c00太行:

jmp 0x07c0:START

可以被替換jmp START

您提到的兩個變量必須在代碼的其他地方用於加載內核。不過,看起來你還沒有在這裏發佈整個代碼。

沒有看到引導程序代碼的其餘部分,我們無法提供幫助。

+0

這實際上是不正確的。你不應該假設_CS_是你想要的值。有些BIOS實際上跳轉到你的代碼,其中_CS_是0x07c0和0x0000作爲IP。這是可行的,因爲它也映射到物理地址0x07c00。我寫了一篇關於這種情況的SO Q&A,[可能是這種情況](http://stackoverflow.com/questions/34548325/near-call-jump-tables-dont-always-work-in-a-bootloader)。這就是爲什麼你不應該盲目地將CS複製到ES和DS,而是應該明確地將它們設置爲你期望的值。如果你寫的代碼不依賴_CS_的值是一個特定的值,那麼它是好的 –

+0

我認爲CS總是設置爲0x7c0。那我不好。感謝您的澄清。 – flg