x01.os.1: BIOS 中断

这只是一点准备工作。为了显示字符串,需要调用中断:int  0x10 (AH=0x13)。具体参数设置,参考我的归纳整理如下:

INT 10 (AH = 0)

-----------------
功能:设置显示方式
调用参数:
    AL = 00:40 * 25 黑白方式
         01:40 * 25 彩色方式
         02:80 * 25 黑白方式
         03:80 * 25 彩色方式
         04:320 * 200 彩色图形方式
         05:320 * 200 黑白图形方式
         06:640 * 200 黑白图形方式
         07:80 * 25 单色文本方式
         08:160 * 200 16色图形(PCjr)
         09:320 * 200 16色图形(PCjr)
         0A:640 * 200 16色图形(PCjr)
         0B:保留(EGA)
         0C:保留(EGA)
         0D:320 * 200 彩色图形(EGA)
         0E:640 * 200 彩色图形(EGA)
         0F:640 * 350 黑白图形(EGA)
         10:640 * 350 彩色图形(EGA)
         11:640 * 480 单色图形(EGA)
         12:640 * 480 16色图形(EGA)
         13:320 * 200 256色图形(EGA)
         40:80 * 30 彩色图形(CGE400)
         41:80 * 50 彩色图形(CGE400)
         42:640 * 400 彩色图形(CGE400)  
         
INT 10 (AH = 1)
---------------
功能:置光标类型
调用参数:
    CH(0-3) = 光标起始行
    CL(0-3) = 光标结束行
    
INT 10 (AH = 2)
----------------
功能:置光标位置
调用参数:
    BH = 页号
    DH,DL = 行,列
    
INT 10 (AH = 3)
----------------
功能:读光标位置
调用参数:
    BH = 页号
返回参数:
    CH = 光标起始行
    DH,DL = 行,列
    
INT 10 (AH = 4)
----------------
功能:读光笔位置
返回参数:
    AH = 0:光笔未触发
         1:光笔触发
    CH = 像素行
    BX = 像素列
    DH = 字符行
    DL = 字符列
    
INT 10 (AH = 5)
----------------
功能:置显示页
调用参数:
    AL = 页号
    
INT 10 (AH = 6)
----------------
功能:屏幕初始化或上卷
调用参数:
    AL = 上卷行数
         0:整个窗口空白
    BH = 卷入行属性
    CH = 左上角行号
    CL = 左上角列号
    DH = 右下角行号
    DL = 右下角列号
    
INT 10 (AH = 7)
---------------
功能:屏幕初始化或下卷
调用参数:
    AL = 下卷行数
         0:整个窗口空白
    BH = 卷入行属性
    CH = 左上角行号
    CL = 左上角列号
    DH = 右下角行号
    DL = 右下角列号
    
INT 10 (AH = 8)
----------------
功能:读光标位置的字符和属性
调用参数:
    BH = 显示页
返回参数:
    AH = 属性
    AL = 字符
    
INT 10 (AH = 9)
----------------
功能:在光标位置显示字符及其属性
调用参数:
    BH = 显示页
    AL = 字符
    BL = 属性
    CX = 字符重复次数
    
INT 10 (AH = A)
----------------
功能:在光标位置显示字符
调用参数:
    BH = 显示页
    AL = 字符
    CX = 字符重复次数
    
INT 10 (AH = B)
----------------
功能:置彩色调板(320 * 320 图形)
调用参数:
    BH = 彩色调板 ID
    BL = 和 ID 配套使用的颜色
    
INT 10 (AH = C)
----------------
功能:写像素
调用参数:
    DX = 行(0--199)
    CX = 列(0--639)
    AL = 像素值
    
INT 10 (AH = D)
----------------
功能:读像素
调用参数:
    DX = 行(0--199)
    CX = 列(0--639)
返回参数:
    AL = 像素值
    
INT 10 (AH = E)
----------------
功能:显示字符(光标前移)
调用参数:
    AL = 字符
    BL = 前景色
    
