赵炯<<Linux 0.11内核完全剖析>>P30 MBR程序调试

赵炯博士的<<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运行正常。

原文地址:https://www.cnblogs.com/tonybright/p/2346551.html