![图片.png](https://i-blog.csdnimg.cn/blog_migrate/ffc1dc095f58a16d326cea9a5b5d0278.png)
介绍
显卡
- 显卡内部非常复杂,且包含大量寄存器
- 为了不过度占用I/O空间,故很多寄存器都使用指定的寄存器间接访问
显卡寄存器 | 映射地址 | 描述 |
---|
14,15 | 0x0e,0x0f | 光标索引 //8bit * 2 //两个寄存器共同存储光标索引 |
例
;中断---------------
;退出进程
mov ax, 1
int 0x80
;打印文字
msg db "hello world!" ;字符
msg_len equ $-data ;字符长度
mov ax, 4 ;写入
mov bx, 1 ;标准输出
mov cx, msg ;字符串
mov dx, msg_len ;字符串长度
int 0x80
;输入输出--------------------------
;显卡读写-------
;获取光标的行号 ; al = 0x0e
mov al, 0x0e
out 0x3d4, al ;0x3d4 = 0x0e ;指定要读取的寄存器
in al, 0x3d5 ;al = 0x3d5 ;获取指定的寄存器的值
;修改光标的行号 ; 0x0e = al
out 0x3d5, al ;0x3d5 = al ;修改指定的寄存器的值
;读取硬盘--------
计算机原理
;要求硬盘从主盘,使用LBA模式读取 0x0000002 扇区号开始的 1 个扇区
; 设置读取扇区数量
mov al, 0x01
out 0x1f2, al
; 0xe0000002 => LBA = 0x0000002
mov al, 0x02
out 0x1f3, al ;0x1f3 = 0x02
mov al, 0x00
out 0x1f4, al ;0x1f4 = 0x00
out 0x1f5, al ;0x1f5 = 0x00
mov al, 0xe0
out 0x1f6, al ;0x1f6 = 0xe0 ; 硬盘号 = 0xe = 1111 = 1 , 111 = (主盘,LBA模式)
;发送 0x20 命令 ;要求硬盘执行读取
mov al, 0x20
out 0x1f7, al
;等待数据到达 ;循环等待直到 al = 000100
waits:
in al, 0x1f7
and al, 0x88 ; al | 0x88 ;过滤其他状态仅留下 0000 1000
cmp al, 0x08 ; 比较 0000 1000 与 0000 1000 来决定是否完成状态
jnz waits
;读取数据
mov bx, buffer ;设置buffer ;存储读取到的数据
mov cx, 256 ;循环次数 ;每次读取 16bit ;读取256 * 16 bit
readw:
in ax, 0x1f0
mov [bx], ax
add bx, 2
loop readw
;定义 buffer 256 byte 字节
buffer db 0
times 255 db 0