《x86組合語言-從真實模式到保護模式》筆記
阿新 • • 發佈:2019-01-05
通過硬碟控制器埠讀扇區資料
使用LBA邏輯塊編址中的LBA28,步驟如下
1. 設定讀取的扇區數量,這個數值要寫入0x1f2埠,這是一個8位埠
mov dx, 0x1f2
mov al, 0x01 ;表面寫入一個扇區
out dx, al ;in或者out只能用ax,dx,立即數
每讀一個扇區這個值都將減1
2. 設定起始LBA扇區號
扇區都是連續的所以只需要提供開頭扇區號,一共需要28位的扇區號,超過埠的大小,需要分成4段,分別是0x1f3,0x1f4,0x1f5,0x1f6,依次是0~7位,8~15位…
mov dx, 0x1f3 ;這個例子是將0x02作為扇區號
mov al, 0x02
out dx, al ;埠0x1f3,LBA地址0~7
inc dx
mov al, 0x00
out dx, al ;埠0x1f4
inc dx
out dx, al ;埠0x1f5
inc dx
mov al, 0xe0
out dx, al ;埠0x1f6, 在這個埠中只需要提供4位,高位的4位是設定位,第6位表示1時為LBA,0為CHS,第4位表示1時為從硬碟,0為主硬碟,高3位全為1,表示LBA模式
3.向埠0x1f7寫入0x20請求硬碟讀
mov dx, 0x1f7 ;這個埠為8位
mov al, 0x20
out dx, al
4.等待硬碟進行讀寫操作
埠0x1f7也可以作為狀態監控,它的最高位為1時表示硬碟忙,第3位為1時表示硬碟做好了和主機交換資料,第0位為1表示錯誤發生,具體錯誤通過埠0x1f1檢視
mov dx, 0x1f7
.waits:
in al, dx ;從埠0x1f7讀8位資料放入al中
and al, 0x88
cmp al, 0x08 ;檢視第3位是否置為1
jnz .waits
5.連續的取出資料
0x1f0是硬碟介面的資料埠,並且是一個16位埠,一旦硬碟控制器空閒,且準備就緒,就可以連續的從這個埠寫入或讀取資料
mov cx, 256
mov dx, 0x1f0;資料埠
.readw
in ax, dx
mov [bx], ax
add bx, 2 ;因為是16位,每次兩位元組傳送
loop .readw
bochs除錯
螢幕游標控制
游標的位置使用兩個8位的暫存器控制,顯示卡的VGA文字模式是25行,每行80個字元,從0開始到1999個字元。因為顯示卡暫存器眾多,所以使用索引暫存器,埠號為0x3d4,向其寫入值用來指定埠,控制游標位置的高8位和低8位暫存器索引值分別為0x0e和0x0f。指定了暫存器之後,對其進行讀寫,使用**資料埠**0x3d5