如何在x86汇编中实现屏幕绘制?BIOS中断调用方法咨询
实模式下用BIOS中断0x10实现屏幕绘制
在x86实模式(引导加载器的运行环境)中,屏幕绘制完全依赖BIOS提供的int 0x10视频服务中断,以下是核心用法和代码示例:
1. 先设置显示模式
绘制前需指定文本/图形模式,常用参数:
- 80x25彩色文本模式:
AH=0x00,AL=0x03 - 320x200 256色VGA图形模式:
AH=0x00,AL=0x13
代码示例:
; 切换到80x25彩色文本模式 mov ah, 0x00 mov al, 0x03 int 0x10
2. 文本模式下打印字符
两种常用子功能:
- 滚动打印(类似printf):
AH=0x0E,AL存字符,BH存页码(通常为0),BL存文本颜色(黑底白字为0x07) - 带重复的属性打印:
AH=0x09,AL存字符,CX存重复次数,BL存颜色属性
滚动打印示例:
; 打印白色字符'A' mov ah, 0x0E mov al, 'A' mov bh, 0x00 mov bl, 0x07 int 0x10
3. 图形模式下绘制像素
游戏常用的图形绘制功能:AH=0x0C,AL存像素颜色,CX存X坐标,DX存Y坐标,BH存页码
示例(在(100,50)位置画红色像素,0x13模式下红色值为0x04):
mov ah, 0x0C mov al, 0x04 ; 红色 mov cx, 100 ; X坐标 mov dx, 50 ; Y坐标 mov bh, 0x00 int 0x10
4. 引导加载器基础框架
引导扇区需符合MBR规范(512字节,最后两字节为0xAA55),完整示例:
org 0x7C00 ; BIOS将引导扇区加载到0x7C00地址 start: ; 切换到320x200 256色图形模式 mov ah, 0x00 mov al, 0x13 int 0x10 ; 绘制一个红色像素 mov ah, 0x0C mov al, 0x04 mov cx, 100 mov dx, 50 int 0x10 ; 无限循环防止程序跑飞 loop: jmp loop times 510-($-$$) db 0 ; 填充剩余字节至510位 dw 0xAA55 ; 引导标志位
注意事项
- 实模式下仅能访问1MB内存,所有寄存器操作均为16位
- 不同显示模式的坐标范围和颜色值不同,比如0x13模式X最大319、Y最大199
- 打印字符串可通过循环调用
0x0E子功能逐个输出字符
内容的提问来源于stack exchange,提问作者Nabir14
相关产品推荐
相关产品推荐

