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