INT 10 (AH = F)
----------------
功能:取当前显示方式
返回参数:
    AH = 字符列数
    AL = 显示方式
    
INT 10 (AH = 13)
-----------------
功能:显示字符串(适用AT)
调用参数:                       ;返回参数
    ES:BP = 串地址
    CX = 串长度
    DH,DL = 起始行,列
    BH = 页号
    AL = 0,BL = 属性
    串:char,char,...           ;光标返回起始位置
    AL = 1,BL = 属性           ;光标跟随移动
    串:char,char,...
    AL = 2                     ; 光标返回起始位置
    串:char,char,...
    AL = 3                      ; 光标跟随移动
    串:char,char,...
    
INT 11 
------
功能:设备校验
返回参数:
    AX = 返回值
    bit0 = 1:配有磁盘
    bit1 = 1:80287 协处理器
    bit4,5 = 10:40 * 25 BW(彩色板)
             01:80 * 25 BW(彩色板)
             11:80 * 25 BW(黑白板)
    bit6,7 = 软盘驱动器
    bit9,10,11 = RS-232 板号
    bit12 = 游戏适配器
    bit14,15 = 打印机号
    
INT 12
-------
功能:测定存储器容量
返回参数:
    AX = 字节数(KB)
    
INT 13 (AH = 0)
----------------
功能:软盘系统复位

INT 13 (AH = 1)
----------------
功能:读软盘状态
返回参数:
    AL = 状态字节
    
INT 13 (AH = 2)
----------------
功能:读磁盘
调用参数:
    AL = 扇区数
    CH,CL = 磁道号,扇区号
    DH,DL = 磁头号,驱动器号
    ES:BX = 数据缓冲区地址
返回参数:
    成功:AH = 0,AL = 读取的扇区数
    失败:AH = 出错代码
    
INT 13 (AH = 3)
----------------
功能:写磁盘
调用参数:
    AL = 扇区数
    CH,CL = 磁道号,扇区号
    DH,DL = 磁头号,驱动器号
    ES:BX = 数据缓冲取地址
返回参数:
    成功:AH = 0, AL = 写入的扇区数
    失败:AH = 出错代码
    
INT 13 (AH = 4)
----------------
功能:检验磁盘扇区
调用参数:
    AL = 扇区数
    CH,CL = 磁道号,扇区号
    DH,DL = 磁头号,驱动器号
返回参数:
    成功:AH = 0,AL = 检验的扇区数
    失败:AH = 出错代码
    
INT 13 (AH = 5)
----------------
功能:格式化盘磁道
调用参数:
    ES:BX = 磁道地址
返回参数:
    成功:AH = 0
    失败:AH = 出错代码
    
INT 14 (AH = 0)
----------------
功能:初始化串行通讯口
调用参数:
    AL = 初始化参数
    DX = 通讯口号(0,1)
返回参数:
    AH = 通讯口状态
    AL = 调制解调器状态
    
INT 14 (AH = 1)
----------------
功能:向串行通讯口写字符
调用参数:
    AL = 字符
    DX = 通讯口号(0,1)
返回参数:
    写成功:AH(7) = 0
    写失败:AH(7) = 1
    AH(0-6) = 通讯口状态
    
INT 14 (AH = 2)
----------------
功能:从串行通讯口读字符
调用参数:
    DX = 通讯口号(0,1)
返回参数:
    读成功:AH(7) = 0, AL = 字符
    读失败:AH(7) = 1
    AH(0-6) = 通讯口状态
    
INT 14 (AH = 3)
----------------
功能:取通讯口状态
调用参数:
    DX = 通讯口号(0,1)
返回参数:
    AH = 通讯口状态
    AL = 调制解调器状态
    
INT 15 (AH = 0)
----------------
功能:启动盒式磁带马达

INT 15 (AH = 1)
----------------
功能:停止盒式磁带马达

INT 15 (AH = 2)
----------------
功能:磁带分块读
调用参数:
    ES:BX = 数据传输区地址
    CX = 字节数
返回参数:
    AH = 状态字节
         00:读成功
         01:冗余检验错
         02:无数据传输
         04:无引导
         08:非法命令
         
INT 15 (AH = 3)
----------------
功能:磁带分块写
调用参数:
    DS:BX = 数据传输区地址
    CX = 字节数
返回参数:
    同上
    
INT 16 (AH = 0)
----------------
功能:从键盘读字符
返回参数:
    AL = 字符码
    AH = 扫描码
    
INT 16 (AH = 1)
----------------
功能:读键盘缓冲区字符
返回参数:
    ZF = 0: AL = 字符码,AH = 扫描码
    ZF = 1: 缓冲区空
    
INT 16 (AH = 2)
----------------
功能:取键盘状态字节
返回参数:
    AL = 键盘状态字节
    
INT 17 (AH = 0)
----------------
功能:打印字符,回送状态字节
调用参数:
    AL = 字符
    DX = 打印机号
返回参数:
    AH = 打印机状态字节
    
INT 17 (AH = 1)
----------------
功能:初始化打印机,回送状态字节
调用参数:
    DX = 打印机号
返回参数:
    AH = 打印机状态字节
    
INT 17 (AH = 2)
----------------
功能:取状态字节
调用参数:
    DX = 打印机号
返回参数:
    AH = 打印机状态字节
    
INT 1A (AH = 0)
----------------
功能:读时钟
返回参数:
    CH:CL = 时:分
    DH:DL = 秒:1/100秒
    
INT 1A (AH = 1)
----------------
功能:置时钟
调用参数:
    CH:CL = 时:分
    DH:DL = 秒:1/100秒
    
INT 1A (AH = 2)
----------------
功能:读实时钟(适用AT)
返回参数:
    CH:CL = 时:分(BCD)
    DH:DL = 秒:1/100秒(BCD)
    
INT 1A (AH = 6)
----------------
功能:置报警时间(适用AT)
调用参数:
    CH:CL = 时:分(BCD)
    DH:DL = 秒:1/100秒(BCD)
    
INT 1A (AH = 7)
----------------
功能:清除报警(适用AT)

x01.os.1: BIOS 中断

时间: 08-17

x01.os.1: BIOS 中断的相关文章

x01.os.8: 加载内核

在 x01.os.7 中,借助 freedos,学习了保护模式.但操作系统必须完成引导:boot, 加载内核:loader,kernel,进而管理process,memory,file等. 引导比较简单,开机启动时,CPU 采取硬的方式,直接把 BIOS 载入内存某处运行.这就是电脑启动时按 DEL 键可以看到的画面.此时,无硬盘可以,无内存则不可以.BIOS 是一个只读芯片,但我认为它仍有可写的部分,否则,启动盘设置的保存,就说不通.BIOS 退出时,它会检测启动盘 0 扇区的最后两个字节,是

x01.os.9: 进程切换

