完善引导程序——未启动分页机制的保护模式3

第二遍写。。刚写完结果电脑重启了。。只好大概重写下要点。。
1.[BITS 32] 明确告诉编译器接下来的段是32位的段
2.用bocsh虚拟机调试操作系统
将run.bat中的..\bochs -q -f bochsrc.bxrc改为..\bochsdbg -q -f bochsrc.bxrc
bocsh常用命令:

3.保护模式下写hello shadow程序
(1)问:如何修改gdt使保护模式下的数据段描述符和代码段描述符的段基址分别与data_32和code_32对应?
答:观察描述符的结构可知,第2、3、4、7位表示段基址(从0开始计数)。修改这几位即可。
相关代码:

引导程序编写小记

1.引导程序:
bios将启动磁盘第一扇区(512Byte)载入内存0000:7c00处。如果第一扇区最后一个字是dw 0aa55h,那么它就是引导程序
2.nasm的语法:
(1)$:编译后的当前行地址
(2)$$:编译后一个节的开始处的地址
(3)任何不被[]括起来的标签或变量名都被认为是地址。没有offset这个关键词
(4)org 07c00h 告诉编译器程序的开始地址是07c00h
(5)times 字节数 db 0 从该行开始,将指定长度空间填0
(6)小技巧:jmp $ 死循环
3.用nasm编译:nasm *.asm -o *.bin
4.反编译:ndisasm *.bin
5.开机时实模式下的1M内存:

因为试了很久都没能给centos纯字符界面装上vbox的增强包,自然也就不能设置共享文件夹,所以果断放弃centos,改用win下的nasm。。。
步骤:
1.写好引导程序
2.用nasm编译
3.用winimage新建个虚拟软盘文件
4.写个c程序copy_image,将写好的引导程序copy到空白软盘镜像boot.vfd
5.vpc挂载boot.vfd,启动
下面先给出int 10h中断,13h号功能:
功能:在Teletype模式下显示字符串
入口参数:AH=13H
BH=页码
BL=属性(若AL=00H或01H)
CX=显示字符串长度
(DH、DL)=坐标(行、列)
ES:BP=显示字符串的地址 AL= 显示输出方式
0—字符串中只含显示字符,其显示属性在BL中。显示后,光标位置不变
1—字符串中只含显示字符,其显示属性在BL中。显示后,光标位置改变
2—字符串中含显示字符和显示属性。显示后,光标位置不变
3—字符串中含显示字符和显示属性。显示后,光标位置改变
出口参数: 无
下面给出这个可以引导的程序: