Chinaunix首页 | 论坛 | 博客
  • 博客访问: 488828
  • 博文数量: 164
  • 博客积分: 4024
  • 博客等级: 上校
  • 技术积分: 1580
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-10 16:27
文章分类

全部博文(164)

文章存档

2011年(1)

2010年(108)

2009年(55)

我的朋友

分类:

2010-06-28 13:42:32

【8086模式编程】

如果想更深、更亲近的了解电脑软件。

那么学习cpu是你的必选!!

386是CPU史的一大转折点,那386做基础课是最好不过了。那么我们将开始进行学习之旅!!!

大家跟我一块学习吧,呵呵!!!

一、准备工作

1、NASM 编译环境(当然Masm 也可以 但是用它来写COM程序比较麻烦)

2、虚拟机

Virtual PC(Windows平台 ,执行比较快,即模拟又虚拟硬件)、

WMWarve(WIndows平台 虚拟硬件,)、

Bochs(支持Windows平台、也支持在Linux平台上运行 有RPM版本的)

我们这些生长在Windows这棵大树下的朋友们,还是用Virtual PC吧.。

3、写虚拟启动镜像文件的程序

:不知道我观察的对不对?

用Nasm 编译一个bin 然后将它转换为img 镜像文件的时候。

只要文件大小符合软驱的标准就能启动。那么就代表a.bin 与a.img 文件的内容一模样就是文件大小不一样!

我是不太了解镜像文件格式.我用的是Virtual PC。

二、开始接触引导程序

1、Com文件

Com文件是纯二进制的文件,也是直接与Cpu交换的顺序指令文件。

Com文件的大小是有限制的,不能超过64KB.

因为8086时代的CPU地址线是20位的,20位能表达的数值也就是fffffh(1MB )

而寄存器最高也只是16位,无法用5个F的形式来表达地址,所以用CS(段基地址)*16:IP(偏移地址)来寻址!

80386后通用寄存器都得到了32位扩展! 而Cpu地址线也得到了32位的扩展。

引导程序前期是需要进入实模式的,因为这是硬件上的限制是IA32的限制。

386cpu只有两种模式: 实模式与保护模式!!!!,,

2、引导程序

引导程序也是有限制的,这个限制是靠Bios处理的,

开机后Bios经过自检后,会从软驱或者硬盘的0面0磁道1扇区搜寻一个程序文件。

该文件的数据必需是等于512Byte,并且以aa55h结尾的(高高低低)。那么bios会认为它是引导程序,

这个时候就会把该512byte 装载到内存7c00开始处。然后将主控权交给程序的第一行代码。

那么这个时候程序脱离Bios的控制。Cpu将执行程序的代码.

三、写一个引导程序

引导程序可以说是非常简单:

1、boot.asm(nasm 的源文件如下)

;-----------------------欲编译,这里改成100h就是com程序 -------------------------------------------

%define _BOOT_DEBUG_   ;做调试的时候用100h
%ifdef _BOOT_DEBUG_
org   0100h
%else
org 07c00h    ; 告诉编译器 以下代码段将从07c00h内存地址处开始
%endif
mov    ax,cs             ;让数据段与附加段寄存器跟代码段一样,因为COM代码数据是混合.

mov   ds,ax

mov   es,ax

call   _HelloWorld        ;让程序显示一个HelloWorld

jmp      $                  ;$表示当前地址 无限循环

_HelloWorld:

mov ax,strHello        ;取得字符串的地址

mov bp,ax              ;给堆栈基寄存器

mov cx,strLen

mov   ax,1301H       ;ah代表功能号

mov bx, 000ch   ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮

mov   dx,0001h      ;显示的行与列

int       10h            ;bios 10h显示中断
ret

strHello:     db "Hello World"
strLen     equ $ - strHello
times 510-($-$$) db 0 ; times重复定义 510-($-$$)个 $$ 表示段的起始地址


dw     0xAA55

那么引导程序完成了,

用nasm boot.asm -o a.com

就可以运行看效果.,

如改成引导程序只需把%define _DEBUG_BOOT_注释 然后nasm boot.asm -o a.bin

然后用工具将a.bin 转换成软驱大小的镜像文件 载入虚拟机启动就可以.

阅读(849) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~