第二天主要学习汇编语言与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天的开发就这么多啦。