org 0x7c00 ;将程序加载到此处执行
jmp entry ;跳转到entry
;.....
;中略
;.....
;核心程序
entry:
mov ax,0
mov ss,ax
mov sp,0x7c00
mov ds,ax
mov es,ax
mov si,msg
putloop:
mov al,[si]
add si,1
cmp al,0
je fin
mov ah,0x0e
mov bx,15
int 0x10 ;调用显卡的BIOS
jmp putloop
fin:
hlt ;让CPU停止
jmp fin
msg:
db 0x0a,0x0a
db "hello,world!"
db 0x0a
db 0
我们将启动区的代码改写,下面我们来解释下代码的意思。
1、org:该指令指示编译器将代码装载到地址0x7c00处执行(0x7c00是当年IBM规定的,即0x00007c00~0x00007dff之间的512字节作为启动区)。
2、
cmp al,0
je fin
cmp al,0:比较指令
je:je是条件跳转指令之一,如果比较结果相等,则跳转到指定的地址;否则,执行je的下一条指令。
3、int 0x10:调用显卡的BIOS。int是软件中断指令,BIOS为操作系统开发人员准备了各种函数的信念,而int就是用来调用这些函数的指令。int后面的数字,表示调用不同的函数。要显示一个字符的时候,必须设定相应寄存器的值。ah的值0x0e即表示指定字符显示这个功能,al = 字符代码,bh = 0,bl = 颜色
4、hlt:让CPU停止动作的指令,但并不是彻底地停止(除非断电),而是让CPU进入待机状态,只要外部发生变化,如按下键盘,或是移动鼠标,CPU就会醒过来继续执行程序。其实这里要不要这条指令都一样,只不过要了这条就避免了jmp的无限循环,更加节能。