版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 第五章汇编语言程序设计 难点和重点 1.变量通过伪指令DBDWDDDQDT来定义 DB定义的是字节变量,DW定义的是字变量;DD定义的是双字变量,DQ定义的是长字变量;DT定义的是一个十字节变量。当变量为D怖口DD型时,才可以作为地址表达式,此时应遵循以下规则: (l)当用DW定义地址表达式时,地址表达式中的变量名称表示该变量的第一个存储单元的偏移地址。 (2)当用DD定义地址表达式时,低位字用于预置偏移地址,高位字用于预置段地址。 (3)地址表达式中的变量或标号可与常数值相加减。对于变量来说运算结果的类型不变;对标号来说,运算结果仍表示原标号所在段中的偏移地址。 (4)变量或标号不能与变量
2、或标号相加,但可相减,结果是没有属性的纯数值。 2 .源程序模块 一个源程序模块能允许包括多个代码段和其它段,也允许多次使用ASSUM踣句,重新约定段寄存器和段 的关系。但ASSUMED句并不意味着汇编后这些段地址已经装入相应的段寄存器中了,除了CS寄存器以 外,其它各个段寄存器的实际值,还要用MOV旨令来赋值,例如: MYCODESEGMENT ASSUMECSMYCODEDSMYDATAES:MYEXTRASS:MYSTACK STARTMOVAX,MYDATA MOVDS,AX MOVAX,MYEXTRA MOVES,AX MOVAX,MYSTACK MOVSS,AX MYCODEEND
3、S 然而,也不能只用赋值语句而将ASSUM踣句省略,这样汇编程序就找不到所定义的各个段。 3 .跳转表法 当程序是CASE吉构,即需引出多个分支时,最好利用跳转表法。其主要设计思想是:首先将n个选择项 所对应的n个分支程序的标号存放在一个数据表(即跳转表)中,然后判别程序是否满足第一个条件,若满足就根据分支程序标号在跳转表中存放的地址将程序转入相应的分支;否则继续判别下个条件是否满 足,。下面程序主要实现一组选择项(5个)存于AL寄存器中,要根据AL中为1的位将程序分别转 移到相应的分支: BRANCHSEGMT BRANTABDWROUTINE1 DWROUTINE2 DWROUTINES
4、DWROUTINE4 DWROUTINE5 BRANCHENDS ROUTINESEGMENT MAINPROCFAR ASSUMECS:ROUTINEDS:BRANCH STARTPUSHDS SUBBX,BX PUSHBX MOVBX,BRANCH MOVDS,BX CMPAL,0 JEDONE LEABX,BRANCH CTINUESHRAL,l JNCNOTYET JMPWORDPTRBX NOTYETADDBX,TYPEBRANCH JMPCTINUE DONE ROUTINE! ROUTINEZ RET MAINENDP ROUTINEENDS ENDSTART 4 .过程的嵌套、
5、递归调用和可重入性 过程也可以作为调用程序去调用其它过程,这里称为过程的嵌套。一般来说,嵌套的层次是没有限制的,只要堆栈空间允许即可,但当嵌套层次较多时应特别注意寄存器内容的保护和恢复,以免发生冲突。 当子程序嵌套时,若某子程序要调用的子程序就是该子程序本身,则称这种调用为子程序的递归调用。递归过程被递归调用时必须保证不破坏前边调用所用到的参数及产生的结果,否则,就不能求出最后结果。 此外,递归过程还必须具有递归结束的条件,以便在递归调用一定次数后退出,否则,递归调用将无限地 嵌套下去。为了能在每次递归调用后保留该次所用到的参数和运行结果,必须对每次递归调用所用到的参 数和运行结果都专门分配一
6、个存储区域。通常将一次递归调用所存储的信息称为帧,一帧信息包括递归调 用时的入口参数、寄存器内容及返回地址等。存储每次递归调用每帧信息的最好方法是采用堆栈,每次递归调用时用PUSH旨令将一帧信息压入堆栈;每次返回时,再从堆栈中弹出一帧信息。 5 .过程的重入 当一个公用子程序被某一个程序调用且还未执行完时,被另一个程序中断。同时,后一个程序执行时又一 次调用该公用子程序,这样公用子程序便被再一次进入。若该公用子程序的设计能保证两次调用都得到正 确结果,则称该公用子程序具有可重入性。保证子程序可重入性的方法,通常也是将每次调用子程序时所 用到的参数和中间结果逐层压入堆栈,以达到每次调用的结果都能
7、正确保存的目的。 5.1 伪操作命令(伪指令共有20条,常用的有以下几条:) 5.1.1 数据定义语句 (l)赋值伪指令EQU当某个表达式被多次引用时,常采用给这个表达式赋一个名称,这样源程序中就可 以以名称代替表达式;另外常使用标号来代表数据,数据地址或程序地址。伪指令EQUW两种格式,即 名称EQUB1达式,如: XYZEQU2000H,定义后XYZ的值就为2000H 名称EQU定义过的名称或标号,如: ABCEQUxyz定义后ABC的值就为xyz的值,即2000H (2)定义变量(分配存储单元)伪指令:也即给变量分配内存的伪指令,这些伪指令是:DBDWDDDQ DT (3)定义存储单元类
8、型伪指令:定义存储单元类型的伪指令并不是单独使用,而是和指令结合起来使用的。 利用这些伪指令,对存储单元类型进行规定。例如: INCBYTEPTRDI;DI所指存储单元为字节型 JMPDWORDPTR2000H;2000H开始的4个存 ;储单元为双字型 5.1.2 表达式赋值语句 ORGfe指令。伪指令ORG!来规定目标程序存放单元的偏移量。它的格式如下: OR部达式 汇编程序ASM-86规定ORGfe指令不能带标识符,如:START:ORG2000是非法语句。 如果在源程序中的第一条指令用了如下伪指令: ORG2000H 则汇编程序将把指令指针IP的值置成2000H,目标程序的第一个字节将放
9、在2000H单元,后面的程序就 会依次顺序存放。当遇到另一条。ORCm句时,目标程序的存放地址才会从新的ORGm句指定的地址单元存放。 5.1.3 段定义语句 定义段伪指令SEGMENT/ENDS要是用来定义段的名称和范围,还可指明段的定位类型、组合类型和分类 名。定义段伪指令的格式是: 段名1SEGMENT定位类型组合类型分类名 段名1ENDS 段定义格式中,带有“”部分可根据需要选择其有无。当用于定义数据段、附加数据和堆栈段时,介 于SEGMENT/ENDS指令中间的语句,只能包括伪指令语句,不能包括指令语句。只有当SEGMENT/ENDS义代码段时,中间的语句才能为指令语句以及与指令有关
10、的伪指令语句。 一个段一经定义,其中指令的标号、变量等在段内的偏移地址就已排定,它们都在同一个段地址控制之下, 整个段占用的存储空间大小也就确定。由SEGMENT/ENDS定义的段小于64K 单元。 ASSUME指令。ASSUMED指令语句用来告诉汇编程序在指令执行期间内存的哪一段是数据段,哪一段是堆栈段,哪一段是代码段。ASSUME伪指令的格式如下: ASSUM9寄存器名:段名符,段寄存器名:段名符, ASSUMED句只能安排在代码段内,一般应排在代码段作为首指令。ASSUM踣句中的段寄存器名:段名 符可以有一项,也可以有多项,可以将这些项写成多个ASSUM踣句。一个源程序模式至少包括一个段
11、, 当代码、数据及堆栈都集中在一个段内时,ASSUM踣句的格式应该是: ASSUMECS:MYCODE,SS:MYCODEASSUMEDS:MYCODE,ES:MYCODE5.1.4过程定义语句定义过程的伪指令PROCENDPNEARF口FAR在ASM-86语言中,过程的含义和子程序是一样的。一个过程可以被其它程序所调用,它的最后一条指令总是返回指令,用以控制过程在执行完毕后,返回到主程序。定义过程的伪指令总是成对出现的,在这两条伪指令间的内容就作为一个过程,即一个子程序。5.1.5程序开始和结束语句源程序结束伪指令END该指令是用来表明END语句处是源程序的终结。其格式如下:ENDB!达式这
12、里的表达式通常就是程序第一条指令的语句标号。这样程序在汇编、连接后,将目标代码装入内存之后准备要执行的起始地址由此标号所决定。这个表达式也可以省去。5.1.6外部伪指令及对准伪指定义访问外部标识符的伪指令EXTRNPUBLIC:当多个模块连接在一起时,可以利用定义访问外部标识符 的伪指令EXTRN,PUBLIC来引用其它模块中的某些变量或标号。定义结构的伪指令STRUC/ENDS结构定义的格式如下: 结构名称STRUC ;由DBDWDM指令所组成的语 ;句序列,每条语句定义一个字段标识符 结构名称ENDS 结构定义并不保留任何存储空间也不为任何存储单元赋值,之前,必须为结构 分配空间或赋值。要
13、给结构分配存储空间或赋值,必须有一个援用该结构的语句。其格式如下: 变量结构名称赋值说明 通过援用语句对结构进行存储空何分配和预置之后,结构及其字段就以变量的形式出现,可以像使用其它 变量一样使用。但对结构的访问必须用变量路径名的方法进行,路径名的格式为:变量名,字段名 5.2 DOS系统功能调用和BIOS中断调用 5.2.1 常用的软件中断 INT25H和INT26H软件中断指令,分别用来实现对磁盘指定扇区进行读/写,这两条指令执行时,会分 别转去执行BIOS中的读/写磁盘扇区子程序。使用这两条指令前,必须按表中入口参数的要求,对指定的寄存器分别设置读/写驱动器号,读/写扇区数,起始逻辑扇区
14、号和读/写内存的缓冲区首址,然后才执行相应的中断命令。 用INT27H退出程序时,MS-DO哙把此用户程序看成是系统的一个组成部分而驻留内存,因此在其它程序装配运行时,这部分程序不会受到覆盖。通常,用户对自已编写的中断处理程序进行装配以后,常用这种方式返回控制台命令接收状态,其它用户程序可以用软中断方式调用这部分程序。必须注意DX中要设 置驻留程序的长度,否则返回后程序不能驻留。 5.2.2 DOS系统功能调用 DOS系统功能调用分别实现设备管理、文件读/写、文件管理和目录管理等功能。每个子程序对应一个功 能号,所有的系统功能调用的格式是一致的,按下面4步进行: 5.3 系统功能号送到AH寄存
15、器中, (2)入口参数送到指定寄存器中, (3)用INT21H指令执行功能调用, (4)根据出口参数分析功能调用执行情况。 有些系统功能调用比较简单,不需要设置入口参数或者没有出口参数。DO繇统功能调用的功能 及入口/出口参数表,详细见附录。 1 .设备管理包括:键盘输入、显示输出、设置磁盘缓冲器、选择当前盘等功能调用。 2 .目录管理包括:查找目录项、更改目录项、建立子目录、删除子目录等功能调用。 3 .文件管理包括:建立文件、打开文件、读/写文件、删除文件等功能调用。 5.3汇编语言程序设计它仅仅是一种模式,因而在引用结构和其字段 5.4.1 汇编语言源程序的框架结构标准化汇编语言源程序采
16、用分段结构。对于单模块程序的基本框架如下所 模块名(可省略) 符号定义区(可依据需要而定) 外部符号名说明(依实际需要而定) 公共符号名说明(依实际需要而定) SEGMENT参数(依据实际要求而定,可省略) 堆栈段名(如STACK)SEGMENT参数(依实际要求而定) 预置堆栈空间堆栈段名(如STACK)ENDS 代码段名(如CODE)SEGMENT参数(依实际需要而定) ASSUME段寄存器指派 STARTMOVAX,DATA;段地址装填 MOVDS,AX MOVAX,STACK MOVSS,AX 主程序体 MOVAH,4CH INT21H 过程名1PROC类型说明 过程体1 过程名1END
17、P 过程名2PROC类型说明 过程体2 过程名2ENDP 代码段名(如CODE)ENDS ENDSTART 汇编语言源程序采用分段结构,包括代码段、数据段和堆栈段。任何一个源程序至少有一个代码段,用来放置指令性语句构成的程序。堆栈段和数据段依据实际要求而决定。数据段用来定义变量,定义所需要的数据常数及预置存储空间,中间都是由伪指令语句构成。堆栈段依需要而定,如果用户使用堆栈操作,最NAME EQU EXTRN PUBLIC 数据段名(如DATA) 变量定义 预置存储空间 数据段名(如DATA) ENDS 后使用用户自己定义的存储空间;若没有定义 堆栈段,将自动使用系统定义的堆栈区。过程可放在代
18、码段,也可单独建立一个过程段(另一个代码段)。 EQM放在数据段、代码段,宏指令一般放在程序的开始。PUBLIC可放在程序的任何一行。 因为各逻辑段通过段寄存器寻址,所以必须在代码程序的开头给相应的段寄存器赋值(装入地址)。 ASSUM防指令仅仅是指明了各逻辑段与段寄存器的对应关系,即该逻辑段是什么属性的逻辑段,并没有对段寄存器赋值。因此,必须在程序的开头先进行.DSSS、ES偌存在扩展段)的段基址装入。 5.4.2 程序设计基本步骤 对于给定的课题进行程序设计,一般应按下述步骤进行。 .分析课题 对于实际的课题任务要有一个明确的认识,例如已知条件是什么,输入/输出是什么,现场的工艺过程和工序
19、,对运算的精度和速度有什么要求等要有一个全面的理解。 .确定算法 把实际问题转化成计算机求解的具体步骤和方法,而程序是来描述算法的。在计算机控制系统中, 依据某种算法实现对现场设备的控制称为控制算法。尽可能选择多种算法,比较其优缺点,结合具体情况选择其中最适用的一种。 .画出流程图 依据算法,使用框状图形符号,加上简明的文字说明,用以描述解决问题的具体逻辑步骤和方法, 这种框状图形符号称为流程图。流程图的国家标准为CB1526-89,也有国际标准,二者基本一致。 .存储器资源分配 编写程序前要进行资源分配,例如程序区和数据区如何安排,工作单元分配,变量的名称,最好画出一个详细的存储分配的明细表
20、,以便编程时随时查阅。 .编写程序 应用汇编语言依据流程图进行程序编写,要求程序层次清楚,执行速度快,且尽可能少占内存,并且适当地加以诠释。编写程序后,利用PC机进行交叉汇编、调试和修改。 .上机调试 5.4.3 汇编语言程序设计应注意的问题 1.程序模块化:对于复杂的,大型的程序将其划分为若干个相对独立的功能模块(一般编为过程),每个模块可以单独编写,单独汇编,单独调试。这种相对独立的模块程序易于分析和修改,维护方便,而且一个程 序模块可以为多个程序所调用。 .程序正确完整,具有容错功能。程序设计编写完毕后,要反复进行测试,把可能出现的故障的错误都要考虑在内,并且尽可能在调试价段予以排除。对
21、于程序中不符合要求的运算错误和干扰错误,要给出相应“错误”的信息提示,对某些错误应能自动校正修复。 .算法的可靠性和合理性。选择算法时,要比较多种算法方案。虽然解决一个问题可以有多种算法,但效率和精度可能有很大差别,应依据实际需要而定。例如,尽量减小运算中的舍入误差,查表法代替复杂的函数运算等。 .实时性要求高的工程控制程序,要充分考虑软件执行速度。例如采样速率、控制量的计算时间 等。 5.3.4程序的基本结构与基本程序设计 2.程序设计初步 (1)程序是人们编写的、由计算机硬件执行的一系列指令。编写程序的过程称为程序设计。由机器指令的 二进制代码组成的程序称为机器语言程序。这是计算机直接能够
22、识别的程序。 (2)简单程序一按照指令的书写顺序依次执行的程序。 (3)分支程序一采用条件转移指令进行判断、使程序的流程不再是一条顺序执行的直线,而变为由许多分 支组成的树形结构,其中每个分支只有在满足给定条件时才被执行。 (4)循环程序一是程序设计的一个技巧,当程序处理的对象具有某种重复性的规律时,可用这种方法编写 程序。 (5)子程序一一个完整的独立的程序段,它可以多次被其它程序调用,并在这个程序段执行完后返回到原 调用的程序处。 分支程序的设计 程序的分支主要是靠条件转移指令来实现的。这里需要注意的是条件转移语句都是近程跳转,若程序所要 转移的地址超出其范围时,则需利用一条无条件转移语句
23、作为中转。 循环程序的设计 循环程序的设计主要用于某些需要重复进行的操作,主要使用循环指令LOORLOOP减LOOPN或条件转 移指令。循环程序的结构可分为设置循环初始状态、循环体和循环控制条件3部分: (1)设置循环初始状态主要是指设置循环次数的计数初值,以及其它为能使循环体正常工作的初始状态等。 (2)循环体是指循环操作(重复执行)的部分,包括循环的工 作部分及修改部分。循环的工作部分是实现程序功能的主要程序段;循环的修改部分是指当程序循环执行 时,对一些参数如地址、变量的有规律的修正。 (3)循环控制部分是循环程序设计的关键。每个循环程序必须选择一个控制循环程序运行和结束的条件, 且如何
24、选择一个合适的循环控制条件对一个循环程序的设计来说也是非常重要的。最常采用的循环控制条 件是循环次数,即可先预置一个循环次数初值,每执行一次,循环体将该计数值减1,直至循环计数值减 到0,便退出循环。 子程序的设计 子程序是一个独立的程序段,能完成某些确定的功能,并能被其它程序调用。当一个子程序被调用,且该子程序完成确定的功能后便返回调用程序处。 .过程的定义和调用 过程的定义是采用过程定义伪指令,其格式为: 过程名PROC属性 RET 过程名ENDP 调用过程时只要在CALL指令后写上该过程名即可,属性字段用来指明过程的类型属性是NEAR是FAR RET指令总是放在过程体的末尾,用来返回主程
25、序。 当过程和主程序在同一代码时,过程可定义为NEARBY,若过程和主程序不在一个代码段时,则过程定 义为FAR属性。 .寄存琴内容的保护和恢复 通常主程序和过程的设计是分开进行的,因而它们所使用的寄存器往往会发生冲突,所以在进入过程时应 将该过程所用寄存器的内容保存起来,这称为保护现场。过程返回主程序前,应将这些寄存器内容恢复, 这称为恢复现场.保护现场和恢复现场通常分别用堆栈压入指令和弹出指令来实现。须注意,并不是过程中用的所有寄存器内容都要保护,例如,若用寄存器在主程序和过程间传递参数就不需要保护。 .主程序和过程间的参数传送在主程序调用过程时,必须先把过程所需的初始数据设置(即入口参数
26、)好,过程执行完毕返回主程序时也必须将过程运行所得结果(即出口参数)送给主程序。过程入口参数和出口参数的送入和送出称为主程序和过程 间的参数传送。参数传送的方法主要有以下4种: (1)用CPU内部的寄存器传送参数。 (2)当过程和主程序同在一个代码段时,过程可以直接访问该代码段中的变量(即参数)。 (3)通过地址表传送变量地址。该方法是将所有变量的偏移地址顺序存放在一张地址表中,然后通过寄存 器将地址表的地址传送给过程,进入过程后可用寄存器间接寻址方式从地址表中取出变量地址,以便访问 所需变量。 (4)通过堆栈传送参数或参数地址。该方法是:调用过程前在主程序中用PUSH旨令将参数地址压入堆栈; 进入过程后再用基址寄存器BP从堆栈中取出这些参数地址,并送入寄存器,以便寄存器以间接寻址方式 访问所需变量。 汇编语言上机调试过程 汇编语言源程序的汇编、连接和装入运行 汇编语言是一种面向机器的符号语言,要想在计算机上运行汇编语言程序,必须对源程序进行汇编和连接。 下面是用汇编语言产生一个可执行文件的过程: (l)建
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 云南旅游职业学院《移动机器人导论》2023-2024学年第一学期期末试卷
- 办公技术新动向模板
- 述职报告:智慧农业实践
- 职业导论-房地产经纪人《职业导论》点睛提分卷2
- 心理协会辩论赛策划书
- 二零二五年度家庭养老照护床位服务与环保材料采购协议3篇
- 人教版小学数学(2024)一年级下册第一单元 认识平面图形综合素养测评 B卷(含答案)
- 2024-2025学年吉林省长春五中高三(上)期末数学试卷(含答案)
- 江西省赣州市大余县2024-2025学年七年级上学期1月期末生物学试题(含答案)
- 二零二五年酒店客房入住体验提升合作协议2篇
- 企业年会摄影服务合同
- 电商运营管理制度
- 2025年上半年上半年重庆三峡融资担保集团股份限公司招聘6人易考易错模拟试题(共500题)试卷后附参考答案
- 城市公共交通运营协议
- 内燃副司机晋升司机理论知识考试题及答案
- 2024北京东城初二(上)期末语文试卷及答案
- 2024设计院与职工劳动合同书样本
- 2024年贵州公务员考试申论试题(B卷)
- 电工高级工练习题库(附参考答案)
- 村里干零工协议书
- 2024年高考八省联考地理适应性试卷附答案解析
评论
0/150
提交评论