《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

你可能感兴趣的:(读书笔记)