赵炯<<Linux 0.11内核完全剖析>>P30 MBR程序调试
2012-02-11 14:42
597 查看
赵炯博士的<<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运行正常。
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运行正常。
相关文章推荐
- <<Linux内核完全剖析 --基于0.12内核>>学习笔记 第4章 80x86保护模式及其编程 4.8 保护模式编程初始化
- <<Linux内核完全剖析 --基于0.12内核>>学习笔记 第4章 80x86保护模式及其编程 4.4 分页机制
- <<Linux内核完全剖析 --基于0.12内核>>学习笔记 第4章 80x86保护模式及其编程 4.7 任务管理
- <<Linux内核完全剖析 --基于0.12内核>> 学习笔记 第4章 80x86保护模式及其编程 4.1 80x86系统寄存器和系统指令
- <<Linux内核完全剖析 --基于0.12内核>>学习笔记 第4章 80x86保护模式及其编程 4.6 中断和异常处理
- <<Linux内核完全剖析 --基于0.12内核>>学习笔记 第4章 80x86保护模式及其编程 4.3 分段机制
- <<Linux内核完全剖析 --基于0.12内核>>学习笔记 第4章 80x86保护模式及其编程 4.5 保护
- linux0.11内核完全剖析 - vsprintf.c
- linux0.11内核完全剖析 - ramdisk.c
- linux-0.11调试教程,源起,从linux内核完全注释的几处错误说起
- Linux0.11内核剖析--初始化程序(init)
- 《Linux0.11内核完全注释》读后小结 --- 调试环境的搭建
- 《Linux0.11内核完全注释》读后小结 --- 调试环境的搭建
- LINUX 0.11内核完全剖析学习笔记-第三章内核编程语言和环境
- <Linux>Linux对C程序的调试过程--gcc的编译过程
- # include <errno.h >查看错误代码errno是调试程序的一个重要方法。当Linux C API函数发生异常时,一般会将errno变量赋值一个整数,不同的值表示不同的含义,可以通过查看
- linux-0.11完全剖析第二天: bochs+ubuntu 14.04 运行简单的多任务内核
- 《linux 内核完全剖析》上帝为什么是右移20,而不是22! dir = (unsigned long *) ((from>>20) & 0xffc)
- linux0.11内核完全剖析- fork.c
- linux0.11内核完全剖析- sched.c