30天自制操作系统-第3天

第3天 进入32位模式并导入C语言

相比前两天的学习内容,第3天要学的内容容量大幅度增加,难度也显著提高,使我们朝着开发一个完整的操作系统迈向了一大步。

1. 新学到的几条汇编指令

  在介绍汇编指令之前,我们先来了解一下一个特殊的寄存器——标志寄存器,这种寄存器具有三种作用:

1) 用来存储相关指令的某些执行结果;

2) 用来为CPU执行相关指令提供行为依据;

3) 用来控制CPU的相关工作方式。

  8086CPU的标志寄存器有16位,其中存储的信息通常被称为程序状态字(PSW),简称flag。flag和其他寄存器不一样,其他寄存器是用来存放数据的,都是整个寄存器具有一个含义,而flag寄存器是按位起作用的,也就是说,它的每一位都有专门的含义,记录特定的信息。具体如下:

位数1514131211109876543210
含义OFDFIFTFSFZFAFPFCF


  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语言的源文件链接最终编译成目标文件。
这里写图片描述

这篇的总结到此结束,下篇再见。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值