30天自制操作系统-第3天
2016-11-09 17:41
375 查看
第3天 进入32位模式并导入C语言
相比前两天的学习内容,第3天要学的内容容量大幅度增加,难度也显著提高,使我们朝着开发一个完整的操作系统迈向了一大步。1. 新学到的几条汇编指令
在介绍汇编指令之前,我们先来了解一下一个特殊的寄存器——标志寄存器,这种寄存器具有三种作用:1) 用来存储相关指令的某些执行结果; 2) 用来为CPU执行相关指令提供行为依据; 3) 用来控制CPU的相关工作方式。
8086CPU的标志寄存器有16位,其中存储的信息通常被称为程序状态字(PSW),简称flag。flag和其他寄存器不一样,其他寄存器是用来存放数据的,都是整个寄存器具有一个含义,而flag寄存器是按位起作用的,也就是说,它的每一位都有专门的含义,记录特定的信息。具体如下:
位数 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
含义 | OF | DF | IF | TF | SF | ZF | AF | PF | CF |
flag的1、3、5、12、13、14、15位在8086CPU中没有使用,不具有任何含义,而其余位都具有特殊的含义。下面我们详细介绍本篇中用到的CF标志位。
CF标志 [C,Carry进位、F,Flag标志]
flag的第0位是CF,进位标志位。一般情况下,在进行了无符号运算的时候,它记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。举例,下面是从ipl.nas中截取的代码片段,实现读入磁盘的功能,软件中断int 0x13, 当AH=0X02时,调用读盘的bios函数,读盘成功设置CF=0,失败设置CF=1(对应于标志寄存器的作用1)。后面紧跟着是JC指令。JC,是”jump if carry”的缩写,意思是如果进位标志是1的话,就跳转(对应于标志寄存器的作用2)。至此,就实现了读入磁盘的完整功能。
; 读盘 MOV AX,0x0820 MOV ES,AX MOV CH,0 ; 柱面0 MOV DH,0 ; 磁头0 MOV CL,2 ; 扇区2 MOV AH,0x02 ; AH=0x02 : 读入磁盘 MOV AL,1 ; 一个扇区 MOV BX,0 MOV DL,0x00 ; A驱动器 INT 0x13 ; 调用磁盘bios JC error
JC指令
JC,是”jump if carry”的缩写,意思是如果进位标志是1的话,就跳转。JNC指令
JNC,是”jump if not carry”的缩写,意思是如果进位标志是0的话,就跳转。JAE指令
JAE,是”jump if above or equal”的缩写,意思是大于或者等于时,跳转。JBE指令
JAE,是”jump if below or equal”的缩写,意思是小于或者等于时,跳转。JB指令
JAE,是”jump if below”的缩写,意思是大于或者等于时,跳转。2. 新学到的4个软中断
(1)INT 13h AH=02h: 读盘,即从磁盘中读取扇区
参数:AH: 02h
AL: 读入的扇区数
CH: 柱面号
CL: 扇区号
DH: 磁头号
DL: 磁盘号
ES:BX, 缓冲区地址
返回值:
CF: 错误置1,正确置0
AH: 返回值代码
AL: 实际读取的扇区数
(2)INT 13h AH=00h: 复位磁盘驱动
参数:AH: 00h
DL: 磁盘号
返回值:
CF: 错误置为1
(3)INT 10h AH=00h: 设置显示模式
参数:AH: 00h
AL: 显示模式
返回值:
AL = video mode flag / CRT controller mode byte
(4)INT 16H AH=02h: 获取键盘的状态信息
3. 确定程序文件被加载的地址
作者通过一个小例子,让我们明白以下结论:当我们向一张空软盘保存文件时,
1)文件名会写在0x002600以后的地方; 2)文件的内容会写在0x004200以后的地方;
由于目前的启动区程序是从启动区后面开始(不包括启动区)加载到内存地址0x8200处的,所以磁盘0x4200的内容就会被加载到内存地址0xc200处,其中0xc200 = 0x8200 + 0x4200 - 512(启动区大小),现在我们就可从0xc200处加载我们自己写的程序用于执行了。
4. 导入C语言
老是写汇编程序,效率那么低,也不是办法,是时候引入c语言了,下面放张图来说明怎么将汇编语言的源文件和C语言的源文件链接最终编译成目标文件。这篇的总结到此结束,下篇再见。
相关文章推荐
- 《30天自制操作系统》之——第3天
- 《30天自制操作系统》学习笔记--第3天
- 30天自制操作系统-第3天-harib00b-注释
- C语言实现队循FIFO缓冲区-《30天自制操作系统》
- 《30天自制操作系统》读书笔记Day19
- 《30天自制操作系统》学习笔记--第1天
- 30天自制操作系统笔记(九十)——源码
- 30天自制操作系统笔记(十三十四)——源码
- CPU存储电路之寄存器——《30天自制操作系统》笔记
- 《30天自制操作系统》第1天
- 30天自制操作系统day7
- 30天自制操作系统day9
- <30天自制操作系统>第三天
- <30天自制操作系统>第五天
- 为什么《30天自制操作系统》封面中的猫是两只尾巴
- 30天自制操作系统第二天笔记 Makefile文件
- 《30天自制操作系统》02_day_学习笔记
- 《30天自制操作系统》11_day_学习笔记
- 30天自制操作系统day20
- 《30天自制操作系统》笔记五六