1. 程式人生 > >一、磁碟載入程式(2)

一、磁碟載入程式(2)

一、簡單的磁碟載入程式

簡單的說明:計算機加電後,BIOS檢查硬體等等,BIOS呼叫19號中斷載入磁碟載入程式。

以下用NASM編寫的一個簡單的磁碟載入程式。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;    '$'表示當前程式碼行的地址,'$$'表示起始程式碼地址
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
[bits 16]                                    ;說明這是16位程式碼(可以不寫)
org    7c00h                             ;在執行時將此段程式載入到記憶體7c00h位置
jmp    $                                     ;迴圈
times    510 - ($ - $$)     0     ;剩餘部分填充0,總大小為512,為0xaa55預留2位元組

dw    0xaa55                           ;結束標誌

二、真實模式與保護模式

簡單來理解,真實模式執行在16位環境下,保護模式執行在32位環境下。32位環境中定址空間可達4GB,除此之外,32位環境中可以很好的支援多工。

從執行程式的角度來理解兩種模式:

1、真實模式

真實模式下計算地址方式是通過“16位段地址(暫存器中)*16h+偏移”來實現的。

例如指令的定址:CS*16h + IP


2、保護模式

保護模式下計算地址的方式是通過“GDT中儲存的段地址*16h+偏移”來實現的。32位模式下,16位的段地址被用來尋找GDT的位置。

例如指令的定址:CS-->GDT程式碼段位置*16h + IP

解釋一下GDT(Global Descriptor Table),看一下他的結構:

從表中可以看出,GDT首先是一個數組結構,每一個條目儲存了段的資訊。下面就可以來理解保護模式下如何通過描述符表來進行地址計算了:


以上是真實模式向保護模式轉換的基本原理。