day1
操作过程
说明:windows10 操作系统下
1,就这一点
把这个文件夹复制出来到当前目录。
进入tolset,添加helloos03
在文件夹中先放!cons_nt.bat,这个bat的作用就是在当前目录下打开cmd。
helloos03.img 是通过nask.exe编译hellloos03.nas得到。
之后再创建run.bat,内容是这个
copy helloos03.img ..\z_tools\qemu\fdimage0.bin
..\z_tools\make.exe -C ../z_tools/qemu
其操作就是把helloo03.img复制成fdimage0.bin放进qemu里面,qemu是一个软盘模拟器,通过这个软件执行就是再执行fdimage0.bin中的程序了。第二行的make是执行qemu目录下的makefile,makefile里面是指明运行qemu-win.bat,这个批处理文件中内容是:
@set SDL_VIDEODRIVER=windib;设置qemu的相关变量...
@set QEMU_AUDIO_DRV=none
@set QEMU_AUDIO_LOG_TO_MONITOR=0
qemu.exe -L . -m 32 -localtime -std-vga -fda fdimage0.bin
意思是通过qemu.exe把fdimage0.bin拉起来,fdimage0.bin就相当于录制好了的操作系统文件。再qemu.exe上跑了起来。
具体描述
代码:
接下来讲讲代码。
ORG 0x7c00 ;指明程序的装载地址
mov ax,0 ; 初始化 寄存器
mov ss,0 ; ss寄存器,设置成0
mov sp,0x7c00 ; sp栈指针,设在程序装载区最开始的地方,这样做我觉得不对,不过现在程序没有跑
mov ds,ax ; ds数据寄存器
mov es,ax ; es段寄存器
mov si,msg ; si源变地址寄存器。 把msg的内存区域都读过来
; 啊我待会得去把汇编寄存器给复习一下
putloop: ; 这是循环输出的
mov al,[si] ; 从msg 里面读取数据
add si,1 ; si寄存器 + 1
cmp al,0 ; 是不是0,是就跳出去
je fin
; 这是显示函数的标准写法
mov ah,0x0e ; 不等于就这里,把0x0e放在高位
mov bx,5 ; 这里是搞个颜色
int 0x10 ; 调用显示中断,这个中断再bios里面的
jmp putloop ; 循环写入
fin:
hlt
jmp fin
msg:
db 0x0a, 0x0a
db "hello,world"
db 0x0a
db 0
RESB 0x7dfe-$ ; 从后面一直到这里,全部写0
DB 0x55, 0xaa ; 必须 0x, 0x55aa
如上代码,注释也写的很清楚,接下来说下代码的含义与及一些需要明白的小知识点。
第一段代码,意义在于初始化需要用的寄存器,清零的清零,设值的设值。
第二段代码,指定位置msg处,读hello,world
第三段代码,调用 10 号中断,展示对应的字符。
第四段代码,循环阻塞住,展示不退出。
第五段代码,msg,要展示的数据区。
第六段代码,填零,启动区标志。
需要知道的基本常识
在汇编中,中断的调用的时候需要设置相关的寄存器,因为执行的中断会去对应的寄存器中读取值,类似于函数传参。
操作系统中bios执行完毕以后,会去找到0x7c00位置开始执行。在加载主驱动区的时候比那辨别最后的位置是不是0x55aa,如果是就认为他是bios需要加载的引导区。如果不是,bios就不认为他是需要的启动区,因此,这块区域的最后需要写成0x55aa。
如果有错,欢迎指出。
邮箱:ningmonguo@foxmail.com