[30天自制操作系统] 02 汇编语言学习与Markfile入门
00. 寄存器
16位寄存器
1 | AX —— accumulator,累加寄存器 |
8位寄存器
1 | AL —— 累加寄存器低位(accumulator low) |
32 位寄存器
EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI
段寄存器
1 | ES——附加段寄存器(extra segment) |
01. 再修改的代码
简而言之,该代码将寄存器初始化后,SI指向消息区域,通过循环不断移动指针,读取其内容,对AX寄存器操作以显示字符。
1 | ; hello-os |
- ORG指令: 告诉nask,在开始执行时把这些机 器语言指令装载到内存中的哪个地址。如果没有它,有几个指令就不能 被正确地翻译和执行。另外,有了这条指令的话,美元符(**$**)的含义也随之变化,它不再是指输出文件的第几个字节,而是代表将要读入的内存地址。
- JMP指令:相当于 goto
- entry: 指令:标签声明
- MOV指令:赋值,MOV AX,0 相当于 AX=0
- JE指令:相等就跳转
- INT指令:中断
- HLT指令:让CPU停止动作的指令,让CPU进入待机状态。
问题:
为什么是 ORG 0x7c00?
内存某些地方存放着 BIOS 程序,要避免从图,产生错误,这些地方不能用,有下面空间使用:
0x00007c00-0x00007dff :启动区内容的装载地址
所以从 0x7c00 开始
为什么 [SI] 要加方括号?
取地址为 SI 的内存值
02. 制作启动区(保留前部)
解耦合,只保留hellos.nas前半部分,用来制作512字节的启动区
1 | ; hello-os |
asm.bat
1 | ..\z_tools\nask.exe ipl.nas ipl.bin ipl.lst |
- 编译输出列表文件ipl.lst。它是一个文本文件,可以用来简单地确认每个指令是怎样翻译成机器语言的。
makeimg.bat
1 | ..\z_tools\edimg.exe imgin:../z_tools/fdimg0at.tek wbinimg src:ipl.bin len:512 from:0 to:0 imgout:helloos.img |
- edimg.exe:作者自制的二磁盘映像管理工具
- 该脚本作用:先读入一个空白的磁盘映像文件,然后在开头写入 ipl.bin的内容,最后将结果输出为名为helloos.img的磁盘映像文件。
run.bat
1 | copy helloos.img ..\z_tools\qemu\fdimage0.bin |
执行顺序asm→makeimg→run
ipl.lst
1 | 1 00000000 ; hello-os |
03. Makefile
没有找到文件,它会自动查找命令创建,故只要输入“make run”,它会首先执行“make img”,然后再启动模拟器。
Makefile
1 |
|
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 个人学习记录!