进入内核后,当然不能无所事事.先创建三个进程,分别打印 A,B,C.虽然只是简单的打印,但却是一切扩展的基础,不可等闲视之. 进程切换,涉及一系列的寄存器需要保护,于是,就有了 ProcessStack 结构,代码如下: typedef struct { u32 gs; u32 fs; u32 es; u32 ds; u32 edi; u32 esi; u32 ebp; u32 KernelEsp; u32 ebx; u32 edx; u32 ecx; u32 eax; u32 RetAddr;

x01.os.14: 时间都去哪儿了

时间都去哪儿了 老帕的“花儿为什么这样红”,三分钟引起六次欢呼,却败给了张碧晨.试想一下,如果是人气更高的陈冰,即使唱得和张碧晨一模一样,可能仍然不敌老帕,为什么张碧晨就能取胜呢?有这么个笑话:一人弹琴无人听,但一老妇人听得却潸然泪下.原来她的亡夫是弹棉花的!这虽是个笑话,却一语道破玄机.歌声动人,除了唱功,还有感情因素在里面.假如老帕的”花儿为什么这样红“是 1 分, 那么,张碧晨的父女情为 1 分, ”时间都去哪儿了“为 1 分.2 : 1, 张碧晨胜出也就理所当然了. shell 的实现

x01.os.18: MBR

硬盘不同于软盘,它是要分区的.这时,mbr(master boot record)便不可少了.安装 os 硬盘的第一扇区,开始有一小段不多于 446 字节的程序,然后是分区表 512-446-2 字节,然后是引导标志 0xAA55 两字节.这一小段程序,便是 mbr 的主体.mbr 首先将其自身复制到 0x0600 处,代码如下: ; 0x7C00 => 0x0600 mov si, sp push si mov di, 0x0600 mov cx, 0x200 cld rep movsw 这是

使用BIOS中断显示字符串笔记(int 10h 13号中断)

BIOS的10H中断的13号中断用于显示字符串,参数为: 1.AH=13H 2.AL=显示方式 如果AL=0,表示目标字符串仅仅包含字符,属性在BL中包含,不移动光标 如果AL=1,表示目标字符串仅仅包含字符,属性在BL中包含,移动光标 如果AL=2,表示目标字符串包含字符和属性,不移动光标 如果AL=3,表示目标字符串包含字符和属性,移动光标 总之,可以归纳为: |BIT7|BIT6|BIT5|BIT4|BIT3|BIT2|BIT1|BIT0| AL BIT0为0表示不移动光标,为1表示移动光

x01.os.19: linux 0.0

linux 0.0 是一个丢失的版本,但赵炯老师又在 linux 0.11 的基础上,使它起死回生.www.oldlinux.org 有大量资源可供下载,值得一看. 1.要编译运行,首先需安装:sudo apt-get install bin86,取其 as86,ld86 也. 2.makefile 有两点要注意,一是 ld  的入口为 0,二是使用 objcopy 对 head 进行转换拷贝. 3.代码可到我的置顶随笔 x01.lab.download 中下载 x01.los.0.tar.gz

x01.os.6: 8086 指令

M:存储器A:累加器R:寄存器SEGR:段寄存器IMM:立即数X:标志位状态依运算或操作结果而定U:相应标志位未定义-:不影响 数据传送指令 时钟数 访问次数 字节数 对标志位影响 指令意义 MOV M,A 10(14) 1 3 - A-->M MOV A,M 10(14) 1 3 - M-->A MOV R1,R2 2 - 2 - R2-->R1 MOV R,M 8(12)+EA 1 2-4 - M-->RMOV M,R 9(3)+EA 1 2-4 - R-->MMOV R

x01.os.5: DOS 功能调用

DOS 功能调用(INT 21)-------------------------------AH = 0-2E 适用 DOS 1.0 以上版本AH = 2F-57 适用 DOS 2.0 以上版本AH = 58-62 适用 DOS 3.0 以上版本------------------------------- AH = 00功能:程序终止(同 INT 20h)调用参数: CS = 程序段前缀 AH = 01功能:键盘输入并回显返回参数: AL = 输入字符 AH = 02功能:显示输出调用参数:

x01.os.17: 换心术

在 linux 中编译 linux, 于是 linux 便有了再生能力.这不同于自然界的缓慢进化,可用神速来形容.—— 和强大的 windows 相抗衡,便是证明! 我在 ubuntu 中的编译方法如下: 1.在 www.kernel.org 中下载 linux-3.18 内核源代码并解压到 /home/linux,由终端进入该目录,输入命令:make help ,可先看看所提供的操作. 2.输入: sudo make i386-defconfig ,可获取默认配置. 3.输入: sudo ma

x01.os.23: 制作 linux LiveCD

1.首先运行如下命令  sudo apt-get install wget bc build-essential gawk genisoimage 2.下载如下资源,make all 即可 http://pan.baidu.com/s/1nvc09yp 本来有此两条已经足够了,发布时却来了个不足 150 字,内容全部丢失,没办法,只好说点废话. 第一条仍然无话可说. 第二条,相信能帮到你,因为下载时,尤其 syslinux 耗时不少且不成功,非常之不友好.而百度网盘,应该可以提速不少. 主题内容