30天自制操作系统-第02天-汇编语言学习与MakeFile入门
1.程序代码核心部分--生成启动区512字节(全手工输入):
ORG 0x7c00 ;指明程序装载地址
entry:
MOV AX,0 ;AX寄存器置0
MOV SS,AX ;将SS寄存器的值设置为AX寄存器的值
MOV SP,0x7c00
MOV DS,AX
MOV ES,AX
MOV SI,msg
putloop:
MOV AL,[SI] ;将es:si指向的地址单元里的字符装入到AL寄存器
ADD SI,1 ; si 加一,则移向下一个地址单元
CMP AL,0 ; al里的数值(此处为字符值)与0比较,后面msg定义的字符串末尾以0结束
JE fin ;如果相等,则跳转到fin
MOV AH,0x0e ;int 10h,e号功能 ,显示一个字符
MOV BX,15 ;指定字符颜色, 注意此处是15,即BL=0x0f,BH=显示页,BL=颜色,文本模式下无效
INT 0x10
JMP putloop
fin:
HLT ;停机,省电,如果使用jmp $,则CPU死循环,耗电
JMP fin ;无限循环
msg:
DB 0x0a,0x0a ;换行符,换两次行
DB "hello,world"
DB 0 ;0作为字符串结束符
RESB 0x7dfe-$ ; 0x7dfe 硬编码;一个扇区512字节(0x200),末尾两字节已定(0x55,0xaa),因此在扇区里的相对偏移量就是0x1fe.加上0x7c00,就是0x7dfe
DB 0x55, 0xaa ;引导扇区的标志,末尾两字节必须这样
2. 8086(实模式)寄存器:
AX——累加寄存器 CX——计数寄存器
DX——数据寄存器 BX——基址寄存器
SP——栈指针寄存器 BP——基址指针寄存器
SI——源变址寄存器 DI——目的变址寄存器
段寄存器
ES——附加段寄存器 CS——代码段寄存器
SS——栈段寄存器 DS——数据段寄存器
FS——没有名称 GS——没有名称
可以存放地址的寄存器:BX,BP,SI,DI
寄存器AX,CX,DX,BX可以分为高8位和低8位表示,以AX为例,AX的高8位表示为AH,低8位表示为AL。
3.MakeFile:
Makefile文件格式如下:
target:dependency
(tab)command
其中target表示需要生成的目标文件;dependency表示生成目标文件所需要的依赖文件;command表示生成目标文件的编译规则命令行
1)make.bat文件分析,内容只有下面一行:
..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9
解释:返回到上一级z_tools中使用make.exe工具,其中%1 %2 %3 %4 %5 %6 %7 %8 %9表示传入参数的数据,这里传入参数有9个,对应到Makefile文件中就是有9条指令
2)makeFile 文件内容:
# 默认动作
default :
../z_tools/make.exe img
# 镜像文件生成
# 如果要想制作文件ipl.bin ,先检查ipl.nas和 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
# 其他指令
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
4.执行make Run 成功,在Qemu中显示出 "Hello,World"

浙公网安备 33010602011771号