如何使用x86彙編對硬碟進行讀寫

2021-09-28 13:33:19 字數 2014 閱讀 2249

硬碟讀寫的基本單位是扇區。就是說,要讀就至少讀乙個扇區,要寫就至少寫乙個扇區,不可能僅讀寫乙個扇區中的幾個位元組。這樣一來,就使得主機和硬碟之間的資料交換是成塊的,所以硬碟是典型的塊裝置。

從硬碟讀寫資料,最經典的方式是向硬碟控制器分別傳送磁頭號、柱面號和扇區號(扇區在某個柱面上的編號),這稱為 chs 模式。這種方法最原始,最自然,也最容易理解。

最早的邏輯扇區編址方法是lba28,使用 28 個位元來表示邏輯扇區號,從邏輯扇區 0x0000000 到 0xfffffff,共可以表示 2 ^28=268435456個扇區。每個扇區有512 位元組,所以 lba28 可以管理 128 gb 的硬碟。

但是硬碟技術發展得非常快,最新的硬碟已經達到幾百個吉位元組的容量,lba28 已經落後了。在這種情況下,業界又共同推出了 lba48,採用 48 個位元來表示邏輯扇區號。如此一來,就可以管理131072 tb 的硬碟容量了。在這裡我們採用將採用 lba28 來訪問硬碟。

第 1 步:

設定要讀取的扇區數量。這個數值要寫入 0x1f2 埠。這是個 8 位埠,因此每次只能讀寫 255 個扇區:

mov dx,0x1f2

mov al,0x01    ;1 個扇區

out dx,al

注意:如果寫入的值為 0,則表示要讀取 256 個扇區。每讀乙個扇區,這個數值就減一。因此,如果在讀寫過程中發生錯誤,該埠包含著尚未讀取的扇區數。

第 2 步:

設定起始 lba 扇區號。扇區的讀寫是連續的,因此只需要給出第乙個扇區的編號就可以了。28 位的扇區號太長,需要將其分成 4 段,分別寫入埠 0x1f3、0x1f4、0x1f5 和 0x1f6 號埠。其中,0x1f3 號埠存放的是 0~7 位;0x1f4 號埠存放的是 8~15 位;0x1f5 號埠存放的是 16~23 位,最後 4 位在 0x1f6 號埠。假定我們要讀寫的起始邏輯扇區號為 0x02,可編寫**

如下:mov dx,0x1f3

mov al,0x02

out dx,al ;lba 位址 7~0

inc dx ;0x1f4

mov al,0x00

out dx,al ;lba 位址 15~8

inc dx ;0x1f5

out dx,al ;lba 位址 23~16

inc dx ;0x1f6

mov al,0xe0 ;lba模式,主硬碟,以及 lba 位址 27~24

out dx,al

第 3 步:

向埠 0x1f7 寫入 0x20,請求硬碟讀。這也是乙個8 位埠:

mov dx,0x1f7

mov al,0x20   ;讀命令

out dx,al

第 4 步:

等待讀寫操作完成。埠0x1f7 既是命令埠,又是狀態埠。在通過這個埠傳送讀寫命令之後,硬碟就忙乎開了。如圖 8-12 所示,在它內部操作期間,它將 0x1f7 埠的第 7 位置「1」,表明自己很忙。一旦硬碟系統準備就緒,它再將此位清零,說明自己已經忙完了,同時將第 3位置「1」,意思是準備好了,請求主機傳送或者接收資料(圖 8-12)。完成這一步的典型**如下:

mov dx,0x1f7

.waits:

in al,dx

and al,0x88

cmp al,0x08

jnz .waits

第 5 步:

連續取出資料。0x1f0 是硬碟介面的資料埠,而且還是乙個 16 位埠。一旦硬碟控制器空閒,且準備就緒,就可以連續從這個埠寫入或者讀取資料。下面的**假定是從硬碟讀乙個扇區(512 位元組,或者 256 位元組),讀取的資料存放到由段暫存器 ds 指定的資料段,偏移位址由暫存器 bx 指定:

mov cx,256   ;總共要讀取的字數

mov dx,0x1f0

.readw:

in ax,dx

mov  [bx],ax

add bx,2

loop .readw

170824 彙編 x86基礎

a.1625 5 王子昂 總結 2017年8月24日 連續第325天總結 b.逆向知識 資料移動分為5種方式 立即數到暫存器 立即數到記憶體 暫存器到暫存器 暫存器到記憶體或記憶體到暫存器 記憶體到記憶體 前4種是所有現代體系都支援的,第五種是x86獨有的,可以通過inc add來直接操作記憶體 另...

X86彙編指令詳解

x86彙編基本分為七大體系 分別是 1 資料傳送指令 2 算術運算指令 3 邏輯運算指令 4 串操作指令 5 控制轉移指令 6 處理器控制指令 7 保護方式指令 先介紹資料傳送指令集 1 資料傳送指令 1.mov 格式 mov destination,source 功能 將s ource中的資料傳送...

x86彙編學習筆記

debug 是dos,windows都提供的實模式 8086 方式 程式的除錯工具.windows下使用dosbox模擬dos環境,掛載所在目錄後開啟debug.exe r指令 顯示r ax 0000 bx 0000 cx 0000 dx 0000 sp 00fd bp 0000 si 0000 d...