镜像还原–编写MBR主引导记录
当按下主机的power键后,第一个运行的是BIOS。
BIOS的作用:检测初始化硬件,建立中断向量表(对一些实现调用,所有硬件需要在保护模式下实现)
实模式下1MB内存布局
BIOS如何启动
由于第一个运行的软件就是BOIS,它是由硬件加载。
在开机的一瞬间,cpu的CS:IP寄存器被去强制初始化为0xF000:0xFFF0。由于是实模式,段基址需要乘以16,这样0xF000:0xFFF0等效0xFFFF0。此地址就是BIOS的入口地址。
入口地址的内容:jmp far f000:e05b(这是BOIS真正开始的地方)
看上述表格,跳转到BIOS里面。
之后BOIS是检测内存显卡等外设,检测通过之后并初始化硬件,在内存中0x00-0x3ff处建立数据结构,中断向量表IVT并填写中断例程。
BOIS最后一项工作是检验启动盘位于0盘0道1扇区的内容。(此扇区末尾的两个字节分别为0x55和0xaa)(512字节)
如果后面是0x55、0xaa,则执行0x7c00的代码
mov ax,0xb800
mov ds,ax
mov byte ptr ds:0x0,0x48
//上述代码是将0x48赋值到0xb800:0x0000中,0x48对应H符号
jmp .-2
//一直死循环
hello.asm:
mov ax,3
int 0x10;将显示模式设置成文本模式,相当于清屏
mov ax,0xb800
mov ds,ax
mov byte[0],'H'
mov byte[1],11110000b
halt:
jmp halt
times 510-($-$$) db 0
db 0x55,0xaa
times 123 db 0;表示填充123个字节0.
$表示当前地址
$$表示当前段地址
两者相减,再被510减就知道到底要填充多少0才会达到510个字节(从段地址开始)
最后两个字节填充0x55、0xaa(规定的)
上述hello.asm文件
mov byte[0],‘H’
mov byte[1],11110000b
奇数位是样式。
然后就可以书写输出hello,world的程序
mov ax,3
int 0x10;将显示模式设置成文本模式,相当于清屏
mov ax,0xb800
mov ds,ax
mov byte[0],'H'
mov byte[2],'e'
mov byte[4],'l'
mov byte[6],'l'
mov byte[8],'o'
mov byte[10],','
mov byte[12],'w'
mov byte[14],'o'
mov byte[16],'r'
mov byte[18],'l'
mov byte[20],'d'
halt:
jmp halt
times 510-($-$$) db 0
db 0x55,0xaa
实现学习语言的第一步,输出hello,world