zoukankan      html  css  js  c++  java
  • 赵炯<<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运行正常。

  • 相关阅读:
    14.RabbitMQ
    13.跨域
    12.EF
    11.Redis
    GitHub获取用户ID
    10.AOP
    第26节课:pytest结合Allure操作
    第25节课:pytest测试框架
    第二十四节课:requests爬虫实战
    第二十三节课:正则表达式re模块:
  • 原文地址:https://www.cnblogs.com/tonybright/p/2346551.html
Copyright © 2011-2022 走看看