《30天自制操作系统》day2
内容1:改写helloos.nas文件核心程序,使其更加简单易懂;
重点总结:
- 学习汇编程序相关指令,能够理解并运用相关指令进行修改;
- 学习计算机中寄存器的分类,组成和工作原理;
- 学习并理解内存,数据地址,BIOS和装载地址等相关概念;
- 阅读并修改helloos.nas文件,使其可读性进一步增强。
概念阐述:
(1)汇编指令
汇编指令是汇编语言中使用的一些操作符和助记符,还包括一些伪指令(如assume,end)。用于告诉汇编程序如何进行汇编的指令,它既不控制机器的操作也不被汇编成机器代码,只能为汇编程序所识别并指导汇编如何进行。对于IBM PC机它有它的指令系统,其中包括:数据传送指令、串处理指令、算术指令、控制移动指令、逻辑指令、处理机控制指令。在这里我们介绍程序中出现的几种汇编指令
a.ORG
ORG其作用是告诉汇编程序,在开始执行的时候,将某段机器语言装载到内存中的哪个地址。如果没有它,有些指令就不能正确地翻译和执行。由于这条指令不是机器语言中的直接指令,所以又被称之为伪指令。在这里我们设置成为ORG 0x7c00,意思就是从地址0x7c00处开始装载程序。(详见代码,下同)
b.JMP
无条件的转移到指令指定的地址去执行从该地址开始的命令,相当于C语言的goto,
虽然我们编程课的老师告诉我们C语言中尽量不要用Goto,但是JMP指令在汇编程序中却有着相当重要的地位,例如在程序中的“jmp entry”就是跳转到入口地址的意思。
c.MOV
把一个字节、字或双字的操作数从源位置传送到目的位置,源操作数的内容不变。可以实现立即数到通用寄存器或主存的传送,通用寄存器与通用寄存器、主存或段寄存器之间的传送,主存与段寄存器之间的传送。该操作属于复制性质,不属于搬家性质。格式:MOV DST,SRC
d.ADD
ADD表示相加的指令,格式为ADD XF 20H,F;表示将X和20H里面的值相加,然后放到工作寄存器或者文件寄存器,其中F可以为1和0,为1时表示把相加的结果存入(F)文件寄存器,为0时表示把相加的结果存入(W)工作寄存器中。在目前所接触的汇编语言中,大多写为“ADD SI,1”可以理解为C语言中的SI=SI+1。
e.CMP
CMP指令是比较指令,相当于C语言中的if条件,例如“CMP a,3”含义为a和3进行比较,一般与跳转语句一起使用。
f.JE
JE是条件跳转指令之一,所谓条件跳转指令,就是根据比较的结果决定跳转或者不跳转。就JE而言,如果比较结果相等,就跳转到指定地址,如果比较结果不相等,就不跳转,继续执行下一条指令。英文含义为“jump if equal”
g.INT
INT是软件中断指令,INT在这里是用来调用BIOS(详细阐述见4)中的函数的指令,在调用时需要查看BIOS中相关函数执行号,才能进行准确调用。
h.HLT
HLT是让CPU停止动作的指令, 主要就是为了进入待机状态,节能环保,人人有责
(2)寄存器
寄存器,是集成电路中非常重要的一种存储单元,通常由触发器组成。在集成电路设计中,寄存器可分为电路内部使用的寄存器和充当内外部接口的寄存器这两类。内部寄存器不能被外部电路或软件访问,只是为内部电路的实现存储功能或满足电路的时序要求。寄存器包括通用寄存器、专用寄存器和控制寄存器。
介绍:
AH&AL=AX(accumulator):累加寄存器,常用于运算;在乘除等指令中指定用来存放操作数,另外,所有的I/O指令都使用这一寄存器与外界设备传送数据。
CH&CL=CX(count):计数寄存器,常用于计数;常用于保存计算值,如在移位指令,循环(loop)和串处理指令中用作隐含的计数器.
DH&DL=DX(data):数据寄存器,常用于数据传递。
SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置
BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置
SI(Source Index):源变址寄存器,可用来存放相对于DS段之源变址指针
DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。
CS(Code Segment):代码段寄存器
DS(Data Segment):数据段寄存器
ES(Extra Segment):附加段寄存器。
此外还有很多种寄存器,例如各种标志寄存器。为了满足计算机发展需要地址为扩展为32,出现了EAX等寄存器,E就是Extend的意思。其扩展具有兼容性,因而可以满足计算机发展需求,因为在数电和计组两门课程中详细学过寄存器相关知识,因而在此不再进行深入探究学习。
(3)内存
内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大。内存(Memory)也被称为内存储器,其作用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。只要计算机在运行中,CPU就会把需要运算的数据调到内存中进行运算,当运算完成后CPU再将结果传送出来,内存的运行也决定了计算机的稳定运行。 内存是由内存芯片、电路板、金手指等部分组成的。
(4)BIOS
BIOS是英文"Basic Input Output System"的缩略词,直译过来后中文名称就是"基本输入输出系统"。在IBM PC兼容系统上,是一种业界标准的固件接口。
其实,它是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序,它可从CMOS中读写系统设置的具体信息。 其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。
此外,BIOS还向作业系统提供一些系统参数。系统硬件的变化是由BIOS隐藏,程序使用BIOS功能而不是直接控制硬件。现代作业系统会忽略BIOS提供的抽象层并直接控制硬件组件。
这个BIOS启动显示出的用户界面就是看到旧版Windows的大窗户启动,这个时候按F2(或者其他,不同电脑方式不同)进入BIOS界面,后来Windows为了加快开机速度就取消了,需要在开机之后设置中进入高级从而进入BIOS模式。
关键代码:
; 程序核心
entry:
MOV AX,0 ; 初始化寄存器
MOV SS,AX
MOV SP,0x7c00 ; 将0x7c00地址装入SP栈指针寄存器之中
MOV DS,AX
MOV ES,AX
MOV SI,msg ; 这一步实现了”hello world”一个个字符的输出
putloop:
MOV AL,[SI]
ADD SI,1 ; 给SI加1
CMP AL,0 ; 将AL与0比较
JE fin ; 如果相等,就跳转到fin,否则继续执行。AL中装载[SI]前8个字节
MOV AH,0x0e ; 显示一个文字
MOV BX,15 ; 指定字符颜色
INT 0x10 ; 调用显卡BIOS模式
JMP putloop
fin:
HLT ; 让CPU停止,等待指令(省电)
JMP fin ; 无限循环
msg:
DB 0x0a, 0x0a ; 换行2次
DB "hello, world"
DB 0x0a ; 换行
DB 0
结果显示:
内容2:初步制作启动区
重点总结:
- 改造asm.bat文件;
- 增加makeimg.bat文件
关键代码:
(1)asm.bat
..\z_tools\nask.exe ipl.nas ipl.bin ipl.lst
在这里我们返回到z_tools文件夹,调用其中的nask.exe,生成ipl.bin和ipl.lst文件。(此处ipl为启动区缩写,在这里基本告别了helloos时代)
(2)makeimg.bat
..\z_tools\edimg.exe imgin:../z_tools/fdimg0at.tek wbinimg src:ipl.bin len:512 from:0 to:0 imgout:helloos.img
在这里用到了edimg程序,是作者开发的磁盘映像管理工具。
启动区的大小是512个字节, 最终生成文件helloos.img
结果显示:
内容3:Makefile入门
重点总结:
- 理解Makefile含义;
- 掌握Makefile写法;
- 完成Makefile;
- 理解新指令clean与src_only。
关键代码:
default :
../z_tools/make.exe img
# 文件生成规则
ipl.bin : ipl.nas Makefile
../z_tools/nask.exe ipl.nas ipl.bin ipl.lst
helloos.img : ipl.bin Makefile
../z_tools/edimg.exe imgin:../z_tools/fdimg0at.tek \
wbinimg src:ipl.bin len:512 from:0 to:0 imgout:helloos.img
# 命令
asm :
../z_tools/make.exe -r ipl.bin
img :
../z_tools/make.exe -r helloos.img
run :
../z_tools/make.exe img
copy helloos.img ..\z_tools\qemu\fdimage0.bin
../z_tools/make.exe -C ../z_tools/qemu
install :
../z_tools/make.exe img
../z_tools/imgtol.com w a: helloos.img
clean : #clean指令含义是删除ipl.bin和ipl.lst文件
-del ipl.bin
-del ipl.lst
src_only : #src_only指令含义是删除ipl.bin ipl.lst和helloos.img文件
../z_tools/make.exe clean
-del helloos.img
结果显示:
make run:
make clean:
make src_only:
第二天内容还是比较容易上手操作,但是第三天以后的内容就开始多了起来,加油吧!