汇编 --- 从磁盘(扇区2到18)上读取数据到内存中
生活随笔
收集整理的這篇文章主要介紹了
汇编 --- 从磁盘(扇区2到18)上读取数据到内存中
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
下面代碼讀取柱面:0,磁頭:0,扇區(qū)從2到18的數(shù)據(jù)到內(nèi)存 0x8200~0xa3ff處
- 需要明白以下幾點(diǎn):
- 給定柱面,磁頭,一個(gè)扇形區(qū)域是512字節(jié),對(duì)應(yīng)的物理可以理解為512個(gè)燈泡組(一個(gè)燈泡組有8個(gè)小燈泡)
- 確定讀取到內(nèi)存中的位置
- 為什么是0x8200:因?yàn)?x8000~0x81ff這512個(gè)字節(jié)要留給啟動(dòng)區(qū).
- 為什么是0x8000以后,因?yàn)檫@一段內(nèi)存區(qū)域,很少有人使用,故讀取到這段內(nèi)存上出錯(cuò)的機(jī)率低
- CH(計(jì)數(shù)寄存器的高位)用于存儲(chǔ)柱面信息
- DH(數(shù)據(jù)寄存器的高位)用于存儲(chǔ)磁頭信息
- CL(計(jì)數(shù)寄存器的低位)存儲(chǔ)扇區(qū)
- SI(源變址寄存器)用于存儲(chǔ)讀取磁盤(pán)失敗的次數(shù)
- 根據(jù)BIOS提供的信息:
- AH = 0x02 ; 讀入磁盤(pán)
- AL = 1 ; 一次讀取1個(gè)扇區(qū)
- 系統(tǒng)復(fù)位: 復(fù)位軟盤(pán)狀態(tài),再讀一次MOV AH,0x0820 MOV DL,0x00 INT 0x13
- SI大于5時(shí),執(zhí)行error代碼段
- JAE(Jump if above or equal):大于等于
- JNC(Jump if not carry):如果沒(méi)有出錯(cuò)的話跳到后面的代碼段
- next代碼段:用于讀取下一個(gè)磁盤(pán)扇形區(qū)到內(nèi)存中
- 一個(gè)扇形區(qū)域是512B,對(duì)應(yīng)的段地址(es)偏移為0x0020,故使用AX給es加0x0020
總體代碼如下
; haribote-ipl ; TAB=4ORG 0x7c00 ; 程序從哪里裝入; 以下是對(duì)標(biāo)準(zhǔn)FAT12格式軟盤(pán)的描述JMP entryDB 0x90DB "HARIBOTE" ; 可以自由書(shū)寫(xiě)引導(dǎo)扇形區(qū)的名稱(chēng) (8字節(jié))DW 512 ; 1扇區(qū)的大小 (必須做成512)DB 1 ; 集群大小 (必須設(shè)置在一個(gè)扇區(qū))DW 1 ; FAT從哪里開(kāi)始 (一般從第一個(gè)部分開(kāi)始)DB 2 ; FAT的個(gè)數(shù) (必須是2)DW 224 ; 根目錄區(qū)域的大小 (一般為224條目)DW 2880 ; 這個(gè)驅(qū)動(dòng)器的大小 (必須是2880扇區(qū))DB 0xf0 ; 媒體類(lèi)型 (必須是0xf0)DW 9 ; FAT區(qū)域的長(zhǎng)度 (必須設(shè)置為9個(gè)扇區(qū))DW 18 ; 1卡車(chē)有幾個(gè)扇區(qū) (必須是18)DW 2 ; 頭數(shù) (必須為2)DD 0 ; 因?yàn)椴皇褂梅謪^(qū), 這里一定0DD 2880 ; 再寫(xiě)一次這個(gè)驅(qū)動(dòng)器的大小DB 0,0,0x29 ; 預(yù)先設(shè)置值DD 0xffffffff ; 音量序列號(hào)DB "HARIBOTEOS " ; 磁盤(pán)名稱(chēng) (11字節(jié))DB "FAT12 " ; 格式名稱(chēng) (8字節(jié))RESB 18 ; 暫且空開(kāi)18字節(jié); 程序主體entry:MOV AX,0 ; 寄存器初始化MOV SS,AXMOV SP,0x7c00MOV DS,AX; 讀磁盤(pán)MOV AX,0x0820MOV ES,AXMOV CH,0 ; 柱面0MOV DH,0 ; 磁頭0 (正面)MOV CL,2 ; 扇區(qū)2 readloop: ; 清零失敗寄存器MOV SI,0 ; 記錄失敗次數(shù)的寄存器; 重新嘗試 retry:MOV AH,0x02 ; AH=0x02 : 讀入磁盤(pán)(柱面0,磁頭0,扇區(qū)2)MOV AL,1 ; 1個(gè)扇區(qū)MOV BX,0MOV DL,0x00 ; A驅(qū)動(dòng)器INT 0X13 ; 調(diào)用磁盤(pán)BIOS JNC next ; 沒(méi)出錯(cuò)的話跳轉(zhuǎn)到nextADD SI,1 ; 出錯(cuò)了,SI加1CMP SI,5 ; 比較SI與5JAE error ; SI >=5時(shí), 跳轉(zhuǎn)到error; 復(fù)位軟盤(pán)狀態(tài)MOV AH,0x00MOV DL,0x00 ; A驅(qū)動(dòng)器INT 0x13 ; 重置驅(qū)動(dòng)器JMP entry; 讀取下一個(gè)扇區(qū) ; CL:扇區(qū)號(hào), ES:讀入的地址 next:; 把內(nèi)存地址后移0x200MOV AX,ES ADD AX,0x0020MOV ES,AX ; ES無(wú)法直接加 0x020ADD CL,1 ; 往CL里加1; 比較CL與18,如果小于18則跳轉(zhuǎn)到readloopCMP CL,18 JBE readloopfin: HLT ; 讓CPU停止, 等待指令JMP fin ; 無(wú)限循環(huán)error: MOV SI,msg putloop:MOV AL,[SI]ADD SI,1 ; 給SI加1CMP AL,0JE finMOV AH,0x0e ; 顯示一個(gè)文字MOV BX,15 ; 指定字符顏色I(xiàn)NT 0x10 ; 調(diào)用顯卡BIOSJMP putloop msg:DB 0x0a, 0x0a ; 換行2次DB "load error" ;DB 0x0a ; 換行DB 0RESB 0x7dfe-$ ; 用0x00將代碼不全至 0x7dfe-$DB 0x55, 0xaa ```總結(jié)
以上是生活随笔為你收集整理的汇编 --- 从磁盘(扇区2到18)上读取数据到内存中的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java躲子弹课设,Robocode高手
- 下一篇: DAC8563芯片参考手册重要内容总结