汇编语言第11章保护模式下的程序设计简介

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

11.1.3 头文件
头文件中,列举描述的数据结构比较全面,并不是在编写每个保护 模式下的汇编语言程序时全部用到的,如果一个程序没有使用某部分内
容可不引用。
公用过程----GDT初始化(InitGDT.inc)清单
;GDT初始化 InitGDT PROC PUSH MOV MOV MOV MOV Again: MOV MOVZX SHL SHLD MOV MOV MOV ADD LOOP POP MOV MOV MUL MOV MOV RET InitGDT ENDP
ADD AX, OFFSET GDT ADC DX, 0 ;界限已在定义时设置好 MOV WORD PTR VGDTR.Base, AX MOV WORD PTR VGDTR.Base+2, DX MOV AX, CSEG ;设置代码段描述符 MUL BX MOV WORD PTR Code.BaseL, AX MOV BYTE PTR Code.BaseM, DL MOV BYTE PTR Code.BaseH, DH MOV AX, DSEG MUL BX MOV WORD PTR Data.BaseL, AX MOV BYTE PTR Data.BaseM, DL MOV BYTE PTR Data.BaseH, DH LGDT QWORD PTR VGDTR ;加载GDTR CLI ;关中断 EA20 ;打开地址线A20 MOV EAX, CR0 ;切换到保护方式 OR EAX, 1
公用过程----文件InitIDT.inc清单
;初始化IDT InitIDT PROC MOV MOV MUL MOV MOV RET InitIDT ENDP
BX, 16 AX, IDTSeg BX WORD PTR VIDTR.Base, AX WORD PTR VIDTR.Base+2, DX
11.2 实模式与保护模式之间的切换
11.2.1 两种模式之间切换
1.从实模式切换到保护模式
首先,必须完成使GDTR指向该GDT。然后,由实模式切换到保 护模式原则上只要把控制寄存器CR0中的PE位置1即可,利用下面三 条指令完成对PE位的设置。 MOV EAX, CR0 OR EAX, 1 MOV CR0, EAX 在实际情况下,紧接着这三条指令,安排一条段间转移指令: JUMP16 Code_Sel, <OFFSET Virtual>
.586P
支持对80586所有指令的汇编
11.1.2 A20地址线的使用
为了访问地址在1M以上的存储单元,应先打开控制地址线A20的 “门”。这种设置与实模式下只使用最低端的1M字节存储空间有关, 与处理器是否工作在实模式或保护方式无关,即使在关闭地址线 A20时,也可进入保护模式。
Βιβλιοθήκη Baidu
代码
;打开A20: PUSH AX IN AL, 92H OR AL, 00000010B OUT 92H, AL POP AX ;关闭A20: PUSH AX IN AL, 92H AND AL, 11111101B OUT 92H, AL POP AX
DS AX, GDTSeg DS, AX CX, GDTNum SI, OFFSET EFFGDT AX, [SI].BaseL EAX, AX EAX, 4 EDX, EAX, 16 WORD PTR [SI].BaseL, AX BYTE PTR [SI].BaseM, DL BYTE PTR [SI].BaseH, DH SI, SIZE Desc Again DS BX, 16 AX, GDTSeg BX WORD PTR VGDTR.Base, AX WORD PTR VGDTR.Base+2, DX
2.从保护模式切换到实模式
从保护模式切换到实模式的过程类似于从实模式切换到保护模 式。原则上只要把控制寄存器CR0中的PE位清0即可。实际上,在此 之后也要安排一条段间转移指令,一方面清指令预取队列,另一方 面把实模式下代码段的段值送CS。这条段间转移指令在保护方式下 被预取并在实模式下被执行。
11.2.2 两种模式切换实例
本章主要教学内容
1.保护模式下的各种伪指令; 2.实模式与保护模式的切换; 3.控制转移、中断和异常;
4.输入/输出保护、分页机制等。
本章主要教学目的及要求
1.理解保护模式下的各种伪指令及编程; 2.掌握实模式与保护模式的切换方法; 3.掌握中断和异常的相关概念、编程方法;
4.了解输入/输出保护和分页机制。
公用过程----文件InitLDT.inc清单
;初始化LDT ;入口参数:FS:SI=第一个要初始化的描述符,CX=要初始化的 描述符数 InitLDT PROC MOV AX, WORD PTR FS:[SI].BaseL MOVZX EAX, AX SHL EAX, 4 SHLD EDX, EAX, 16 MOV WORD PTR FS:[SI].BaseL, AX MOV BYTE PTR FS:[SI].BaseM, DL MOV BYTE PTR FS:[SI].BaseH, DH ADD SI, SIZE Desc LOOP InitLDT RET InitLDT ENDP
11.1 保护模式编程基础
11.1.1 处理器类型伪指令
伪指令
.8086 .186 .286


只支持对8086指令的汇编 只支持对80186指令的汇编 支持对非特权的80286指令的汇编
.286P
.386 .386P .586
支持对80286所有指令的汇编
支持对80386非特权指令的汇编 支持对80386所有指令的汇编 支持对80586非特权指令的汇编
【例11-1】只有一个代码段的实模式和保护模式之间切换。 步骤: (1)切换前的准备工作; (2)切换到保护方式; (3)切换回实模式。 源程序如下:
;加载头文件386h.inc INCLUDE 386H.INC ;16位数据段 DSEG SEGMENT USE16 GDT LABEL BYTE ;全局描述符表 DUMMY S_DESC <> ;空描述符 Code S_DESC <0FFFFH,,,ATCE,,> Code_Sel = Code-GDT Data S_DESC <0FFFFH,0,11H,ATDW,,> Data_Sel = Datas-GDT GDTLen = $-GDT VGDTR PDesc <GDTLen-1,> DSEG ENDS ;16位代码段 CSEG SEGMENT USE16 'Real' ASSUME CS:CSEG, DS:DSEG Start PROC MOV AX, DSEG MOV DS, AX MOV BX, 16 MUL BX
相关文档
最新文档