1. 程式人生 > >《x86組合語言-從真實模式到保護模式》筆記

《x86組合語言-從真實模式到保護模式》筆記

通過硬碟控制器埠讀扇區資料

使用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