最近在看写操作系统相关的书,这里给出一段书上引导区的代码,因为是汇编,而且是NASM汇编,所以看了蛮久的。
先给出NASM字符串显示的INT 10中断需要的准备工作:
INT 10 - VIDEO - WRITE STRING (AT and later,EGA)
AH = 13h AL = write mode bit 0: update cursor after writing bit 1: string contains alternating characters and attributes 当al=1的时候,需要处理的是有属性的字符.楼主给的不是ax=01301h吗?al=01 bits 2-7: reserved (0) BH = page number bh是页号,直接写裸机程序就是0 BL = attribute if string contains only characters 有人问到的,bl 就决定了字符的样式,颜色等。bl=0ch是黑底红字,高亮,可以换其它的 看看。 CX = number of characters in string 字符数,楼主好像要修改一下,因为 Funcking your monther!是22个字符。 DH,DL = row,column at which to start writing 打印时的位置,行列. ES:BP -> string to write 打印的字符。 Return: nothing
所以一段线在显存中显示字符串的函数应该这样编写:
DisPlayStr:
mov ax, BootMessage mov bp,ax mov cx,16 mov ax,01301h mov bx,000ch mov dx,0102h int 10h ret
一个简单的引导区代码编写如下,其他部分的解释可以操作《自己动手写操作系统》这本书
org 07c00h
mov ax,cs mov ds,ax mov es,ax call DisPlayStr jmp $DisPlayStr:
mov ax, BootMessage mov bp,ax mov cx,16 mov ax,01301h mov bx,000ch mov dx,0102h int 10h retBootMessage: db "Hello OS World!"
times 510-($-$$) db 0 dw 0xaa55