- org 07c00h ; 告诉编译器程序加载到7c00处
- mov ax, cs
- mov ds, ax
- mov es, ax
- call DispStr ; 调用显示字符串例程
- jmp $ ; 无限循环
- DispStr:
- mov ax, BootMessage
- mov bp, ax ; ES:BP = 串地址
- mov cx, 16 ; CX = 串长度
- mov ax, 01301h ; AH = 13, AL = 01h
- mov bx, 000ch ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)
- mov dl, 0
- int 10h ; 10h 号中断
- ret
- BootMessage: db "Hello, OS world!"
- times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
- dw 0xaa55 ; 结束标志
这段程序出自《自己动手写操作系统》。一段简陋的汇编,却引领我进入pc汇编的大门。
PC上电后系统从0XFFFF:0000开始启动,而此处的内容是个jump指令,执行后进入ROMBIOS的某个位置开始检查一系列配置,包括ram、显示器、磁盘等,之后将控制权交给ROM启动程序,这个程序将磁盘0磁道0扇区的内容读到内存绝对位置07c00处,以上的代码就开始执行了。
3个mov语句将ds,es,cs指向同一位置,然后调用字符串显示函数,之后程序原地打转。
这个字符串显示函数确实有点让人激动,利用bios提供的int 10h中断服务程序对屏幕进行绘制。在调用之前需要设置一系列参数,字符串资源地址放在es:bp处,cx指令字符串长度为16,AH设定显示服务模式,值为13h说明显示字符串,AL设定光标位置,01h表示跟随字符串,BH设置显示页号为0页,BL八位指定显示背景和文字颜色,0~3位依次表示蓝、绿、红、灰色,4~6位表示背景色。DX表示显示位置的行列号,dl为0表示显示在0列。参数设定好后,最后调用int 10h。这个过程有点类似C中的函数参数的传递。
最后两句是为了初始化磁盘空间,设置扇区结束标志,因为前面说过,启动程序会将加载这个扇区。