學習x86組合語言8 讓映象支援Fat12檔案格式

2021-10-23 17:11:37 字數 3982 閱讀 7674

二、fat12格式的引導區**:

三、 檔案讀寫

四、讀磁碟映象並寫入檔案,檢視檔案格式

軟盤結構:

簡寫格式

c0-h0-s1用來存放引導區,如果最後兩個位元組是0x55,0xaa(dw 0xaa55),bios就把這512位元組讀出來執行。

項數量=

9∗512∗8/

12=3072(個

)fat項數量=9*512*8/12=3072(個)

fat項數量

=9∗5

12∗8

/12=

3072

(個)名稱

開始位元組

長度內容

dir_name

00xb

檔名8位元組,副檔名3位元組

dir_attr

0xb1

檔案屬性

保留位0xc

10保留

dir_wrttime

0x16

2最後一次寫入的時間

dir_wrtdate

0x18

2最後一次寫入的日期

dir_fstclus

0x1a

2此檔案在資料區和fat表中的開始簇號

dir_filesize

0x1c

4檔案大小

;%define _boot_debug_   		; 做boot sector時把這行注釋掉

; 啟用這行就用nasm boot.asm -o boot.com生成.com檔案用於除錯

%ifdef _boot_debug_

org 0100h

%else

org 07c00h

%endif

cyls equ 10

; 把軟盤按fat12格式填充

jmp init ; 跳轉指令

db 0x90 ; 空 db,dd用來寫單位元組

db "notoneos" ; 廠商名,8位元組,db用來寫雙位元組

dw 512 ; 每個扇區大小512位元組,dw用來寫4位元組

db 1 ; 每個簇的扇區數

dw 1 ; boot佔的扇區

db 2 ; 有2個fat表

dw 224 ; 根目錄大小224

dw 2880 ; 磁碟扇區總數 2880

db 0xf0 ; 介質描述符,磁碟種類必須為0xf0

dw 9 ; 每個fat扇區數

dw 18 ; 每個磁軌18個扇區

dw 2 ; 2個磁頭

dd 0 ; 隱藏扇區數

dd 2880 ; 同上,磁碟大小

db 0, 0, 0x29 ; 0x29 擴充套件引用標記

dd 0xffffffff ; 無意義,固定這麼寫

db "notoneos " ; 磁碟名(卷標),11位元組

db "fat12 " ; 磁碟格式名,8位元組

resb 18 ; 空18個位元組,填充0x00

init:

mov ax,0

mov ss,ax

mov sp,0x7c00 ; 堆疊空間,從0x7c00向前

mov ds,ax

mov ax,0x0820 ; 把磁碟資料載入到記憶體0x0820處。 0x8000~0x81ff的512位元組給啟動區用的,所以從0x0820開始

mov es,ax ; 初始化磁碟介面

mov ch,0 ; 柱面 0

mov dh,0 ; 磁頭 0

mov cl,2 ; 扇區 2

readloop:

mov si,0 ; 記錄失敗次數

retry:

mov ah,0x02 ; 0x02 讀磁碟

mov al,1 ; 讀1個扇區

mov bx,0

mov dl,0x00 ; a驅動器

int 0x13 ; bios 讀磁碟功能

jnc next ; 成功跳轉

add si,1 ; 失敗加一次

cmp si,5 ; 到5次就跳到error

jae error

mov ah,0x00 ; 復位磁碟功能

mov dl,0x00

int 0x13 ; 重置磁碟驅動器

jmp retry ; 重試

next:

mov ax,es ; 記憶體位址向後移動0x0020

add ax,0x0020

mov es,ax ; 通過ax給es加0x0020

add cl,1 ; 扇區+1

cmp cl,18 ; 有沒有到18個扇區

jbe readloop ; cl<=18,就跳到 readloop

mov cl,1

add dh,1

cmp dh,2

jb readloop ; 如果 dh < 2 ,則跳到readloop

mov dh,0

add ch,1

cmp ch,cyls

jb readloop ; 如果ch使用bios中斷int 13h

,引數:

中斷號暫存器

作用13h

ah=00h

dl=驅動器號(0表示a盤)

復位軟碟機

ah=02h

ch=柱面(磁軌)號

dh=磁頭號

es:bx->資料緩衝區

al=要讀扇區數

cl=起始扇區號

dl=驅動器號(0表示a盤)

知道扇區號的時候,要計算int 13h的引數

設扇區號/每磁軌扇區數(18) = 商 q,餘數r ,則:

下面使用virtualbox讀入磁碟映象,並寫入乙個檔案。(新建虛擬機器並加虛擬磁碟的方法前面章節有提到。)

使用vscode開啟磁碟映象,可以看到儲存區域已經有了變化:

這裡使用的是笨方法儲存檔案,也可以使用edimg.exe程式來做。

後面章節來看如何讓程式載入notoneos.sys裡的**。

本章**與編譯執行方法已放到gitee:

組合語言 基於X86 學習筆記

1.機器語言 machine language 是一種數字語言,專門設計成唄計算機處理器 cpu 理解。所有x86處理器都理解的共同機器語言。2.組合語言 assembly language 包含助記符書寫的語言。3.組合語言與機器語言是一一對應 one to one 的關係。4.彙編器 assem...

搭建x86組合語言學習環境

masm中包含了8086彙編程式設計中要用到的幾個必需的工具 masm.exe彙編 link.exe連線 debug.exe除錯,edit.com和edlin.com是兩個編輯程式。如下 將這個資料夾拷貝到你習慣的工作盤 我用d盤作工作盤,拷貝後,這些檔案在d masm中 2.安裝dosbox 雙擊...

x86組合語言學習筆記2

乙個簡單的組合語言程式 data sum dword 0 code main proc mov eax,5 add eax,6 mov sum,eax invoke exitprocess,0 main endp 加法指令 add 減法指令 sub 加一指令 inc 減一指令 dec 取補指令 ne...