30天自制操作系统学习-第2天

第二天主要学习汇编语言与Makefile入门

1:继续开发

在这里先给出作者在第二天使用nask编写代码中涉及到的寄存器概念:

 AX--accumulator,累加寄存器

 CX--counter,计数寄存器

 DX--data,数据寄存器

 BX--base,基址寄存器

 这四个为通用寄存器,其中AX16位寄存器可以拆分为AH8位寄存器和AL8位寄存器使用,CX,DX,BX同理

 SP--stack pointer,栈指针寄存器

 BP--base pointer,基址指针寄存器

 IP--instructions pointer,指令指针

 SI--source index,源变址寄存器

 DI--destination index,目的变址寄存器

 SS-stack segment,堆栈段

 DS--data segment,数据段

 ES--extra segment,附加段

 CS--code segment,代码段

这里给出helloos3.nas汇编指令:

; hello-os
; TAB=4

		ORG		0x7c00			 ; 指明程序的装载地址

; 以下的记述用于标准FAT12格式的软盘
		JMP		entry
		DB		0x90
		DB		"HELLOIPL"		 ; 可以自由写扇区的名字(8字节)
		DW		512				 ; 1扇区的大小(必需要512)
		DB		1				 ; 集群的大小(必需要做一个扇区)
		DW		1			  	 ; FATA从这里开始(一般是从第一扇区开始)
		DB		2				 ; FATA的个数(必须是2)
		DW		224				 ; 根目录区域的大小(通常为224项)
		DW		2880			 ; 该驱动器的大小(必须要为2880扇区)
		DB		0xf0			 ; 媒体类型(必须要做0 xf0)
		DW		9				 ; FATO区域的长度(必须要做9扇区)
		DW		18				 ; 1卡车上有几个扇区
		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		 ; 换行两次
		DB		"hello, world"
		DB		0x0a			 ; 换行
		DB		0

		RESB	0x7dfe-$		 ; 到0x7dfe在0x00中填入的命令

		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指令指明了程序的装填地址,即在内存中所在的地址,其中地址0X7c00为当时IBM和英特尔设计人员规定的。

HLT指令让CPU停止,等待指令,剩下的汇编指令大致上和nasm相同。

其中day2/helllos3文件夹下的批处理文件!cons_nt.bat和run.bat,asm.bat和第一天的相同,我们双击运行!cons_nt.bat,输入asm:

成功生成了helloos.img镜像文件,接下来再输入run命令启动qemu虚拟机:

2:制作真正的IPL

考虑到以后的开发,我们只需要利用nask制作一个512字节的启动区即可,剩下的部分我们用磁盘映像管理用具来做,这样开发就方便了

day2/helloos4/ipl.nas修改了msg标号的指向的汇编指令,修改后如下:

msg:
		DB		0x0a, 0x0a		; 换行
		DB		"hello, world"
		DB		0x0a			; 换行
		DB		0

		RESB	0x7dfe-$		; 到0x7dfe在0x00中填补的命令

		DB		0x55, 0xaa

我们进一步改造asm.bat,输入..\z_tools\nask.exe ipl.nas ipl.bin ipl.lst:

双击!cons_nt.bat文件输入asm我们发现并没有直接helloos.img镜像文件,而是生成一个ipl.bin和ipl.lst文件,我们查看其中的ipl.lst:

在helloos4中我们新建一个makeimg.bat批处理我们,它的作用是将生成的ipl.bin文件编译生成我们需要的helloos.img镜像文件,

makefile.bat内容:..\z_tools\edimg.exe   imgin:../z_tools/fdimg0at.tek   wbinimg src:ipl.bin len:512 from:0 to:0   imgout:helloos.img

我们双击运行!cons_nt.bat输入makeimg,生成helloos.img镜像文件:

然后我们再重新运行!cons_nt.bat输入makeimg生成helloos.img。

再输入run命令使用qemu虚拟机运行我们生成的helloos.img镜像文件:

3:Makefile的入门

我们在helloos4中生成helloos.img镜像文件,并且使用qemu虚拟机运行这个文件,其中涉及到的批处理文件甚至比我们实际需要的文件还多,我们可以将这些单步的命令写到一个文件中去执行。

新建一个文件,文件名为Makefile,不使用后缀,在记事本中打开这个文件,输入如下语句:


#默认

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 :
    -del ipl.bin
    -del ipl.lst

src_only :
    ../z_tools/make.exe clean
    -del helloos.img

再新建一个make.bat,内容输入:..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9  ,然后保存。

其中这个make.exe会根据你输入的命令,如 asm,run,img等命令,执行对于的批处理语句。在直接输入make run的情况下,

make.exe会检查是否有helloos.img,如果没有的话会执行img标号对于的批处理命令,其他情况以此类推,在你修改了其中的某些文件时。这样我们只需要双击运行!cons_nt.bat批处理文件,输入 make run命令会自动的生成ipl.bin,ipl.lst后,根据生成的ipl.bin文件生成helloos.img,然后假装qemu虚拟机运行这个镜像文件,这样的手段比用一堆批处理文件高明而又简洁多了,我们运行结果如下:

第2天的开发就这么多啦。

猜你喜欢

转载自blog.csdn.net/qq511714326/article/details/82915012