汇编语言与汇编程序.ppt
《汇编语言与汇编程序.ppt》由会员分享,可在线阅读,更多相关《汇编语言与汇编程序.ppt(58页珍藏版)》请在三一办公上搜索。
1、2.4.1 过程的定义,过程由伪指令PROC和ENDP定义。定义过程的格式为:过程名 PROCNEAR或FAR 过程名 ENDP 其中,PROC和ENDP必须成对出现,且前面都有同一过程名,过程的类型由PROC的操作数指出。若PROC后无操作数,则默认为NEAR类型。,在汇编程序中,可以使用过程定义伪指令定义子程序,通过调用指令CALL调用子程序。过程名是为该子程序起的名字。PROC和ENDP两伪指令之间,是为实现某功能的程序段,其中至少有一条子程序返回指令RET以便返回调用它的程序。,子程序也可以用“:”定义,“:”定义的标号是为该子程序起的名字。主程序把用“:”定义的子程序作为远过程来调用
2、。若子程序与调用它的主程序在同一代码段,则必须用过程来定义该子程序。中断调用都是远调用,所以中断服务子程序用“:”定义。若用过程来定义中断服务子程序定义过程为远过程,而不论他与调用程序是否在不同的代码段。,(1)NEAR属性:调用程序和子程序在同一代码段中(段内调用)(2)FAR属性:调用程序和子程序不在同一代码段中(段间调用),code segment main proc far.call subr1.retmain endpsubr1 proc near.retsubr1 endpcode ends,code segment main proc far.call subr1.retsubr
3、1 proc near.retsubr1 endpmain endpcode ends,例1 调用程序和子程序在同一代码段中,例2 调用程序和子程序不在同一代码段中 sagx segment subt proc far.ret subt endp.call subt.segx ends segy segment.call subt.segy ends,2.4.2 段的定义,段的定义通过SEGMENT和ENDS伪指令进行。定义一个段的格式是:段名 SEGMENT 定位方式 组合方式 类别名 段名 ENDS 其中,SEGMENT和ENDS必须成对出现,它们的前面需有相同的名字,该名字为段名。,例:
4、STACK SEGMENT STACK DW 20DUP(?)STACK ENDS,伪指令SEGMENT有3个可选择的操作数:定位方式,组合方式和类别名。,1.段名 可以用来表示段地址,如取段名为DATA的段地址送AX的指令:MOV AX,DATA 2.组合方式 有NONE、STACK等6种。(1)NONE即无组合方式,表示本段与其他段逻辑上不发生关连,这是隐含的组合方式。,(2)STACK 表示本段与其他模块中的STACK组合方式的同名段组合成一个段。模块中至少有一个STACK段,否则在连接时会有一个错误。定义堆栈段时,必须有组合方式STACK。(3)PUBLIC 表明该段与其他模块中用PU
5、BLIC说明的同名段连接成一个逻辑段,运行时装入同一个物理段中,使用同一个段地址。(其连接顺序由连接命令指定。)(4)COMMON 表明该段与其他模块中由COMMON说明的所有同名段连接时,被重叠放在一起,其长度是同名段中最长者的长度。,3.定位方式有PARA、BYTE、WORD、和PAGE 4种。PARA表示本段要从16的整数倍地址开始,即段首址的最低四位必须为0,这是隐含的定位方式。BYTE表示本段可从任何地址开始。WORD表示本段要从偶地址开始。PAGE表示本段要从256的整数倍地址开始。4.类别名是用单引号括起来的字符串,它是任意的一个名字。连接时LINK将把类别名相同的所有段存放在连
6、续的存储区域中。,2.4.3 汇编地址计数器,汇编地址计数器用符号$表示,它用来记录正在被汇编程序汇编的指令的地址,即它的内容标出了汇编程序当前的工作位置。汇编程序为每个段分配一个汇编地址计数器。对需要分配存储单元的变量和产生目标代码的指令,$就按存储单元数和目标代码的长度增值。因此,段内定义的所有标号和变量的偏移地址就是当前值。,DATA SEGMENTBUF DB 0123456789ABCDEFCOUNT EQU$-BUFDATA ENDS 常量COUNT的值就是变量BUF数据区所占的存储单元数16。,$可以用作指令的操作数,此时$的值就是该指令的偏移地址。$也可以出现在表达式中。如:,
7、$的值可以用伪指令ORG来设置。其格式是:ORG 数值表达式 功能是将$设置成数值表达式的值(0000HFFFFH之间的整数)。e.g ORG$+8,2.4.4 段寄存器的假定,存储单元的段地址来自某个段寄存器。源程序在代码段的开始就要对段寄存器与段之间的关系作假定,以便宏汇编程序MASM汇编时根据指令给定的偏移地址和段寄存器中的段地址计算出正确的物理地址。段寄存器与段的关系,由伪指令ASSUME设定,设定格式是:ASSUME SREG:SNAM,SREG:SNAM,其中SREG为4个段寄存器CS、SS、DS、ES中的任一个,SNAM是段名。,需要说明的是,伪指令ASSUME只是将段寄存器与段
8、间的对应关系告诉汇编程序,它并没有将段首址置入对应的段寄存器中,这一工作要到程序最后投入运行时才能完成。那时系统自动将代码段和堆栈段的段首址分别置入CS和SS,将PSP(program segment prefix)的段首址同时置入DS和ES。因此CS和SS不用程序处理;但对DS和ES,则必须由程序将其段首址分别置入。,例如:CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK MOV AX,DATA MOV DS,AX CODE ENDS,2.4.5 源程序的结束,源程序的结束要用伪指令END,其格式是:END表达式 该伪指令用在源程序的最后,用以表示整个
9、源程序的结束,即告诉汇编程序,汇编工作到此结束。其中可选项表达式的值必须是存储器的地址,该地址即为程序的启动地址,亦就是程序的第一条可执行指令的地址。表达式一般为过程名。如果不带表达式,则该程序不能单独运行,只是供其他程序调用的子模块。,2.4.6 宏汇编源程序的格式,宏汇编源程序一般由3个段组成,其格式如下:stack segment stack stack dw 32 dup(?)stack endsdata segmentdata endscode segmentbegin proc far assume ss:stack,cs:code,ds:data,push ds sub ax,a
10、x push ax mov ax,data mov ds,ax retbegin endpcode ends end begin,一个基本的汇编语言程序框架如下:stack SEGMENT PARA stack DB 100 DUP(stack)stack ENDS data SEGMENT data ENDS code SEGMENT ASSUME CS:code,DS:data,ES:data start:MOV AX,data MOV DS,AX MOV ES,AX MOV AL,4CH INT 21H code ENDS END start,堆栈段,数据段,代码段,在DOS状态下,执行
11、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,DATA MOV DS,AX DOS像调用子程序一样,调用EXE程序,EXE程
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 汇编程序

链接地址:https://www.31ppt.com/p-5993748.html