一、介绍文本编译器
用Notepad++
二、继续开发
helloos.nas节选
;hello-os
;TAB=4
ORG 0x7c00 ;指明程序的装载地址
;以下的记述用于标准FAT12格式的软盘
JMP entry
DB 0x90
--(中略)--
;程序核心
entry:
MOV AX,0 ;初始化寄存器
MOV SS,AX
MOV SP,0x7c00
MOV DS,AX
MOV ES,AS
MOV SI,msg
putloop:
MOV AL,[SI]
ADD SI,1 ;给SI加1
CMP AL,0
JE fin
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
学习新指令:
1、ORG指令:这个指令会告诉nask,在执行的时候,把这些机器语言指令装载到内存中的哪个地址
而且有了这个指令,美元符$的含义也变化了,代表的是将要读入的内存地址
2、JMP指令:相当于C语言的goto语句,跳转的意思
3、entry:标签的声明,用于指定JMP指令的跳转目的地
4、MOV指令:赋值(类似于copy)
" MOV AX,0 " 相当于 " AX=0 "
"MOV SS,AX " 相当于 "SS=AX;"
5、CPU中有一种名为寄存器的存储电路,具有代表性的有8个
AX——累加寄存器
CX——计数寄存器
DX——数据寄存器
BX——基址寄存器
SP——栈指针寄存器
BP——基址指针寄存器
SI——源变址寄存器
DI——目的变址寄存器
这些寄存器全是16位的,所以可以存储16位的二进制数
这8个寄存器全部合起来只有16个字节。
另一方面,CPU还有8个8位寄存器
AL——累加寄存器低位
CL——计数寄存器低位
DL——数据寄存器低位
BL——基址寄存器低位
AH——累加寄存器高位
CH——计数寄存器高位
DH——数据寄存器高位
BH——基址寄存器高位
6、32位寄存器:就是在16位寄存器的名字前加上一个E就行了
32位寄存器也只能存储32个字节
7、段寄存器:以下都是16位的
ES——附加段寄存器
CS——代码段寄存器
SS——栈段寄存器
DS——数据段寄存器
FS——没有名称
GS——没有名称
8、MOV SI,msg:JMP entry = JMP 0x7c50
因为msg的地址是0x7c74,所以这个指令的意思是:把0x7c74带入到SI寄存器中
9、MOV AL,[SI]:[ ]代表内存
对于CPU来说,内存属于外部存储器
举例:MOV BYTE [678],123:这个指令就是用内存为"678"号地址保存123这个数值
MOV WORD [678] ,123:这种情况下,内存地址中的678号和679号都会做出 反应 ,一共是16位。123会变成一个16位的数值 0000000001111011,下位的01111011保存在678 号,上位的00000000保存在旁边的679号
在汇编语言中指定内存地址时,用下面的方法写:
数据大小 [地址]
如果指定的数据大小为BYTE,那么使用的存储单元就只是地址所指定的字节
如果指定的数据大小为WORD,则相邻的一个字节也会成为这个指令的操作对象
如果指定的数据大小为DWORD,则与WODE相邻的两个字节都会成为操作对象
(相邻:地址增加方向的相邻)
内存地址的指定方法,不仅可以用常数,还可以用寄存器。不过可用的寄存器只有BX、BP、 SI、DI。
MOV有个规则:源数据和目的数据必须位数相同;意思就是能向AL里带入的只有BYTE,所以 就可省略,写成:MOV AL,[SI]
所以这个指令的意思:把SI地址的1个字节的内容读入AL中
10、ADD指令:是加法指令 ADD SI,1 = SI=SI+1
11、CMP指令:比较指令 CMP a,3 意思就是将a和3进行比较,然后下一步写"如果二者相 等,需要做什么"
12、JE:条件跳转指令之一,对于JE而言:如果比较结果相等,就跳转到指定的地址;如果不 等,则不跳转,继续执行下一条指令
13、INT:软件中断指令
14、BIOS:基本输入输出系统
15、HLT指令:让CPU停止动作,意思是让CPU进入待机状态
补充:系统中ORG指令的值:0x00007c00-0x00007dff(启动区内容的装载地址)
三、先制作启动区
文件名:ipl.nas
改造asm.bat,将输出的文件名改为ipl.bin,输出列表文件ipl.lst
增加了makeing.bat,以ipl.bin为基础,制作磁盘映像文件helloos.img.的批处理文件
编译到测试的步骤:双击!cons,然后在命令行窗口按顺序输:asm->makeing->run这三个命令 即可
四、Makefile入门
首先生成一个不带扩展名的文件Makefile,再用文本编辑器写入以下内容:
#文件生成规则
ipl.bin : ipl.nas Makefile
../z_tools/nask.exe ipl.nas ipl.bin ipl.lst
helloos.img : ipl.bin Makefile
../z_tools/eding.exe img:../z_tools/fdimg0at.tek ¥
wbinimg src:ipl.bin len:512 from:0 to:0 imgout:helloos.img
#:表示注释
ipl.nas Makefile:如果想要制作文件ipl.bin,就先检查一下ipl.nas和Makeflie这两个文件是否准备 好 ,如果这两个文件都有了,Make工具就会自动执行Makefile的下一行
helloos.ing也相同
在Makefile中加入以下代码
#命令
img:
../z_tools/make.exe -r helloos.img
asm:
../z_tools/make.exe -r ipl.bin
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
增加这些后,就不需要makeing.ing 、run.bat 、install.bat
以后直接输入make run就能顺利运行了