通电后,主板上BIOS或者UEFI,会加电自检(检查硬件有没错误),加载bootloader(执行程序)到内存 bootloader被写死在磁盘上第一个扇区,启动后被加载到内存的一个固定的位置。BIOS去这个位置执行第一条指令。
将程序烧到软盘上,用软盘启动,模拟启动过程
; 文件名 boot.asm
org 7c00h ; BIOS读入MBR后,从固定的0x7c00h处开始执行。因此引导程序一定要放在这个位置才能执行。
; 下面部分和10h有关中断,10h中断用来显示字符
; 8086CPU 16位寄存器想用20位寻址,于是加了段寄存器。为了向后兼容,后来一直保留下来。
mov ax, cs
mov es, ax
mov ax, msg
mov bp, ax ; ES:BP表示显示字符串的地址
mov cx, msgLen ; CX存字符长度
mov ax, 1301h ; AH=13h表示向TTY字符终端显示字符,AL=01h表示显示方式(字符串是否包含显示属性,01h表示不包含)
mov bx, 000fh ; BH=00h表示页号第0页,BL=0fh表示颜色白色
mov dl, 0 ; 表示位于第0列
int 10h ; 在上面这些固定的寄存器当中放好数据后,直接调用中断函数即可
msg: db "hello world, welcome to OS!"
msgLen: equ $ - msg ; 字符串长度
times 510 - ($ - $$) db 0 ; 填充剩余部分,到512字节
dw 0aa55h ; 魔数,必须有这两个字节BIOS才确认是MBR,即主引导记录(是装有Linux系统的硬盘的第一个扇区)
汇编伪指令ORG,规定程序的起始地址,其作用是告诉汇编程序,以下机器语言加载到内存中的哪个地址。
nasm boot.asm -o boot.bin
IBM一开始就是这么设定的,后来为了兼容一直延续。 参考:https://www.glamenv-septzen.net/en/view/6