微机电子教程 第四章汇编程序设计精.ppt
微机电子教程微机电子教程第四章汇编程序第四章汇编程序设计设计第1页,本讲稿共78页 这样的程序占用内存空间少、执行速度快。所以,汇编语言多用来编写计算机系统程序、实时通信程序、实时控制程序等,也可被各种高级语言所嵌用。2、几种汇编、几种汇编 在IBM PC微机上流行的汇编程序是微软公司的小汇编(ASM)和宏汇编(MASM)两种。(还有TASM、OPTASM)计算机中完成汇编任务的程序被称为汇编程序(ASSEMBLER)它可以:将汇编语言源程序翻译成机器语言程序 能够根据用户要求自动分配存储区域(包括程序区、数据区等);自动地把各种进制数转换成二进制数;把字符转换成ASCII码;计算表达式的值;自动对源程序进行检查,给出错误信息(如非法格式、未定义的助记符、标号、漏掉操作数等)等 第2页,本讲稿共78页上机环境上机环境硬件硬件系统软件系统软件应用软件应用软件操作系统:操作系统:DOS系统系统编辑器编辑器:EDIT.exe编程序编程序:MASM.exe连接程序连接程序:LINK.exe调试程序:调试程序:DEBUG.exe用户开发的程序:用户开发的程序:ABC.exe等等CPU、存储器、存储器(ROM、RAM)、I/O接口、输入、输出设备接口、输入、输出设备3、汇编语言程序上机处理过程、汇编语言程序上机处理过程第3页,本讲稿共78页汇编语言上机过程汇编语言上机过程D:EDITABC.asmD:MASMABC;有语法错,回有语法错,回EDIT下改该程序下改该程序D:LINKABC;有错,回在有错,回在EDIT下改程序下改程序D:ABC运行结果错,回运行结果错,回EDIT下改程序下改程序或在或在DEBUG下调试,找原因。下调试,找原因。D:DEBUGABC.exe编辑源程序编辑源程序 EDITABC.ASM汇编源程序汇编源程序 MASMABC.ASM形成目标程序形成目标程序ABC.OBJ连接目标程序连接目标程序 LINKABC.OBJ有连接错误信息有连接错误信息?形成可执行程序形成可执行程序 ABC.EXE装入可执行程序到内存装入可执行程序到内存,并执行并执行D:subABC下一程序下一程序用用DEBUG调试可执行程序调试可执行程序D:sub DEBUGABC.EXE找到原因找到原因YNYNNYN有汇编错误信息有汇编错误信息?Y运行结果正确运行结果正确?用用DEBUG调试程序查错调试程序查错?第4页,本讲稿共78页4.2汇编语言的程序结构与语句格式汇编语言的程序结构与语句格式4.2.1汇编语言源程序的框架结构汇编语言源程序的框架结构(书P141)一、源程序的结构特点一、源程序的结构特点 1、由若干个逻辑段组成,各逻辑段都有一个段名,由段定义语句(伪指令语句)来定义和说明。源程序中一般具有代码段、堆栈段、数据段和附加数据段。代码段是必不可少的。数据段或附加段用来在内存中建立一个适当容量的工作区用以存放常数和变量,并作为算术运算或I/O接口传送数据的工作区等。堆栈段则在内存中建立一个堆栈区,以便在中断和子程序(或过程)调用及各模块间传递参数时使用。第5页,本讲稿共78页 8086/8088/80286只允许同时使用4种类型的段:代代码码段段(CSCS)、堆堆栈段(栈段(SSSS)、数据段()、数据段(DSDS)和附加段()和附加段(ESES)。80386/80486和Pentium系列允许同时使用6种段,除以上4种段外,还可有FSFS和和GSGS两个附加数据段两个附加数据段。在8086/8088和实实地地址址方方式式下下,每个段的最大长度均为64KB64KB;而在保保护护方方式式下下,80286允许每个段的最大长度为16MB16MB,80386/80486和Pentium系列允许4GB。在一个源程序中每种类型的段又可存在若干个,如几个数据段 2、在代码段起始处,用ASSUME说明各个段寄存器与逻辑段的关系,并在程序开始处设置段寄存器的初值(代码段CS除外)。3、每段由若干语句行组成,每行只能写一条语句,允许续行。整个源程序必须以END来标志执行的结束。在END后的标号START表示程序中运行第一条指令的起始地址。4、每条语句由4个字段构成。各字段间用空格分开。5、每个源程序中必须含有返回DOS的指令语句,以便返回DOS继续键入命令。如:标准序法。第6页,本讲稿共78页二、源程序与二、源程序与PC DOSPC DOS的接口的接口 汇编语言源程序经过汇编转变为目标程序,当用链接程序对其作进行链接和定位时,操作系统完成:1、为每个用户程序分配一个256字节的程序段前缀区(PSP),主要存放用户程序信息。在PSP的开始处(偏移地址0000H)安排一条INT 20H软中断指令。该程序的功能是使系统返回到DOS管理状态。因此,用户在组织程序时,必须使程序执行完后能够转去执行存放于PSP开始处的INT 20H指令。2、定位用户程序。3、设置DS和ES的值,使之指向PSP的开始处,即PSP的首地址。4、将CS设置为用户程序的段基址,IP为程序执行时的第一个地址,设置SS、SP。5、运行用户程序。第7页,本讲稿共78页保证用户程序执行完后返回DOS:第一种方法:标准序法:将用户程序中的主程序定义为FAR过程,其最后一条指令为RET;当程序执行到RET时,会将栈顶的两个字分别送IP、CS。在主程序的开始处将PSP所在段的段地址DS(或ES)保存进栈,然后再将一个全0的字(PSP的段内偏移地址)压入堆栈。这就是程序结构中的以下三条指令:PUSHDS;保护PSP段地址MOVAX,0 ;保护偏移0地址PUSHAX当用户程序返回时,会返回到DOS,执行INT 21H注:注:由于DS、ES由DOS已设置,所以在用户程序的开始处应重新设置DS、ES。第二种方法:非标准方法:不定义主程序为FAR过程并去掉标准序部分,只在代码段结束之前(即CODE ENDS之前)增加两句:MOVAH,4CHINT21H第8页,本讲稿共78页4 4、2 2、2 2 汇编语言的语句汇编语言的语句一、语句的种类与格式一、语句的种类与格式1、语句的种类 指令语句:可执行语句,与CPU指令系统的指令相对应,汇编程序为之产生一一对应的机器代码。例:例:MOVAH,4CH 例:例:伪指令语句伪指令语句MESSAGEDBTHISISASAMPLEPROGRAM.;定义变量;定义变量MESSAGE在数据段在数据段DATA中的存放形式。汇编时,中的存放形式。汇编时,;汇编程序将;汇编程序将MESSAGE定义为一个字节类型数据区的首地址,定义为一个字节类型数据区的首地址,;并按字节存储字符串信息。;并按字节存储字符串信息。伪指令语句:CPU不执行的语句,只是汇编时给汇编程序提供汇编信息,如定义符号、分配存储单元、将程序分段等。它本身并不产生目标代码,所以是指示性语句。第9页,本讲稿共78页 宏指令语句:是以某个宏名字定义的一段指令序列。汇编时,凡有宏指令语句的地方都将用相应的指令序列的目标代码插入。宏指令语句是一般性指令语句的扩展。2、语句格式 指令语句的一般格式为:标号:前缀 指令助记符 操作数;注释 伪指令语句的格式为:名字 伪指令定义符 操作数;注释 标号和名字 标号代表指令所在存储单元的符号地址。后跟冒号,在程序中作为转移(JMP)、调用(CALL)和循环(LOOP)指令的转移目标,与具体的指令地址相联系。伪指令语句的名字一般用于定义常量名、变量名、过程名、段名等。标号和名字必须符合汇编语言对标识符的规定:第10页,本讲稿共78页 以字母开头,由字母(AZ或az,汇编程序不区分大小写)、数字(09)及部分特殊字符(?、$和下划线_等)组成的字符串表示,字符串长度不能超过31个。标识符不能是汇编语言中有特定意义的保留字,如:CPU的内部寄存器名AH、AL、AX等。助记符、定义符 规定指令或伪指令的操作功能,是语句中唯一不可缺少的部分。前缀仅可出现在指令助记符前。操作数 指令语句中提供指令的操作对象、存放位置。伪指令语句中操作数的格式和含义随伪操作指令不同而不同。操作数可以是一个或2个或0个(INCBX,PUSHAX;MOVAX,DATA;RET,HLT,NOP,CLD)注释 以“;”开始,给以编程说明。第11页,本讲稿共78页二、语句中的操作数二、语句中的操作数1、常量操作数 在运行期间不变化的量:立即数、端口地址。常用有:2(B),10(D),8(Q),16(H)的整型常量,字符串常量。凡数字在AF之间且在最高位,必须加前缀0 字符串常量是用单引号括起来的一个或多个字符,其值为字符的ASCII代码值。例:A=41H AB=4142H2、Reg操作数 操作数部分是寄存器名,如:AX、SI和DS等 3、存贮器操作数-有标号与变量两种。标号:与指令地址相关联,或某个过程起点位置 在代码段内相关联。变量:存放在存贮单元中的值,变量常以变量名的形式出现在程序中。第12页,本讲稿共78页在数据段或堆栈段中,是存放数据的存放单元的符号地址,与各种寻址方式有关(存贮器操作数寻址方式)标号和变量都与存储器地址相关联,都具有以下三种属性:段属性(SEGMENT)段基址,即标号或变量所在段的段地址偏移量属性(OFFSET)段内偏移地址,即标号或变量所在的地址与所在段的段起始地址之差。类型属性(TYPE)变量的类型是指变量存取单位的字节数大小类型有字节(BYTE)、字(WORD)、双字(DWORD)、四字、十字节5种。标号的类型则指标号与使用它的指令之间的距离远近。当标号作为转移指令或调用指令的目标操作数时,若是段内的转移和调用,这个标号的类型属性为NEAR;若是段间的转移和调用,标号的类型属性为FAR。第13页,本讲稿共78页4、表达式操作数 表达式由各种操作数、运算符和操作符组成。(1)汇编语言中表达式有两类数值表达式:由数值常量、字符串常量或符号常量等与算术、逻 辑或关系运算符连接而成。在汇编时产生一个数值。地址表达式:由常量、变量、标号、寄存器(如BX、BP、SI、DI)的内容以及一些运算符组成。其值表示存储器地址,一般都是段内的偏移地址,因此它也具有段属性、偏移量属性和类型属性。如ES:SI+4(2)运算符和操作符MASM宏汇编中有三种运算符(算术、逻辑和关系运算符)和两种操作符(分析和合成操作符)。如书P146表4-1所示。运算符实现对操作数的相关运算,操作符则完成对操作数属性的定义、调用和修改。第14页,本讲稿共78页算术运算符 算术运算符有、/和MOD等。它们都可用于数值表达式,运算结果是一个数值。在地址表达式中,对标号或变量只可以使用加、减运算符。经常使用的是“标号或变量常量”这种形式。且运算后仍为标号或变量,其类型及段基址属性不变,仅修改了偏移量属性。如,PLACE23是指PLACE字节单元后的第6个存储单元的地址。若PLACE与某存贮单元地址相关,则PLACE+23仍与某存贮单元相关。逻辑运算符实现操作数按位逻辑操作。有AND、OR、XOR和NOT。只适用于数值表达式。注:注:逻辑运算符和逻辑运算指令助记符在符号形式上是一样的,但两者的含义有本质差异。作为运算符时,它们是在程序汇编时由汇编程序计算的,计算结结果充当指令的某一个操作数或构成操作数的部分,逻辑运算符的操作对象只能是整型常量。第15页,本讲稿共78页作为指令助记符时,则是在程序运行中执行的,操作对象还可以是寄存器或存储器操作数。例:AND DX,PORT AND 0FEH运算符汇编时产生一立即数CPU执行时关系运算符关系运算符有EQ、NE、LT、GT、LE和GE。关系运算符的两个操作数必须同是数值或同是一个段内的两个存储器地址。比较时若关系不成立(为假)则结果为“0”,若关系成立(为真)则结果为全“1”。结果值在汇编时获得。例:MOV BX,PORT LT 5 汇编为:MOV BX,0FFFFH(条件成立)或 MOV BX,0000H(条件不成立)第16页,本讲稿共78页分析操作符(数值返回运算符)分析操作符的运算对象是存储器操作数。它返回变量或标号的属性值。合成操作符(修改属性运算符)合成操作符作用于存储器操作数时可以改变它们的属性。(3)运算符和操作符的优先权等级 优优 先先 级级运运算算符符和和操操作作符符高高低低1LENGTH,SIZE,WIDTH,MASH,(),(),2PTR,OFFSET,SEG,TYPE,THIS,段寄存名,段寄存名:(加段前缀加段前缀)3HIGH,LOW,(操作数高、低字节)操作数高、低字节)4,(单目),(单目)5*,/,MOD,SHL,SHR6,(双目),(双目)7EQ,NE,LT,LE,GT,GE8NOT9AND10OR,XOR11SHORT第17页,本讲稿共78页 4.3汇编语言的伪指令语句汇编语言的伪指令语句 指示汇编,链接程序如何进行汇编,链接,影响目标代码生成,本身不产生目标代码。一.符号定义伪指令语句:给表达式赋予一种符号名,以便在程序中使用1.EQU等值语句 格式:符号名 EQU 表达式 例:PORT EQU 40H 注:EQU语句不能重新定义,即在同一源程序中,用EQU定义过的符号不能赋予不同的值。第18页,本讲稿共78页 2.符号语句=格式:符号名 表达式 功能与EQU类似,但可重新定义。例:EMP=60 EMP=EMP+1 EMP=123X4二:数据定义伪指令 用于定义变量,指定变量的类型和名称,并为变量分配内存单 元。1数据定义语句的格式 格式:变量名 数据定义符 操作数,操作数,操作数 操作数是赋给变量的初值,多个相同类型的变量可在一条语句 中定义。第19页,本讲稿共78页 经过定义的变量有3个属性:TYPE,SEGMENT,OFFSET 若某个变量表示的是一个数组,则其类型属性为变量的单个元素 所占用的字节数。常用的数据定义符DB定义字节变量,每个变量占一个字节的存 储单元DW定义字变量,每个变量占两个字节的存储 单元,存放时低对低,高对高DD定义双字变量,每个变量占4个字节的存 储单元,低对低,高对高第20页,本讲稿共78页 2.具体形式和功能(1)为数据项分配存储单元,用变量名作为该存储单元的名称。例:X DB 25H Y DW 4142H Z DD 12345678H 存储形式如图:XYZ12H34H56H78H41H42H25H 初始值也可以是表达式 如:IN_PORTDBPORT_VAL OUT_PORTDBPORT_VAL+1其中,PORT_VAL已由EQU语句赋了值。第21页,本讲稿共78页(2)预留内存单元,但不赋值,以存放运算结果 例:A DB?B DB?(3)定义一个表(数组)例:W_TABLEDW1122H,3344H B_TABLE DB 1,2,4,9,16 当表中的操作数相同时,可用重复操作符DUP来缩写 例:ALL_ZERODB0,0,0,0,0,0 ALL_ZERO DB6 DUP(0)(4)定义字符串(DB)例:MESSAGE DBHELLO 每个字符之值为它的ASCII码值,所以用DB来定义第22页,本讲稿共78页 当字符串长度不超过两个字符时,也可以用DW来定义 例:STRING1 DBAB STRING2 DW AB STRING3 DWAB,CD43H44H41H42H41H42H42H41HSTRING1STRING2STRINGABBABADC存放形式如右图;第23页,本讲稿共78页(5)当操作数是地址表达式时,可用DW或DD伪指令将标号或 变量操作数的偏移地址或全地址来初始化存储器。例:XX DW CYCLE YY DD CYCLE CYCLE:MOV BX,AX ;BX,AX是程序的一个NEAR标号例:VAR3 DW VAR+1;将VAR+1的的偏移地址存入 VAR3开始的两个字节 VAR3 DW VAR+1;存入的是VAR+1的全地址(6)数据定义语句使汇编程序对访问存储器的指令,产生正确的目标代码。第24页,本讲稿共78页 例1:OPER1 DB?,?OPER2 DW?,?MOV OPER1,0;字节0 OPER1 MOV OPER2,0;字 OPER2 对例2,可以如下处置:MOV AX,WORD PTR OPER1+1;AX=3402H MOV AL,BYTE PTR OPER2 ;AL=34H MOV AL,BYTE PTR OPER2+1;AL=12H例2:OPER1 DB 1,2 OPER2 DW 1234H,5678H MOV AX,OPER1 MOV AL,OPER2 这里类型不匹配第25页,本讲稿共78页3.分析操作符和合成操作符 用分析和合成操作符,返回或修改存储器操作数的3种属性 (1)分析操作符 SEG OFFSET TYPE SIZE LENGTH 格式:操作符 标号或变量 SEG OFFSET 返回标号或变量的段地址和偏移地址例:ARRAY DB 100 DUP(0)MOV AX,SEG ARRAY MOV DS,AX MOV BX,OFFSET ARRAY MOV AL,BX第26页,本讲稿共78页 TYPELENGTHSIZE TYPE 返回存储器操作数类型 SIZE 返回TYPE和LENGTH的乘积,表示为变量所分配的字 节存储单元总数 LENGTH返回变量用DUP重复定义的数据项总数-2FAR标号-1NEAR标号4DWORD双字变量2WORD字变量1BYTE字节变量类型值类型属性存储器操作数例:BUFFER1 DB 100 DUP(0)BUFFER2 DW 200 DUP(20H)BUFFER3 DD 100 DUP(13)则 LENGTH BUFFER1=100 LENGTH BUFFER2=200 LENGTH BUFFER3=100注:用LENGTH返回的存储区必须用DUP来定义,否则返回1 第27页,本讲稿共78页(2)合成操作符 PTR LABLE THIS 1、PTR临时修改或指定存储器操作数的类型属性,而保持原有的段,偏移地址属性,且原定义的类型属性不变仅在当前所在的指令中有效格式 类型 PTR 标号或变量例:ARRAY1 DB 0,1,2,3,4 ARRAY2 DW 0,1,2,3,4 MOV BX,WORD PTR ARRAY13 MOV CL,BUTE PTR ARRAY26 MOV WORD PTRSI,4 配合EQU伪指令,还可以为变量ARRAY1和ARRAY2定义新的变量名,如:WBYTE EQU WORD PTR ARRAY1 BWORD EQU BYTE PTR ARRAT2 MOV BX ,WBYTE3 MOV CL ,DWORD6第28页,本讲稿共78页PTR用来指明标号的类型属性时,可确定是段内转移或段间转移 例:INCHES:CMP SUM,100 JMP NEAR PTR INCHES ;段内转移,NEAR PTR 可省略 JMP FAR PTR INCHES 2、LABLE 为当前存储单元定义一个指定类型的标号或变量,用于定义一个数据块或标号,使它们具有多重名字和属性 格式:标号或变量名 LABLE 类型例:WBYTE LABLE WORD;为变量WBYTE定义一个字类型的数 ;据区 ARRAY DB 1,2,3,4 MOV AL,ARRAY;01H AL MOV AX,WBYTE;0201H AX WBYTE、ARRAY 指向同一个数据区,但有不同的类型属性第29页,本讲稿共78页3.THIS 与LABLE结合使用,具有LABLE的同样作用 格式:标号或变量名 EQU THIS 类型例:BWORD EQU THIS BYTE ;定义字节 ARRAY DW 100 DUP(?);定义字将原定义的字缓冲区按字节使用三:程序分段伪指令用于告诉汇编程序和链接程序如何按逻辑段来组织程序和利用存储器具体来说规定段的起始和结束规定属性开始地址边界段类型 同名段如何结合在一起两种段定义简化段定义 ;对MASM5.0以上版本完整段定义 ;对所有版本故只介绍完整段定义第30页,本讲稿共78页1.段定义伪指令 SEGMENT/ENDS 将程序分成段:代码段,数据段,堆栈段,附加段 格式:段名 SEGMENT 定位类型组合属性类别名 段体 段名 ENDS 段名含段的标志符,有段基地址和段内偏移量两个属性,与某个存储单元相联系功能:指出段名和段的各种属性,并表示段的开始和结束位置 (1)定位类型用于告诉链接程序,链接时(多模块.obj)本段首地址的边界定位方式,常有四种:PARA、PAGE、WORD、BYTE 第31页,本讲稿共78页 PARA 段的起始地址必须是16的倍数(XXXX0H),这是一 种默认方式 PAGE 段的起始地址必须是256的倍数(XXX00H),256字节 为一页,在页的起点上 WORD 段的起始地址必须是偶数(XX0B)BYTE 段的起始地址可以是任何地址(2)组合类型 在多模块(每个模块有自己的代码段,数据段,堆栈段)组合时,告诉Link程序本段要与其他模块中同名段的组合链接关系。常有6种:NONE:本段与其他同名段无组合关系,并有自己的段起始地址,这是一种默认方式第32页,本讲稿共78页PUBLIC:在满足定位类型的前提下,LINK程序将其与其他模块中的同名段邻接在一起,共用一个段地址。STACK:同PUBLIC 链接以后作为堆栈段,并初始化SS,SP,若不说明STACK,必须由用户产生。程序的开始地址由指定完成初始化SS,SP。COMMON:各模块中,同名段重叠,覆盖,有着相同的段地址,段长由最长的COMMON段决定。段的内容为所链接的最后一个模块中COMMON段的内容以及没有覆盖到的前面COMMON段的内容。MEMERY:链接在其他所有段的后面(存储器高地址区域),若有多个MEMERY段,则只认第一个,其余按COMMON处理。AT表达式:指定本段存放的段地址(代码段除外)例:AT 0930H 本段从0903H开始存放第33页,本讲稿共78页例:两个模块 模块1:STACK SEGMENTY STACK DW 20 DUP(?)STACK ENDS DATA SEGMENT COMMON DATA ENDS CODE SEGMENT PUBLIC CODE ENDS END(3)类别名 类别名 同名,同类别的段在内存中依序连续存放。典型类别名如STACK、CODE和DATA等,也允许用户使用其它类别名。若缺省类别名,则表明该段类别为空。第34页,本讲稿共78页模块2:STACK SEGMENT STACK DW 30 DUP(?)STACK ENDS DATA SEGMENT COMMON DATA ENDS CODE SEGMENT PUBLIC CODE ENDS END汇编连接后,有:.模块模块1DATA模块模块2代码代码模块模块1代码代码模块模块2DATA设模块设模块2DATA为模块为模块1DATASTACK50个字个字第35页,本讲稿共78页2.段寄存器说明伪指令 格式:ASSUME 段寄存器:段名,段寄存器:段名,指明程序中定义的段用哪一个段寄存器去寻址。并没有真正的将段地址装入段寄存器,段寄存器的初值必须有用户在程序的开始处用MOV指令来设置(CS除外)说明:段定义时用了STACK,系统会自动初始化SS,SP,这时可去掉SS:SP以及代码段中初始化SS,SP的四条语句.CS,IP的初始化由伪指令END MAIN装入,标号MAIN标志程序开始执行的第一条指令地址,只有主程序的结束语句允许带标号.程序中 MOV BL,X MOV ALPHA,BL 因为ASSUME 伪指令的作用,被汇编成:MOV BL,DS:X MOV ES:ALPHA,BL第36页,本讲稿共78页4.指定地址伪指令在汇编程序中,有一个软件计数器(LC)地址计数器,在每个段定义开始处,它被复位为0,然后逐行扫描语句,汇编时,用LC保存当前指令的地址.格式1:ORG 表达式 格式2:ORG$+表达式 功能:强行指定地址计数器的当前值,以改变在它以后的代码或数据存放的起始地址。格式1直接将表达式的值(范围在065535之间)送入程序计数器。格式2将汇编ORG语句前程序计数器的现行值$加上表达式后送入程序计数器。依此值为起点来存放在ORG语句之后的程序或数据,除非遇到一个新的ORG语句。汇编语言中允许用户直接用$来引用地址Reg的值.第37页,本讲稿共78页例1:VECT SEGMENT ORG 10 VECT1 DW 47A5H ORG 20 VECT2 DW 0C956H ORG$+8 (跳过8个字节的存储区)VECT3 DW 0123H 01 23 .C9 56.47 A5102016H+8=1EH14H15H16H1EH第38页,本讲稿共78页例2:ARRAY DW 1,2,$+4,,3,4,$+4 00 82 00 04 00 03 00 7C 00 02 00 010074H0075H 76H 77H 78H 79H 7AH 7BH 7CH 7DH 7EHARRAY 78H+4($+4)7EH+4($+4)第39页,本讲稿共78页例3:DATA SEGMENT ORG 30H DB1 DB 12H,34H ORG$+20H STRING1 DB ABC H COUNT EQU$-STRING1 DATA ENDS H .41H .34H 12H30H31H20HCOUNT第40页,本讲稿共78页四.模块的定义和通信 MASM宏汇编语言提供了模块化编程伪指令,用以实现模块的定义与通信.一个任务的源程序由若干模块组成,每个模块有代码段,数据段,对应一个.ASM,是个独立的编译单位.当各个模块编译完毕,可用LINK连接各模块形成一个完整的可执行程序.1.模块的定义:NAME 模块名 END 标号 主模块要跟标号,子模块不跟标号2.模块间的通信 实现模块间的数据或过程 的互访和共享。格式:PUBLIC名字,名字,EXTRN名字:类型,名字:类型,其中,名字可以是标号、变量名、过程名或由EQU(或)伪指令定义的符号名。第41页,本讲稿共78页五过程和宏定义伪指令 过程和宏是模块化程序设计的基础.汇编语言中引用定义过程和宏的方法来实现按模块 程序代码的功能.1.过程定义伪指令 过程:一段可以由CALL指令调用,用RET返回的程序 格式:过程名 PROCNEAR/FAR RET RET 过程名 ENDP 类型可以是BYTE、WORD、DWORD、NEAR、FAR和ABS等 PUBLIC 和EXTERN配对使用,由PUBLIC 说明的名字是全局的,可以在其他模块中使用,EXTERN表明本模块中使用的名字在别的模块中定义过,类型一致.第42页,本讲稿共78页2.宏定义伪指令 宏定义:将程序段定义为一条指令。格式:宏指令名MACRO形参,形参 :;ENDM 宏调用格式:宏指令名实参,实参功能:定义一个过程,并指出过程名及过程的属性 过程的属性有NEAR,FAR NEAR过程只能被定义该过程的段中的其他过程调用(段内调用)FAR过程可由任何段中的程序调用(段间调用)缺省时为NEAR 根据过程的属性,汇编程序自动对CALL,RET翻译成段内(段间)调用及段内(段间)返回的目标代码。第43页,本讲稿共78页宏调用:在源程序中用宏指令代替所定义的程序段。宏扩展:汇编时,将相应的程序段每条语句前冠以“t”,代替宏指令 以产生目标代码。3.过程与 宏的区别 对重复使用的模块既可定义为过程,也可定义为宏。过程汇编成机器代码,程序中只对CALL指令汇编(1)宏:由汇编程序识别,并将宏译代码插入 过程:汇编时仅产生CALL指令代码,过程代码在程序执行时 完成。(2)宏可以直接传递参数。但过程传递参数的编程困难。(3)宏不减少空间开销。而过程可减少空间开销。(4)时间上,宏不增加时间开销,但过程增加时间开销。(5)宏体可以入库,可方便地使用其它程序中地宏体。第44页,本讲稿共78页七 条件汇编条件汇编伪指令可使汇编程序根据某种条件有选择地对源程序中的某部分语句进行汇编处理。格式:IF 条件表达式 ;ELSE ;ENDIF第45页,本讲稿共78页4.4 4.4 汇编语言程序设计基础汇编语言程序设计基础 本节将介绍汇编语言程序设计的常用结构与方法。4.4.1 4.4.1 程序设计的基本过程程序设计的基本过程一、程序设计的一般步骤一、程序设计的一般步骤汇编语言程序设计基本上与高级语言程序设计一样,一般步骤:1分析问题并抽象出数学模型。2确定解决此数学模型的算法。3画出程序结构框图和流程图。4分配内存工作单元和寄存器。5编程并调试。二、评价程序质量的标准二、评价程序质量的标准1、合理组织数据,发挥存贮器、Reg的作用。2、程序逻辑结构好,便于二次开发。3、可读性强。4、高可读性和可维护性。5、效率高(代码少)。第46页,本讲稿共78页4 4、4 4、2 2 程序的基本结构程序的基本结构一、顺序结构一、顺序结构 对应简单程序,顺序执行,无转移、无循环。二、分支结构二、分支结构 依据不同条件分支到各程序段,有双分支和多分支两种。三、循环结构三、循环结构 实现那些需要重复做的工作。三种基本结构奠定了实现任何复杂程序的基础。第47页,本讲稿共78页分支结构分支结构两个分支两个分支YN、CMPAL,BLJGgreatJMPexitgreat:exit:、ALBL处理处理AL BL处理处理顺序结构顺序结构第48页,本讲稿共78页分支结构分支结构三个分支三个分支、CMPAL,0JGgreatJLlessJMPexitless:JMPexitgreat:exit:、AL=0处理处理AL0处理处理AL0处理处理第49页,本讲稿共78页循环结构循环结构循环初始设置循环初始设置循环体循环体循环条件判断循环条件判断?YN当型循环当型循环(当条件成立进入循环当条件成立进入循环)YN循环初始设置循环初始设置循环体循环体循环条件判断循环条件判断?直到型循环直到型循环(直到条件成立退出循环直到条件成立退出循环)第50页,本讲稿共78页4 4、4 4、3 3 程序设计基本方法程序设计基本方法二、分支结构程序的设计 设计分支程序的关键是 如何判断分支的条件 如何实现分支结构1、利用比较和转移指令实现分支、利用比较和转移指令实现分支 利用比较和转移指令实现分支程序设计的方法,是在需要分支的地方用比较指令CMP、串比较指令CMPS或串搜索指令SCAS等顺序进行分支条件的比较判断,然后利用各种条件转移指令实现分支。一、顺序结构程序设计 按事件发展的先后,选择合适的指令有序地加以组合。书P167 例1第51页,本讲稿共78页例:P169 例1例:P169 例2数据块传送 1、不重叠CLD,直接用MOVS或MOV 2、源首址加数据块长度目标首址,CLD 重叠 增量传送 源首址加数据块长度目标首址,STD 减量传送2、利用跳转表实现分支、利用跳转表实现分支 多用于多路分支 跳转地址(各子程序入口地址)跳转表的组成 跳转指令(转向子程序的转移指令)关键字 根据表内地址分支方法是:将需要分支的各子程序入口地址按照一定的顺序存放在第52页,本讲稿共78页内存区域中,若主程序需要转去执行某个子程序,可以根据一定的算法计算出该子程序地址在跳转表中的位置,从而得到相应子程序的入口地址,然后用JMP指令转去执行。若是段内分支,每个地址在表内占2个单元(IP的值),若是段间分支,每个地址占4个单元(CS:IP的值)。例:P170 子程序入口地址的地址子程序入口地址的地址=表基地址(表基地址(BASEBASE)+(产品编号)(产品编号)22程序见P171、根据表内指令分支 该表称为命令表,命令表存放在代码段。通常每三个单元存放一条转移指令(设JMP是三字节指令)。只要能寻址到跳转表相应的项,即可执行转至某子程序的JMP指令,实现程序的转移。例、P172 BX=表基地址表基地址+编号编号3 第53页,本讲稿共78页三、循环结构程序设计1循环程序的组成循环程序的组成循环程序是在满足某些条件时对一段程序的重复执行,一般由四 部分组成。参数初始化工作部分参数修改YN(a)先执行后判断控制部分循环结束?(b)先判断后执行参数初始化控制部分循环结束吗?工作部分修改部分YN第54页,本讲稿共78页2、基本结构形式、基本结构形式 先执行后判断(dowhile)至少进入一次循环体。常用于循环次数已知时。例:P173 先判断后执行 不满足条件则不执行循环体,这时循环体可一次都不执行。常用于循环体次数未知,根据具体情况找出控制循环体结束的条件时常用。例:P173 例2 控制循环体的条件是:当AX内容为全0,不必再继续统计。3、循环控制方法循环控制方法 每个循环程序必须选择一个循环控制条件来控制循环的运行和结束。常用循环控制条件(方法):(1)计数控制循环次数已知,每循环一次加/减1。例1(2)条件控制循环次数未知,须根据条件真假控制循环。例2第55页,本讲稿共78页(3)状态控制根据事先设置或实时检测的状态来控制循环。(4)逻辑尺控制在多次循环过程中需分别做不同的操作时,可通过建立位串(逻辑尺)控制循环。P174 例3(同学自看)4、多重循环程序设计、多重循环程序设计第56页,本讲稿共78页4.4.4子程序设计与调用技术子程序设计与调用技术 子程序(或过程)是程序的一部分,是完成特定功能的程序段,它能在程序中任何地方被调用执行。使用子程序是程序设计的一种重要方法,常在以下情况中使用子程序。(1)多次重复使用的程序段可定义为子程序。这样可有效地简化程序的编制,缩短程序的长度,从而节省磁盘或内存空间。(2)具有通用性、便于共享的程序段可定义为子程序。例如代码转换、键盘处理等。(3)中断处理程序一定是子程序。因为中断的发生是随机的、不可预料的,所以对中断的处理只能编制成子程序的形式。当中断发生时,转去它完成相应的功能。第57页,本讲稿共78页1与子程序有关的术语(1)子子程程序序嵌嵌套套:子程序中调用别的子程序称为嵌套,只要堆栈空间允许,嵌套层次不限。(2)子程序递归调用子程序递归调用:子程序调用该子程序本身称为递归调用子程序中断在中断程序中又调用子程序2、子程序文件由子程序的说明文挡和子程序本身构成。(4)可重定位子程序可重定位子程序:全部采用相对地址、可重定位在内存任 意区域的子程序。(3)可重入子程序可重入子程序:能够被中断并可再次被中断程序调用的子 程序。第58页,本讲稿共78页子程序文档子程序文档:(1)功能描述。包括子程序的名称、功能、性能指 标(如执行时间)等。(2)子程序的入口、出口参数。(3)所用寄存器和存储单元。(4)子程序中又调用的其它子程序。(5)调用实例(可有可无)。例:有一子程序说明如下:;子程序DTOB ;将两位10(BCD码)转换成2 ;入口参数:ALReg中存放10 ;出口参数:CLReg中存放转换完的2 ;所用Reg:BX ;执行时间:0.06ms 子程序常以过程形式存放在代码段,通常以一个标号开始,以RET指令结束。第59页,本讲稿共78页例:DTOB PROC RET DTOB ENDP 子程序标准格式二、子程序设计中的问题1主程序与子程序的连接主程序与子程序的连接 子程序以过程的形式存放在代码段。当主程序与子程序在同一代码段,为段内调用段内调用;若主程序与子程序各在不同的代码段,为段间调用段间调用。CALL:段点保护,转子程序 RET:段点恢复 2、现场的保护与恢复、现场的保护与恢复 用成对的PUSH、POP指令保护主程序与子程序中都要用到的Reg及mem 第60页,本讲稿共78页方法一:PUSH BX PUSH CX CALL PROC-1 POP CX POP BX方法二:.PROC-1 PROC.PUSH BX.PUSH CX CALLPROC-1.POP CX.POP BX.RET PROC-1 ENDP常用第二种方法保护和恢复现场。对中断子程序必须用第二种方法。3、主、子程序之间的参数传递、主、子程序之间的参数传递 入、出口参数即传给子程序的参