文章目录[隐藏]
文本编辑器的选择
选择使用Notepad++
下载地址: Notepad++
(之后了解了一下背景,这个软件作者是个台独!!!所以我们应该抵制这样的软件)
(在这里我给大家推荐VSCode或者轻量级的VIM)
继续开发
;helloos3
; hello-os
; TAB=4
ORG 0x7c00 ; 指明程序的装在地址
; 以下的记述用于标记FAT12格式的软盘
JMP entry
DB 0x90
DB "HELLOIPL" ; 启动区的名称可以是任意是字符串(8字节)
DW 512 ; 每个扇区(sector)的大小(必须为512字节)
DB 1 ; 簇(cluster)的大小(必须为1个扇区)
DW 1 ; FAT的起试位置(一般从第一个扇区开始)
DB 2 ; FAT的个数(必须为2)
DW 224 ; 根目录的大小(一般设置成224项)
DW 2880 ; 该磁盘的大小(必须是2880扇区)
DB 0xf0 ; 磁盘的种类(必须是0xf0)
DW 9 ; FAT的长度(必须是9扇区)
DW 18 ; 1个磁道(track)有几个扇区(必须是18)
DW 2 ; 磁头数(必须是2)
DD 0 ; 不使用分区,必须是0
DD 2880 ; 重写一次磁盘的大小
DB 0,0,0x29 ; 固定
DD 0xffffffff ; (可能是)卷标号码
DB "HELLO-OS " ; 磁盘的名称(11字节)
DB "FAT12 " ; 磁盘格式化名称(8字节)
RESB 18 ; 空出18字节
; 程序主体核心
entry:
MOV AX,0 ;初始化寄存器
MOV SS,AX
MOV SP,0x7c00
MOV DS,AX
MOV ES,AX
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
RESB 0x7dfe-$ ; 填写0x00,直到0x001fe
DB 0x55, 0xaa
; 以下是启动区以外部分的输出
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 4600
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 1469432
ORG指令:告诉nask,在开始执行的时候,把这些机器语言指令装载到内存中的哪个地址。($)含义:不再是输出文件的第几个字节,而是代表将要读入的内存地址。
JMP指令,相当于C语言中的goto语句。
‘entry:’这是标签的声明,用于指定JMP指令跳转的目的地等。
AX---累加寄存器
CX---计数寄存器
DX---数据寄存器
BX---基质寄存器
SP---栈指针寄存器
BP---基质指针寄存器
SI---源变址寄存器
DI---目的变址寄存器
在汇编语言中,所有标号都仅仅是单纯的数字。每个标号对应的数字,是由汇编语言编译器根据ORG指令计算出来的。
CPU访问内存的速度比访问寄存器慢很多倍。
MOV BYTE[678],123
这个指令是要用内存678号地址来保存123这个数值。这里的678,不过是一大串(ON)或者(OFF)的电信号。当内存受到这一串信号时,电路中的某8个存储单元就会响应,这8个存储单元会记住代表‘123’的开或关的电信号。
想把DX内存里的内容赋给AL
MOV BX,DX
MOV AL,BYTE[BX]
把SI地址的1个字节的内容读入AL中
ADD是加法指令。ADD SI,1 ;SI=SI+1
CMP是比较指令。它相当于C语言中的if语句,
if(a==3)
{
处理;
}
即对a和3进行比较,CMP a,3告诉CPU比较对象,然后下一步写“如果二者相等,需要做什么”
JE是条件跳转指令之一。‘比较结果相等,则跳转到指定的地址;不等,则不跳转’
CMP AL,0
JE fin
相当于
if(AL == 0)
{
goto fin;
}
INT是软终端指令。BIOS(basic input output system)出厂时装在电脑主板的ROM单元里。
HLT,halt(停止)让CPU停止动作的指令,不是彻底的停止,而是让CPU进入待机状态。如果没有HLT指令,CPU就会不停的空转,负荷100%,费电。
// 用c语言改写后的helloos.nas程序节选
entry:
AX = 0;
SS = AX;
SP = Ox7c00;
DS = AX;
ES = AX;
SI = msg;
putloop:
AL = BYTE[SI];
SI = SI + 1;
if(AL == 0)
{
goto fin;
}
AH = 0x0e;
BX = 15;
INT 0x10;
goto putloop;
fin:
HLT;
goto fin;
就是因为这个程序,我门才能够把msg里写的数据,一个字符一个字符的显示出来,并且数据变成0后,HLT指令就会让程序进入无限循环。'hello world'就是这样显示出来的。
0x00007c00-0x00007dff ;启动区内容的装载地址
制作启动区
不要用nask来做整个磁盘映像,先用它来制作512字节的启动区,剩下的部分用磁盘影响管理工具来做。
Makefile入门
Makefile就像一个非常聪明的批处理文件。
- 先创建一个不带扩展名的文件Makefile,然后用文本编辑器输入以下内容
# 文件生成规则
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
表示注释。ipl.bin : ipl.nas Makefile的意思是,如果想要制作ipl.bin,就先检查ipl.nas 和Makefile两个文件是否都准备好了。如果两个文件都有了,Make工具就会自动执行Makefile的下一行
当编辑ipl.nas中的输出信息,更改输出并保存,再次执行make -r helloos.img发现它重新生成输出文件,也就是,make.exe不仅仅判断输入文件是否存在。还会判断文件的更新日期。并根据这个来决定是否需要重新生成输出文件。
再Makefile里面增加
img :
../z_tools/make.exe -r helloos.img
修改以后我门只需要输入make img就能达到和make -r helloos.img一样的效果。makeing.bat就没用了
加入以下内容:
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
这样'run.bat'等其他都用不到了。输入“make run”它首先会执行make img 然后再启动模拟器。
“make clean”删除最终成果(helloos.img)以外的所有中间生成文件,把硬盘整理干净。
“make scr_only”可以把程序源程序以外的文件全部删除干净。
make命令的默认动作,当执行不带参数的make时,就相当于执行“make img”命令
default :
../z_tools/make.exe img
make.exe是GUN项目组的人开发的。
叨叨几句... NOTHING