12第十二章模式转换——从实模式进入保护模式

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第十二章模式转换——从实模式进入保护模式

12.1 NASM编译实践

12.1.1 实验20 ——NASM编译

●情景描述

使用NASM编译一段程序,并可以在裸机上运行。

●实现功能

在开机后显示"Hello, OS world!"

●流程

1)初始化寄存器

2)调用BIOS int 10h,显示字符串

3)进入死循环

●代码及注释

%define _BOOT_DEBUG_

%ifdef _BOOT_DEBUG_

org 0100h

%else

org 07c00h

%endif

;告诉编译器加载到0100处生成,这样方便生成com文件。

;或者告诉编译器加载到7c00处生成,这样方便

mov ax,cs;将当前段地址放入ax,可以不要

mov ds,ax;将当前段地址放入数据寄存器,可以不要

mov es,ax;将当前段地址放入extra寄存器,可以不要

call DispStr;调用显示字符串程序

jmp $;无限循环(跳转到当前地址)

DispStr:

mov ax,BootMessage ;BootMessage的首地址送ax

mov bp,ax; 段内地址送到bp,至此地址完成——CS:BP = 串地址

mov cx,16; CX = 串长度

mov ax,01301h; AH = 13,AL = 01h

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

mov dl,0 ; 0送dx寄存器的低字节

int 10h; 10h号中断(视频中断,对应的中断向量为40-43H)

ret ; 从显示子程序中返回到主程序

BootMessage: db "Hello, OS world!"

times 510-($-$$) db 0; 用“0”填充0面0磁道1扇区剩下的空间,使生成的二进制代码恰好为512字节;

;$是当前行的段内偏移地址,$$是本小节代码的第一行代码,在本程序中就是“org 07c00h”的段内偏移地址。

dw 0xaa55;结束标志.使得0面0磁道1扇区510字节存55,511字节存aa,0扇区从0-511号单元,共512个字节。(引导扇区的结束标志)

显示界面

运行程序界面如图12-1所示。

图12-1 运行程序界面

12.1.2 实验补充资料

一. 内存引导地址7C00

Intel公司当初设计8086系统内存时对内存(1M)是这样规定的:内存包括暂驻程序区640K和系统内存区384K,在640K中把BIOS和驻留操作系统的数据和程序安排在低地址处,在保留一定的可扩展空间后,为配合BIOS和磁盘操作系统就把7C00规定为硬件及软件都支持的启动引导的内存地址,并写成引导规范。在当时各个公司都有自己的一些未公开的标准,而IBM公开推行IBM计算机的内部详细的结构时,他采用的是Intel的芯片,所以他遵循了这个标准,又由于大批的公司知道了这个标准之后,都兼容这个标准,以后也继续兼容,就真正成为一个共同的标准了,现在的CPU都是向下兼容的,还在用7C00。

由于引导扇区被加载到了7c00h处,代码中BootMessage的首地址放入bp中时,只是将8位放入了bp,缺省了高8位,这高8位需要由org指定,否则无法将正确的字符串相对偏移地址放入bp中:

BootMessage变量对应字符串在内存中首地址=0000(es段值):{7c00(org指定)+BootMessage在程序段内偏移(8位2进制)}

org会在编译期影响到内存寻址指令的编译(编译器会把所有程序用到的段内偏移地址自动加上org 后跟的数值),而其自身并不会被编译成机器码。就是为程序中所有的引用地址(需要计算的相对地址)增加一个段内偏移值。

二. 10h中断说明

10h中断表示,功能号为AH=13h时为写入字符串;AL=01h表示字符串包含属性;BH=页数;BL=显示属性;CX=字符串中的字符数量;DL,DH=从哪一列,行开始写;ES:BP 指向该字符串

12.1.3 实验21 ——反编译

通过反编译,可以将程序返回至源代码内容

反编译方法:ndisasmw -o 0x7c00 >> 1.asm

显示1.asm内容如下:

00007C00 8CC8 mov ax,cs

00007C02 8ED8 mov ds,ax

00007C04 8EC0 mov es,ax

00007C06 E80200 call 0x7c0b

00007C09 EBFE jmp short 0x7c09

00007C0B B81E01 mov ax,0x11e

00007C0E 89C5 mov bp,ax

00007C10 B91000 mov cx,0x10

00007C13 B80113 mov ax,0x1301

00007C16 BB0C00 mov bx,0xc

00007C19 B200 mov dl,0x0

00007C1B CD10 int 0x10

00007C1D C3 ret

以下为数据区

00007C1E 48 H

00007C1F 65 e

00007C20 6C l

00007C21 6C l

00007C22 6F o

00007C23 2C ,

00007C24 20 空格

00007C25 4F O

00007C26 53 S

00007C27 20 空格

00007C28 77 w

00007C29 6F 0

00007C2A 72 r

00007C2B 6C l

00007C2C 64 d

00007C2D 21 !

以下数据为0

00007C2E 00 无

……

00007DFC 00 无

00007DFD 00 无

00007DFE 55AA 55AA

12.2 保护模式

12.2.1 保护模式介绍

保护模式(Protected Mode,或有时简写为pmode)是一种80286系列和之后的x86兼容CPU操作模式。保护模式有一些新的特色,设计用来增强多工和系统稳定度,像是内存保护,分页系统,以及硬件支援的虚拟内存。大部分的现今x86操作系统都在保护模式下运行,包含Linux、FreeBSD、以及微软Windows 2.0 和之后版本。

相关文档
最新文档