资源描述:
《汇编语言程序设计及上机指导第7章高级汇编语言程序设计》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第7章高级汇编语言程序设计【本章提要】本章叙述几种难道较大的程序设计技术,包括CPU工作模式的切换,以及32位和64位Windows汇编语言程序的设计,最后讲述汇编语言和高级语言的简单混合编程。【学习目标】·掌握32位、64位Windows程序的汇编语言设计的基本方法·简单掌握MASM32以及FASM汇编工具的基本应用·简要掌握汇编语言和高级语言的混合编程及其汇编、编译和链接过程7.1保护模式编程介绍7.1.1保护模式的特征实模式下的寄存器、寻址方式和指令等基本概念,除特别说明外在保护方式下仍然保持。尽管实方式下CPU的功能要大大超过其先前的处理器,但只有在保护方式下,才能发挥其更大的作用。
2、在保护方式下,全部32条地址线有效,可寻址高达4G字节的物理地址空间;扩充的存储器分段管理机制和可选的存储器分页管理机制,不仅为存储器共享和保护提供了硬件支持,而且为实现虚拟存储器提供了硬件支持;支持多任务,能够快速地进行任务切换和保护任务环境;4个特权级和完善的特权检查机制,既能实现资源共享又能保证代码和数据的安全和保密及任务的隔离;支持虚拟8086方式,便于在保护方式下同时又能执行8086程序。2021/7/257.1.2保护模式编程保护模式编程的要点就是如何实现实模式和保护模式的相互切换。一、从实模式切换到保护模式从实模式切换到保护模式一般需要两个步骤:①作好切换到保护模式下的准备;②
3、切换到保护模式。主要准备工作就是建立全局描述符表,并使GDTR指向GDT,因为切换到保护模式下,至少要将代码段的选择子装入到CS中。2021/7/251)定义好段描述符的结构:DESCRIPTORSTRUCT;每个段描述符占8个字节LIMITDW0;段界限BASELDW0;段基址的低16位BASEMDB0;段基址的16~23位ATTRIBUTESDW0;段属性BASEHDB0;段基址的高8位,24~31DESCRIPTORENDS2)定义好伪描述符:PDESCRIPTORSTRUCT;装入48位全局描述符表寄存器时要用到LIMITDW0;段界限BASEDD0;段基址PDESCRIPTOREN
4、DS3)通常要定义一个段间跳转的宏,这样的话就可以保证在进入保护模式时将代码段的选择子装入到CS寄存器。JUMPFARMACROselector,offsetsDB0EAH;0EAH为JUMP指令的机器码DWoffsets;段偏移DWselector;段选择子ENDM2021/7/254)打开A20地址线:保护模式下访问的地址空间超过1M,所以必须要用到A20地址线。ENABLE_A20MACRO;通过92H号端口的输出,可以使地址线;A20打开,能够被访问PUSHAXINAL,92HORAL,2;在92H号端口的d1位输出1,打开A20地址线OUT92H,ALPOPAXENDM5)切换到保
5、护模式下的最关键的动作为,将CR0寄存中的第0位置1。TO_PROTECTMACROMOVEAX,CR0ORCR0,1MOVCR0,EAXENDM2021/7/25二、保护模式切换到实模式显而易见,在保护模式返回到实模式时,只要做和上述的几个动作相反的动作就行了。主要要做好以下几个方面:1)定义一个宏,回到实模式,将CR0寄存中的第0位清0。TO_REALMACROmoveax,cr0andeax,0fffffffehmovcr0,eaxENDM2)定义一个宏,关闭A20地址线。DISABLE_A20MACROPUSHAXINAL,92HANDAL,0FDH;在92H号端口的d1位输出0,关
6、闭A20地址线OUT92H,ALPOPAXENDM3)恢复DS,使其内容为数据段基址,可用以下两条指令:movax,DATAmovds,ax4)用一个段间跳转的宏,清指令预取队列,使CS内容为代码段基址。2021/7/25三.具体实现方法下面的例子给出了如何从实模式转换到保护模式,并在保护模下访问680000H单元开始的内容(数据段基地址为680000H),最后又如何从保护模式返回到实模式的方法,程序结构片段如下:.386P;定义使用386指令集datasegmentuse16;定义16位数据段GDTLABELBYTE;定义全局描述符表EMPTYDESCRIPTOR{};空描述符,CODES
7、EGDESCRIPTOR{0FFFFH,,,98H,};代码段的描述符CODE_SEL=CODESEG-GDT;代码段描述符的选择子DATASEGDESCRIPTOR{0FFFFH,0H,68H,92H,};数据段描述符,即680000HDATA_SEL=DATASEG-GDT;数据段选择子GDTLEN=$-GDTVGDTRPDESCRIPTOR{GDTLEN-1,}dataends2021/7/25code