资源预览内容
第1页 / 共58页
第2页 / 共58页
第3页 / 共58页
第4页 / 共58页
第5页 / 共58页
第6页 / 共58页
第7页 / 共58页
第8页 / 共58页
第9页 / 共58页
第10页 / 共58页
亲,该文档总共58页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
2.4.1 过程的定义过程由伪指令PROC和ENDP定义。定义过程的格式为:过程名 PROCNEAR或FAR过程名 ENDP其中,PROC和ENDP必须成对出现,且前面都有同一过程名,过程的类型由PROC的操作数指出。若PROC后无操作数,则默认为NEAR类型。在汇编程序中,可以使用过程定义伪指令定义子程序,通过调用指令CALL调用子程序。过程名是为该子程序起的名字。PROC和ENDP两伪指令之间,是为实现某功能的程序段,其中至少有一条子程序返回指令RET以便返回调用它的程序。子程序也可以用“:”定义,“:” 定义的标 号是为该子程序起的名字。v主程序把用“:”定义的子程序作为远过程来 调用。v若子程序与调用它的主程序在同一代码段, 则必须用过程来定义该子程序。v中断调用都是远调用,所以中断服务子程序 用“:”定义。v若用过程来定义中断服务子程序定义过程为 远过程,而不论他与调用程序是否在不同的代 码段。(1)NEAR属性:调用程序和子程序在同一代码段中(段内调用)(2)FAR属性:调用程序和子程序不在同一代码段中(段间调用)code segmentmain proc far.call subr1.ret main endpsubr1 proc near.ret subr1 endp code endscode segmentmain proc far.call subr1.ret subr1 proc near.ret subr1 endpmain endp code ends例1 调用程序和子程序在同一代码段中例2 调用程序和子程序不在同一代码段中sagx segmentsubt proc far.retsubt endp.call subt.segx endssegy segment.call subt.segy ends2.4.2 段的定义段的定义通过SEGMENT和ENDS伪指令进行。定义一个段的格式是:段名 SEGMENT 定位方式 组合方式 类别名 段名 ENDS其中,SEGMENT和ENDS必须成对出现,它们的前面需有相同的名字,该名字为段名。例:STACK SEGMENT STACKDW 20DUP(?)STACK ENDS伪指令SEGMENT有3个可选择的操作数:定位方式,组合方式和类别名。1.段名可以用来表示段地址,如取段名为DATA的段地 址送AX的指令:MOV AX,DATA2. 组合方式有NONE、STACK等6种。(1) NONE即无组合方式,表示本段与其他段逻辑上不发生关连,这是隐含的组合方式。(2) STACK 表示本段与其他模块中的STACK组 合方式的同名段组合成一个段。模块中至少有一个 STACK段,否则在连接时会有一个错误。定义堆栈 段时,必须有组合方式STACK。(3) PUBLIC 表明该段与其他模块中用PUBLIC 说明的同名段连接成一个逻辑段,运行时装入同一 个物理段中,使用同一个段地址。 (其连接顺序由 连接命令指定。)(4) COMMON 表明该段与其他模块中由 COMMON说明的所有同名段连接时,被重叠放在 一起,其长度是同名段中最长者的长度。 3.定位方式有PARA、BYTE、WORD、和PAGE 4种 。PARA表示本段要从16的整数倍地址开始,即段首址的最低四位必须为0,这是隐含的定位方式。 BYTE表示本段可从任何地址开始。WORD表示本段要从偶地址开始。PAGE表示本段要从256的整数倍地址开始。4. 类别名是用单引号括起来的字符串,它是任意的一个名字。连接时LINK将把类别名相同的所有段存放在连续的 存储区域中。2.4.3 汇编地址计数器汇编地址计数器用符号$表示,它用来记录正在被汇编程序汇编的指令的地址,即它的内容标出了汇编程序当前的工作位置。汇编程序为每个段分配一个汇编地址计数器。对需要分配存储单元的变量和产生目标代码的指令,$就按存储单元数和目标代码的长度增值。因此,段内定义的所有标号和变量的偏移地址就是当前值。DATA SEGMENTBUF DB 0123456789ABCDEFCOUNT EQU $-BUFDATA ENDS常量COUNT的值就是变量BUF数据区所占的 存储单元数16。$可以用作指令的操作数,此时$的值就是该指 令的偏移地址。 $也可以出现在表达式中。如:$的值可以用伪指令ORG来设置。其格式是:ORG 数值表达式功能是将$设置成数值表达式的值(0000HFFFFH之间的整数)。e.gORG $+82.4.4 段寄存器的假定存储单元的段地址来自某个段寄存器。源程序在代码段的开始就要对段寄存器与段之间的关系作假定,以便宏汇编程序MASM汇编时根据指令给定的偏移地址和段寄存器中的段地址计算出正确的物理地址。段寄存器与段的关系,由伪指令ASSUME设定,设定格式是:ASSUME SREG: SNAM ,SREG:SNAM,其中SREG为4个段寄存器CS、SS、DS、ES中的任一个,SNAM是段名。需要说明的是,伪指令ASSUME只是将段寄存器与段间的对应关系告诉汇编程序,它并没有将段首址置入对应的段寄存器中,这一工作要到程序最后投入运行时才能完成。那时系统自动将代码段和堆栈段的段首址分别置入CS和SS,将PSP (program segment prefix)的段首址同时置入DS和ES。因此CS和SS不用程序处理;但对DS和ES,则必须由程序将其段首址分别置入。例如:CODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKMOV AX,DATAMOV DS,AX CODE ENDS2.4.5 源程序的结束源程序的结束要用伪指令END,其格式是:END表达式该伪指令用在源程序的最后,用以表示整个源程序的结束,即告诉汇编程序,汇编工作到此结束。其中可选项表达式的值必须是存储器的地址,该地址即为程序的启动地址,亦就是程序的第一条可执行指令的地址。表达式一般为过程名。如果不带表达式,则该程序不能单独运行,只是供其他程序调用的子模块。2.4.6 宏汇编源程序的格式宏汇编源程序一般由3个段组成,其格式如下:stack segment stack stack dw 32 dup(?)stack endsdata segmentdata endscode segmentbegin proc farassume ss:stack,cs:code,ds:datapush dssub ax,axpush axmov ax,datamov ds,axretbegin endpcode endsend begin一个基本的汇编语言程序框架如下:stack SEGMENT PARA stackDB 100 DUP(stack)stack ENDSdata SEGMENTdata ENDScode SEGMENTASSUME CS:code, DS:data, ES:datastart: MOV AX, dataMOV DS, AXMOV ES, AXMOV AL, 4CHINT 21Hcode ENDSEND start 堆栈段数据段代码段在DOS状态下,执行EXE程序时,DOS会在COMMAND.COM暂存部分之后建立一个256字节的程序段前缀PSP(program segment prefix),在其后装入EXE程序,并把控制权转移给它。在PSP的首地址处有一条INT 20H指令。DOS在转移控制权时,将CS指向EXE程序的代码段,SS指向堆栈段,DS和ES并不指向用户程序的数据段和附加数据段而是指向PSP,这样便于用户使用和处理PSP中的信息。所以在初始化程序中有将数据段的段地址送DS的两条指令(若有附加数据段,还应有将附加段的段地址送ES的指令):MOV AX,DATAMOV DS,AXDOS像调用子程序一样,调用EXE程序,EXE程序执行后也应像子程序返回调用程序一样返回DOS。DOS为EXE程序返回DOS安排了两种方法:(1)用调用号为4CH的系统功能调用 (2)用软中断指令 INT 20H。4CH功能调用返回DOS虽简单,但不论是什么程序调用它均返回DOS。软中断INT 20H是返回调用程序。INT 20H返回调用程序要求CS指向PSP。只能利用远过程中的返回指令能将堆栈中的PSP的首地址送给CS和IP,然后执行放在PSP首地址中的INT 20H指令,从而使EXE程序结束返回调用程序。程序段为:PUSH DS ;PSP的段地址进栈SUB AX,AXPUSH AX ;PSP首偏移地址进栈RET ;PSP的首地址出栈综上述可知,执行初始化程序的作用其一是使PSP的首地址进栈,以便远返回指令结束用户程序返回调用程序,其二是使DS指向数据段的段首址。2.5 常用系统功能调用IBM PC微机系统为汇编用户提供了两个程序接口。一个是DOS系统功能调用,另一个是ROM中的BIOS(basic input/output system)。系统功能调用和BIOS由一系列的服务子程序构成,但调用与返回不是使用子程序调用指令CALL和返回指令RET,而是通过软中断指令INT N和中断返回指令IRET调用和返回。我们仅介绍DOS系统功能调用。层次特点:l ROM BIOS中的中断子程使用IN/OUT指令直接控制外设,实现与外设之间的输入/输出操作,以软件形式向其上层提供服务。l IO.SYS中的中断子程 ( 称基本输入/输出BIOS模块)调用ROM BIOS的基本I/O功能,向 MSDOS.SYS提供设备驱动服务 。用户程序磁盘管理模块(DOS内核) MSDOS.SYS 系统功能基本输入/输出 BIOS 模 块 IO.SYS 设备驱动ROM BIOS 基本I/O 系 统 硬 件装 入命令处理模块 COMMAN D.COM用户命令l MSDOS.SYS中的中断子程 ( 称DOS内核模块 )调用IO.SYS,实现对外设的控制。与标准外设有两层隔离 : IO.SYS和ROM BIOS。其中21H类型的中断子程提供了丰富的系统服务, 称21类型的中断调用为DOS系统(功能)调用。用户程序磁盘管理模块(DOS内核) MSDOS.SYS 系统功能基本输入/输出 BIOS 模 块 IO.SYS 设备驱动ROM BIOS 基本I/O 系 统 硬 件装 入命令处理模块 COMMAN D.COM用户命令l 用户编程原则尽可能使用DOS的系统功能调用,提高程序可移植性。在DOS功能不能实现情况下,考虑用BIOS功能调用。在DOS和BIOS的中断子程不能解决问题时,使用IN/OUT指令直接控制硬件。用户程序磁盘管理模块(DOS内核) MSDOS.SYS 系统功能基本输入/输出 BIOS 模 块 IO.SYS 设备驱动ROM BIOS 基本I/O 系 统 硬 件装 入命令处理模块 COMMAN D.COM用户命令2.5.
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号