赵炯博士的<<Linux 0.11内核完全剖析>>在第30页给出了一个简单的引导扇区程序(MBR)的示例,代码如下:
BOOTSEG=0x07c0
entry start
start:
jmpi go, BOOTSEG
go: mov ax, cs
mov ds, ax
mov [msg1+17], ah
mov cx, #20
mov dx, #0x1004
mov bx, #0x000c
mov bp, #msg1
mov ax, #0x1301
int 0x10
loop: jmp loop
msg1: .ascii "Loading System..."
.byte 13,10
.org 510
.word 0xAA55
调试环境为Linux2.6,VMware7.0,虚拟软驱RamDiskNt。上述MBR程序编译、链接命令如下:
as86 -0 -a -o boot.o boot.s
ld86 -0 -s -o boot boot.o
采用命令dd bs=32 if=boot of=/dev/fd0 skip=1将boot写入虚拟软驱的主引导扇区。重启VMWare,设置虚拟机从软驱启动,MBR执行后打印乱码。查阅资料,本书的P32指出打印的字符串采用es:bp来指示,修改如下:
mov ds, ax-------->mov es, ax。
通常,es和ds均作为的数据段段选择符寄存器使用,而BIOS的0x10中断采用es作为打印功能的数据段寄存器。
mov [msg1+17], ah该指令未启作用,推测可能是as86汇编中也不允许改变字符串常量,删除后,MBR运行正常。