微机电子教程 第四章汇编程序设计_第1页
微机电子教程 第四章汇编程序设计_第2页
微机电子教程 第四章汇编程序设计_第3页
微机电子教程 第四章汇编程序设计_第4页
微机电子教程 第四章汇编程序设计_第5页
已阅读5页,还剩73页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

微机电子教程第四章汇编程序设计第1页,课件共78页,创作于2023年2月②这样的程序占用内存空间少、执行速度快。所以,汇编语言多用来编写计算机系统程序、实时通信程序、实时控制程序等,也可被各种高级语言所嵌用。

2、几种汇编在IBMPC微机上流行的汇编程序是微软公司的小汇编(ASM)和宏汇编(MASM)两种。(还有TASM、OPTASM)计算机中完成汇编任务的程序被称为汇编程序(ASSEMBLER)它可以:①将汇编语言源程序翻译成机器语言程序②能够根据用户要求自动分配存储区域(包括程序区、数据区等);③自动地把各种进制数转换成二进制数;④把字符转换成ASCII码;⑤计算表达式的值;⑥自动对源程序进行检查,给出错误信息(如非法格式、未定义的助记符、标号、漏掉操作数等)等

第2页,课件共78页,创作于2023年2月上机环境硬件系统软件

应用软件

操作系统:DOS系统编辑器:EDIT.exe编程序:MASM.exe连接程序:LINK.exe调试程序:DEBUG.exe用户开发的程序:ABC.exe等CPU、存储器(ROM、RAM)、I/O接口、输入、输出设备3、汇编语言程序上机处理过程第3页,课件共78页,创作于2023年2月

汇编语言上机过程D:>EDITABC.asmD:>MASMABC;有语法错,回EDIT下改该程序D:>LINKABC;有错,回在EDIT下改程序D:>ABC运行结果错,回EDIT下改程序或在DEBUG下调试,找原因。D:>DEBUGABC.exe编辑源程序

EDITABC.ASM汇编源程序

MASM

ABC.ASM形成目标程序ABC.OBJ连接目标程序

LINKABC.OBJ有连接错误信息?形成可执行程序

ABC.EXE装入可执行程序到内存,并执行D:\>sub>ABC下一程序用DEBUG调试可执行程序D:\>sub>DEBUG

ABC.EXE找到原因YNYNNYN有汇编错误信息?Y运行结果正确?用DEBUG调试程序查错?第4页,课件共78页,创作于2023年2月4.2汇编语言的程序结构与语句格式4.2.1汇编语言源程序的框架结构(书P141)一、源程序的结构特点

1、由若干个逻辑段组成,各逻辑段都有一个段名,由段定义语句(伪指令语句)来定义和说明。

源程序中一般具有代码段、堆栈段、数据段和附加数据段。

代码段是必不可少的。

数据段或附加段用来在内存中建立一个适当容量的工作区用以存放常数和变量,并作为算术运算或I/O接口传送数据的工作区等。

堆栈段则在内存中建立一个堆栈区,以便在中断和子程序(或过程)调用及各模块间传递参数时使用。第5页,课件共78页,创作于2023年2月

8086/8088/80286只允许同时使用4种类型的段:代码段(CS)、堆栈段(SS)、数据段(DS)和附加段(ES)。80386/80486和Pentium系列允许同时使用6种段,除以上4种段外,还可有FS和GS两个附加数据段。在8086/8088和实地址方式下,每个段的最大长度均为64KB;而在保护方式下,80286允许每个段的最大长度为16MB,80386/80486和Pentium系列允许4GB。在一个源程序中每种类型的段又可存在若干个,如几个数据段2、在代码段起始处,用ASSUME说明各个段寄存器与逻辑段的关系,并在程序开始处设置段寄存器的初值(代码段CS除外)。3、每段由若干语句行组成,每行只能写一条语句,允许续行。整个源程序必须以END来标志执行的结束。在END后的标号START表示程序中运行第一条指令的起始地址。4、每条语句由4个字段构成。各字段间用空格分开。5、每个源程序中必须含有返回DOS的指令语句,以便返回DOS继续键入命令。如:标准序法。第6页,课件共78页,创作于2023年2月二、源程序与PCDOS的接口汇编语言源程序经过汇编转变为目标程序,当用链接程序对其作进行链接和定位时,操作系统完成:

1、为每个用户程序分配一个256字节的程序段前缀区(PSP),主要存放用户程序信息。

在PSP的开始处(偏移地址0000H)安排一条INT20H软中断指令。该程序的功能是使系统返回到DOS管理状态。因此,用户在组织程序时,必须使程序执行完后能够转去执行存放于PSP开始处的INT20H指令。2、定位用户程序。3、设置DS和ES的值,使之指向PSP的开始处,即PSP的首地址。4、将CS设置为用户程序的段基址,IP为程序执行时的第一个地址,设置SS、SP。5、运行用户程序。第7页,课件共78页,创作于2023年2月保证用户程序执行完后返回DOS:

第一种方法:标准序法:

①将用户程序中的主程序定义为FAR过程,其最后一条指令为RET;当程序执行到RET时,会将栈顶的两个字分别送IP、CS。②在主程序的开始处将PSP所在段的段地址DS(或ES)保存进栈,然后再将一个全0的字(PSP的段内偏移地址)压入堆栈。这就是程序结构中的以下三条指令:PUSH DS ;保护PSP段地址MOV AX,0 ;保护偏移0地址PUSH AX当用户程序返回时,会返回到DOS,执行INT21H注:由于DS、ES由DOS已设置,所以在用户程序的开始处应重新设置DS、ES。第二种方法:非标准方法:不定义主程序为FAR过程并去掉标准序部分,只在代码段结束之前(即CODEENDS之前)增加两句:MOV AH,4CHINT 21H第8页,课件共78页,创作于2023年2月4、2、2汇编语言的语句一、语句的种类与格式1、语句的种类⑴指令语句:可执行语句,与CPU指令系统的指令相对应,汇编程序为之产生一一对应的机器代码。

例:MOV AH,4CH

例:伪指令语句MESSAGEDB‘THISISASAMPLEPROGRAM.’;定义变量MESSAGE在数据段DATA中的存放形式。汇编时,;汇编程序将MESSAGE定义为一个字节类型数据区的首地址,;并按字节存储字符串信息。⑵伪指令语句:CPU不执行的语句,只是汇编时给汇编程序提供汇编信息,如定义符号、分配存储单元、将程序分段等。它本身并不产生目标代码,所以是指示性语句。第9页,课件共78页,创作于2023年2月⑶宏指令语句:是以某个宏名字定义的一段指令序列。汇编时,凡有宏指令语句的地方都将用相应的指令序列的目标代码插入。宏指令语句是一般性指令语句的扩展。2、语句格式指令语句的一般格式为:[标号:] [前缀]指令助记符

[操作数] [;注释]伪指令语句的格式为:[名字] 伪指令定义符

[操作数] [;注释]①标号和名字

标号代表指令所在存储单元的符号地址。后跟冒号,在程序中作为转移(JMP)、调用(CALL)和循环(LOOP)指令的转移目标,与具体的指令地址相联系。伪指令语句的名字一般用于定义常量名、变量名、过程名、段名等。

标号和名字必须符合汇编语言对标识符的规定:第10页,课件共78页,创作于2023年2月以字母开头,由字母(A~Z或a~z,汇编程序不区分大小写)、数字(0~9)及部分特殊字符(?、@、$和下划线_等)组成的字符串表示,字符串长度不能超过31个。标识符不能是汇编语言中有特定意义的保留字,如:CPU的内部寄存器名AH、AL、AX等。②助记符、定义符规定指令或伪指令的操作功能,是语句中唯一不可缺少的部分。

前缀仅可出现在指令助记符前。③操作数指令语句中提供指令的操作对象、存放位置。伪指令语句中操作数的格式和含义随伪操作指令不同而不同。操作数可以是一个或2个或0个(INCBX,PUSHAX;MOVAX,DATA;RET,HLT,NOP,CLD)

④注释以“;”开始,给以编程说明。第11页,课件共78页,创作于2023年2月二、语句中的操作数1、常量操作数

——在运行期间不变化的量:立即数、端口地址。常用有:2﹟(B),10﹟(D),8﹟(Q),16﹟(H)的整型常量,字符串常量。凡数字在A—F之间且在最高位,必须加前缀0字符串常量是用单引号括起来的一个或多个字符,其值为字符的ASCII代码值。例:‘A’=41H‘AB’=4142H2、Reg操作数操作数部分是寄存器名,如:AX、SI和DS等3、存贮器操作数有标号与变量两种。⑴标号:与指令地址相关联,或某个过程起点位置

在代码段内相关联。⑵变量:存放在存贮单元中的值,变量常以变量名的形式出现在程序中。第12页,课件共78页,创作于2023年2月在数据段或堆栈段中,是存放数据的存放单元的符号地址,与各种寻址方式有关(存贮器操作数寻址方式)标号和变量都与存储器地址相关联,都具有以下三种属性:·段属性(SEGMENT)――段基址,即标号或变量所在段的段地址·偏移量属性(OFFSET)――段内偏移地址,即标号或变量所在的地址与所在段的段起始地址之差。·类型属性(TYPE)――变量的类型是指变量存取单位的字节数大小类型有字节(BYTE)、字(WORD)、双字(DWORD)、四字、十字节5种。标号的类型则指标号与使用它的指令之间的距离远近。当标号作为转移指令或调用指令的目标操作数时,若是段内的转移和调用,这个标号的类型属性为NEAR;若是段间的转移和调用,标号的类型属性为FAR。第13页,课件共78页,创作于2023年2月4、表达式操作数

表达式由各种操作数、运算符和操作符组成。(1)汇编语言中表达式有两类数值表达式:由数值常量、字符串常量或符号常量等与算术、逻辑或关系运算符连接而成。在汇编时产生一个数值。地址表达式:由常量、变量、标号、寄存器(如BX、BP、SI、DI)的内容以及一些运算符组成。其值表示存储器地址,一般都是段内的偏移地址,因此它也具有段属性、偏移量属性和类型属性。如ES:[SI+4](2)运算符和操作符MASM宏汇编中有三种运算符(算术、逻辑和关系运算符)和两种操作符(分析和合成操作符)。如书P146表4-1所示。运算符实现对操作数的相关运算,操作符则完成对操作数属性的定义、调用和修改。第14页,课件共78页,创作于2023年2月①算术运算符算术运算符有+、-、×、/和MOD等。它们都可用于数值表达式,运算结果是一个数值。在地址表达式中,对标号或变量只可以使用加、减运算符。经常使用的是“标号或变量±常量”这种形式。且运算后仍为标号或变量,其类型及段基址属性不变,仅修改了偏移量属性。如,PLACE+2×3是指PLACE字节单元后的第6个存储单元的地址。若PLACE与某存贮单元地址相关,则PLACE+2×3仍与某存贮单元相关。②逻辑运算符——实现操作数按位逻辑操作。有AND、OR、XOR和NOT。只适用于数值表达式。注:逻辑运算符和逻辑运算指令助记符在符号形式上是一样的,但两者的含义有本质差异。作为运算符时,它们是在程序汇编时由汇编程序计算的,计算结结果充当指令的某一个操作数或构成操作数的部分,逻辑运算符的操作对象只能是整型常量。第15页,课件共78页,创作于2023年2月作为指令助记符时,则是在程序运行中执行的,操作对象还可以是寄存器或存储器操作数。

例:ANDDX,PORTAND0FEH运算符汇编时产生一立即数CPU执行时③关系运算符关系运算符有EQ、NE、LT、GT、LE和GE。关系运算符的两个操作数必须同是数值或同是一个段内的两个存储器地址。比较时若关系不成立(为假)则结果为“0”,若关系成立(为真)则结果为全“1”。结果值在汇编时获得。例:MOVBX,PORTLT5汇编为:MOVBX,0FFFFH(条件成立)或MOVBX,0000H(条件不成立)第16页,课件共78页,创作于2023年2月④分析操作符(数值返回运算符)分析操作符的运算对象是存储器操作数。它返回变量或标号的属性值。⑤合成操作符(修改属性运算符)合成操作符作用于存储器操作数时可以改变它们的属性。(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页,创作于2023年2月

4.3

汇编语言的伪指令语句指示汇编,链接程序如何进行汇编,链接,影响目标代码生成,本身不产生目标代码。

一.符号定义伪指令语句:——给表达式赋予一种符号名,以便在程序中使用1.EQU等值语句格式:符号名EQU表达式

例:PORTEQU40H

注:EQU语句不能重新定义,即在同一源程序中,用EQU定义过的符号不能赋予不同的值。第18页,课件共78页,创作于2023年2月

2.符号语句=格式:符号名

表达式功能与EQU类似,但可重新定义。

例:EMP=60EMP=EMP+1EMP=123X4二:数据定义伪指令用于定义变量,指定变量的类型和名称,并为变量分配内存单元。

1.数据定义语句的格式格式:[变量名]数据定义符操作数[,操作数]…[,操作数]操作数是赋给变量的初值,多个相同类型的变量可在一条语句中定义。第19页,课件共78页,创作于2023年2月经过定义的变量有3个属性:TYPE,SEGMENT,OFFSET若某个变量表示的是一个数组,则其类型属性为变量的单个元素所占用的字节数。常用的数据定义符DB——定义字节变量,每个变量占一个字节的存储单元DW——定义字变量,每个变量占两个字节的存储单元,存放时低对低,高对高DD——定义双字变量,每个变量占4个字节的存储单元,低对低,高对高第20页,课件共78页,创作于2023年2月

2.具体形式和功能(1)为数据项分配存储单元,用变量名作为该存储单元的名称。

例:X DB 25H YDW 4142H ZDD 12345678H 存储形式如图:XYZ12H34H56H78H41H42H25H初始值也可以是表达式如:IN_PORT DB PORT_VALOUT_PORT DB PORT_VAL+1其中,PORT_VAL已由EQU语句赋了值。第21页,课件共78页,创作于2023年2月(2)预留内存单元,但不赋值,以存放运算结果

例:ADB?BDB?(3)定义一个表(数组)

例:W_TABLE DW 1122H,3344HB_TABLEDB1,2,4,9,16

当表中的操作数相同时,可用重复操作符DUP来缩写

例:ALL_ZERO DB 0,0,0,0,0,0ALL_ZERO DB 6DUP(0)(4)定义字符串(DB)

例:MESSAGE DB ‘HELLO’每个字符之值为它的ASCII码值,所以用DB来定义第22页,课件共78页,创作于2023年2月当字符串长度不超过两个字符时,也可以用DW来定义

例:

STRING1

DB ‘AB’STRING2

DW ‘AB’STRING3

DW ‘AB’,‘CD’43H44H41H42H41H42H42H41HSTRING1STRING2STRINGABBABADC存放形式如右图;第23页,课件共78页,创作于2023年2月(5)当操作数是地址表达式时,可用DW或DD伪指令将标号或变量操作数的偏移地址或全地址来初始化存储器。

例:XXDWCYCLE

YYDDCYCLE

…CYCLE:MOVBX,AX;BX,AX是程序的一个NEAR标号例:VAR3DWVAR+1;将VAR+1的的偏移地址存入VAR3开始的两个字节VAR3DWVAR+1;存入的是VAR+1的全地址(6)数据定义语句使汇编程序对访问存储器的指令,产生正确的目标代码。第24页,课件共78页,创作于2023年2月

例1:OPER1DB?,?OPER2DW?,?

MOVOPER1,0;字节0OPER1MOVOPER2,0;字 OPER2对例2,可以如下处置:MOVAX,WORDPTROPER1+1;AX=3402HMOVAL,BYTEPTROPER2;AL=34HMOVAL,BYTEPTROPER2+1;AL=12H例2:OPER1DB1,2OPER2DW1234H,5678H…MOVAX,OPER1MOVAL,OPER2这里类型不匹配第25页,课件共78页,创作于2023年2月3.分析操作符和合成操作符用分析和合成操作符,返回或修改存储器操作数的3种属性

(1)分析操作符

SEGOFFSETTYPESIZELENGTH格式:操作符标号或变量①SEGOFFSET返回标号或变量的段地址和偏移地址例:ARRAYDB100DUP(0)…MOVAX,SEGARRAYMOVDS,AXMOVBX,OFFSETARRAYMOVAL,[BX]第26页,课件共78页,创作于2023年2月②TYPELENGTHSIZE

TYPE—返回存储器操作数类型SIZE——返回TYPE和LENGTH的乘积,表示为变量所分配的字节存储单元总数LENGTH——返回变量用DUP重复定义的数据项总数-2FAR标号-1NEAR标号4DWORD双字变量2WORD字变量1BYTE字节变量类型值类型属性存储器操作数例:BUFFER1DB100DUP(0)BUFFER2DW200DUP(20H)BUFFER3DD100DUP(13)则LENGTHBUFFER1=100LENGTHBUFFER2=200LENGTHBUFFER3=100注:用LENGTH返回的存储区必须用DUP来定义,否则返回1第27页,课件共78页,创作于2023年2月

(2)合成操作符PTRLABLETHIS1、PTR——临时修改或指定存储器操作数的类型属性,而保持原有的段,偏移地址属性,且原定义的类型属性不变仅在当前所在的指令中有效格式类型PTR标号或变量例:ARRAY1DB0,1,2,3,4ARRAY2DW0,1,2,3,4MOVBX,WORDPTRARRAY1[3]MOVCL,BUTEPTRARRAY2[6]MOVWORDPTR[SI],4配合EQU伪指令,还可以为变量ARRAY1和ARRAY2定义新的变量名,如:WBYTEEQUWORDPTRARRAY1BWORDEQUBYTEPTRARRAT2MOVBX,WBYTE[3]MOVCL,DWORD[6]第28页,课件共78页,创作于2023年2月PTR用来指明标号的类型属性时,可确定是段内转移或段间转移

例:INCHES:CMPSUM,100…JMPNEARPTRINCHES;段内转移,NEARPTR可省略…JMPFARPTRINCHES2、LABLE为当前存储单元定义一个指定类型的标号或变量,用于定义一个数据块或标号,使它们具有多重名字和属性

格式:标号或变量名LABLE类型例:

WBYTELABLEWORD;为变量WBYTE定义一个字类型的数;据区ARRAYDB1,2,3,4MOVAL,ARRAY;01HALMOVAX,WBYTE;0201HAX

WBYTE、ARRAY指向同一个数据区,但有不同的类型属性第29页,课件共78页,创作于2023年2月3.THIS与LABLE结合使用,具有LABLE的同样作用

格式:标号或变量名EQUTHIS类型例:BWORDEQUTHISBYTE;定义字节ARRAYDW100DUP(?);定义字将原定义的字缓冲区按字节使用三:程序分段伪指令——用于告诉汇编程序和链接程序如何按逻辑段来组织程序和利用存储器具体来说规定段的起始和结束规定属性开始地址边界段类型同名段如何结合在一起两种段定义简化段定义;对MASM5.0以上版本完整段定义;对所有版本故只介绍完整段定义第30页,课件共78页,创作于2023年2月1.段定义伪指令SEGMENT/ENDS——将程序分成段:代码段,数据段,堆栈段,附加段格式:段名SEGMENT[定位类型][组合属性][‘类别名’]…段体…段名ENDS段名含段的标志符,有段基地址和段内偏移量两个属性,与某个存储单元相联系功能:指出段名和段的各种属性,并表示段的开始和结束位置(1)定位类型——用于告诉链接程序,链接时(多模块.obj)本段首地址的边界定位方式,常有四种:PARA、PAGE、WORD、BYTE第31页,课件共78页,创作于2023年2月①PARA段的起始地址必须是16的倍数(XXXX0H),这是一种默认方式②PAGE段的起始地址必须是256的倍数(XXX00H),256字节为一页,在页的起点上③WORD段的起始地址必须是偶数(XX…0B)④BYTE段的起始地址可以是任何地址(2)组合类型在多模块(每个模块有自己的代码段,数据段,堆栈段)组合时,告诉Link程序本段要与其他模块中同名段的组合链接关系。常有6种:①NONE:本段与其他同名段无组合关系,并有自己的段起始地址,——这是一种默认方式第32页,课件共78页,创作于2023年2月②PUBLIC:在满足定位类型的前提下,LINK程序将其与其他模块中的同名段邻接在一起,共用一个段地址。③STACK:同PUBLIC链接以后作为堆栈段,并初始化SS,SP,若不说明STACK,必须由用户产生。程序的开始地址由指定完成初始化SS,SP。④COMMON:各模块中,同名段重叠,覆盖,有着相同的段地址,段长由最长的COMMON段决定。段的内容为所链接的最后一个模块中COMMON段的内容以及没有覆盖到的前面COMMON段的内容。⑤MEMERY:链接在其他所有段的后面(存储器高地址区域),若有多个MEMERY段,则只认第一个,其余按COMMON处理。⑥AT表达式:指定本段存放的段地址(代码段除外)

例:AT0930H本段从0903H开始存放第33页,课件共78页,创作于2023年2月例:两个模块模块1:STACKSEGMENTYSTACKDW20DUP(?)STACKENDSDATASEGMENTCOMMON

……DATAENDSCODESEGMENTPUBLIC

……CODEENDSEND(3)类别名‘类别名’同名,同类别的段在内存中依序连续存放。典型类别名如‘STACK’、‘CODE’和‘DATA’等,也允许用户使用其它类别名。若缺省‘类别名’,则表明该段类别为空。第34页,课件共78页,创作于2023年2月模块2:STACKSEGMENTSTACKDW30DUP(?)STACKENDSDATASEGMENTCOMMON

……DATAENDSCODESEGMENTPUBLIC

……CODEENDSEND汇编连接后,有:.........模块1DATA模块2代码模块1代码模块2DATA设模块2DATA为模块1DATASTACK50个字第35页,课件共78页,创作于2023年2月2.段寄存器说明伪指令

格式:ASSUME段寄存器:段名[,段寄存器:段名,…]①指明程序中定义的段用哪一个段寄存器去寻址。②并没有真正的将段地址装入段寄存器,段寄存器的初值必须有用户在程序的开始处用MOV指令来设置(CS除外)说明:①段定义时用了STACK,系统会自动初始化SS,SP,这时可去掉SS:SP以及代码段中初始化SS,SP的四条语句.②CS,IP的初始化由伪指令ENDMAIN装入,标号MAIN标志程序开始执行的第一条指令地址,只有主程序的结束语句允许带标号.③程序中MOVBL,XMOVALPHA,BL因为ASSUME伪指令的作用,被汇编成:MOVBL,DS:XMOVES:ALPHA,BL第36页,课件共78页,创作于2023年2月4.指定地址伪指令在汇编程序中,有一个软件计数器(LC)地址计数器,在每个段定义开始处,它被复位为0,然后逐行扫描语句,汇编时,用LC保存当前指令的地址.格式1:ORG表达式格式2:ORG$+表达式功能:强行指定地址计数器的当前值,以改变在它以后的代码或数据存放的起始地址。格式1直接将表达式的值(范围在0~65535之间)送入程序计数器。格式2将汇编ORG语句前程序计数器的现行值$加上表达式后送入程序计数器。依此值为起点来存放在ORG语句之后的程序或数据,除非遇到一个新的ORG语句。

汇编语言中允许用户直接用$来引用地址Reg的值.第37页,课件共78页,创作于2023年2月例1:VECTSEGMENTORG10VECT1DW47A5HORG20VECT2DW0C956HORG$+8(跳过8个字节的存储区)VECT3DW0123H

01

23

...

C9

56...

47

A5102016H+8=1EH14H15H16H1EH第38页,课件共78页,创作于2023年2月例2:ARRAYDW1,2,$+4,,3,4,$+4008200040003007C000200

010074H0075H76H 77H78H79H7AH7BH7CH7DH7EHARRAY78H+4($+4)7EH+4($+4)第39页,课件共78页,创作于2023年2月例3:DATASEGMENTORG30HDB1DB12H,34HORG$+20HSTRING1DB‘ABC…H’COUNTEQU$-STRING1DATAENDS

‘H’...

41H...

34H

12H30H31H20HCOUNT第40页,课件共78页,创作于2023年2月四.模块的定义和通信

MASM宏汇编语言提供了模块化编程伪指令,用以实现模块的定义与通信.一个任务的源程序由若干模块组成,每个模块有代码段,数据段,对应一个.ASM,是个独立的编译单位.当各个模块编译完毕,可用LINK连接各模块形成一个完整的可执行程序.1.模块的定义:NAME模块名……END[标号]主模块要跟标号,子模块不跟标号2.模块间的通信实现模块间的数据或过程的互访和共享。格式:PUBLIC 名字[,名字,…]EXTRN 名字:类型[,名字:类型,…]其中,名字可以是标号、变量名、过程名或由EQU(或=)伪指令定义的符号名。第41页,课件共78页,创作于2023年2月过程和宏定义伪指令过程和宏是模块化程序设计的基础.汇编语言中引用定义过程和宏的方法来实现按模块程序代码的功能.

1.过程定义伪指令过程:一段可以由CALL指令调用,用RET返回的程序格式:过程名 PROC [NEAR]/FAR…[RET]… RET过程名 ENDP类型可以是BYTE、WORD、DWORD、NEAR、FAR和ABS等PUBLIC和EXTERN配对使用,由PUBLIC说明的名字是全局的,可以在其他模块中使用,EXTERN表明本模块中使用的名字在别的模块中定义过,类型一致.第42页,课件共78页,创作于2023年2月2.宏定义伪指令宏定义:将程序段定义为一条指令。格式:宏指令名 MACRO [形参,形参…] : ;ENDM宏调用格式: 宏指令名 [实参,实参…]功能:定义一个过程,并指出过程名及过程的属性①过程的属性有NEAR,FARNEAR过程只能被定义该过程的段中的其他过程调用(段内调用)FAR过程可由任何段中的程序调用(段间调用)缺省时为NEAR②根据过程的属性,汇编程序自动对CALL,RET翻译成段内(段间)调用及段内(段间)返回的目标代码。第43页,课件共78页,创作于2023年2月宏调用:在源程序中用宏指令代替所定义的程序段。宏扩展:汇编时,将相应的程序段每条语句前冠以“t”,代替宏指令以产生目标代码。3.过程与宏的区别

对重复使用的模块既可定义为过程,也可定义为宏。过程汇编成机器代码,程序中只对CALL指令汇编(1)宏:由汇编程序识别,并将宏译代码插入过程:汇编时仅产生CALL指令代码,过程代码在程序执行时完成。(2)宏可以直接传递参数。但过程传递参数的编程困难。(3)宏不减少空间开销。而过程可减少空间开销。(4)时间上,宏不增加时间开销,但过程增加时间开销。(5)宏体可以入库,可方便地使用其它程序中地宏体。第44页,课件共78页,创作于2023年2月七条件汇编条件汇编伪指令可使汇编程序根据某种条件有选择地对源程序中的某部分语句进行汇编处理。格式:IF×× 条件表达式… ;[ELSE…] ;ENDIF第45页,课件共78页,创作于2023年2月4.4汇编语言程序设计基础本节将介绍汇编语言程序设计的常用结构与方法。4.4.1程序设计的基本过程一、程序设计的一般步骤汇编语言程序设计基本上与高级语言程序设计一样,一般步骤:1.分析问题并抽象出数学模型。2.确定解决此数学模型的算法。3.画出程序结构框图和流程图。4.分配内存工作单元和寄存器。5.编程并调试。二、评价程序质量的标准1、合理组织数据,发挥存贮器、Reg的作用。2、程序逻辑结构好,便于二次开发。3、可读性强。4、高可读性和可维护性。5、效率高(代码少)。第46页,课件共78页,创作于2023年2月4、4、2程序的基本结构一、顺序结构对应简单程序,顺序执行,无转移、无循环。二、分支结构依据不同条件分支到各程序段,有双分支和多分支两种。三、循环结构实现那些需要重复做的工作。三种基本结构奠定了实现任何复杂程序的基础。第47页,课件共78页,创作于2023年2月分支结构两个分支YN

、、、CMPAL,BLJGgreat

JMPexitgreat:

exit:、、、、、、

AL≤BL处理AL>BL处理顺序结构第48页,课件共78页,创作于2023年2月分支结构三个分支

、、、CMPAL,0

JGgreat

JLless

JMPexitless:

JMPexitgreat:

exit:、、、AL=0处理AL>0处理AL<0处理第49页,课件共78页,创作于2023年2月循环结构循环初始设置循环体循环条件判断?YN当型循环(当条件成立进入循环)YN循环初始设置循环体循环条件判断?直到型循环(直到条件成立退出循环)第50页,课件共78页,创作于2023年2月4、4、3程序设计基本方法二、分支结构程序的设计设计分支程序的关键是①如何判断分支的条件②如何实现分支结构1、利用比较和转移指令实现分支利用比较和转移指令实现分支程序设计的方法,是在需要分支的地方用比较指令CMP、串比较指令CMPS或串搜索指令SCAS等顺序进行分支条件的比较判断,然后利用各种条件转移指令实现分支。

一、顺序结构程序设计——按事件发展的先后,选择合适的指令有序地加以组合。

书P167例1第51页,课件共78页,创作于2023年2月例:P169例1例:P169例2数据块传送1、不重叠CLD,直接用MOVS或MOV2、源首址加数据块长度<目标首址,CLD重叠增量传送源首址加数据块长度>目标首址,STD减量传送2、利用跳转表实现分支

——多用于多路分支跳转地址(各子程序入口地址)跳转表的组成跳转指令(转向子程序的转移指令)关键字⑴根据表内地址分支方法是:将需要分支的各子程序入口地址按照一定的顺序存放在第52页,课件共78页,创作于2023年2月内存区域中,若主程序需要转去执行某个子程序,可以根据一定的算法计算出该子程序地址在跳转表中的位置,从而得到相应子程序的入口地址,然后用JMP指令转去执行。若是段内分支,每个地址在表内占2个单元(IP的值),若是段间分支,每个地址占4个单元(CS:IP的值)。

例:P170

子程序入口地址的地址=表基地址(BASE)+(产品编号)×2程序见P171⑵、根据表内指令分支该表称为命令表,命令表存放在代码段。通常每三个单元存放一条转移指令(设JMP是三字节指令)。只要能寻址到跳转表相应的项,即可执行转至某子程序的JMP指令,实现程序的转移。例、P172

BX=表基地址+编号×3

第53页,课件共78页,创作于2023年2月三、循环结构程序设计1.循环程序的组成循环程序是在满足某些条件时对一段程序的重复执行,一般由四部分组成。

参数初始化工作部分参数修改YN(a)先执行后判断控制部分循环结束?(b)先判断后执行参数初始化控制部分循环结束吗?工作部分修改部分YN第54页,课件共78页,创作于2023年2月2、基本结构形式⑴先执行后判断(do—while)至少进入一次循环体。常用于循环次数已知时。例:P173⑵先判断后执行不满足条件则不执行循环体,这时循环体可一次都不执行。常用于循环体次数未知,根据具体情况找出控制循环体结束的条件时常用。例:P173例2控制循环体的条件是:当AX内容为全0,不必再继续统计。3、循环控制方法每个循环程序必须选择一个循环控制条件来控制循环的运行和结束。常用循环控制条件(方法):(1)计数控制――循环次数已知,每循环一次加/减1。例1(2)条件控制――循环次数未知,须根据条件真假控制循环。例2第55页,课件共78页,创作于2023年2月(3)状态控制――根据事先设置或实时检测的状态来控制循环。(4)逻辑尺控制――在多次循环过程中需分别做不同的操作时,可通过建立位串(逻辑尺)控制循环。P174例3(同学自看)

4、多重循环程序设计第56页,课件共78页,创作于2023年2月4.4.4子程序设计与调用技术子程序(或过程)是程序的一部分,是完成特定功能的程序段,它能在程序中任何地方被调用执行。使用子程序是程序设计的一种重要方法,常在以下情况中使用子程序。(1)多次重复使用的程序段可定义为子程序。这样可有效地简化程序的编制,缩短程序的长度,从而节省磁盘或内存空间。(2)具有通用性、便于共享的程序段可定义为子程序。例如代码转换、键盘处理等。(3)中断处理程序一定是子程序。因为中断的发生是随机的、不可预料的,所以对中断的处理只能编制成子程序的形式。当中断发生时,转去它完成相应的功能。

第57页,课件共78页,创作于2023年2月1.与子程序有关的术语(1)子程序嵌套:子程序中调用别的子程序称为嵌套,只要堆栈空间允许,嵌套层次不限。(2)子程序递归调用:子程序调用该子程序本身称为递归调用子程序中断在中断程序中又调用子程序2、子程序文件——由子程序的说明文挡和子程序本身构成。(4)可重定位子程序:全部采用相对地址、可重定位在内存任意区域的子程序。

(3)可重入子程序:能够被中断并可再次被中断程序调用的子程序。第58页,课件共78页,创作于2023年2月子程序文档:(1)功能描述。包括子程序的名称、功能、性能指标(如执行时间)等。(2)子程序的入口、出口参数。(3)所用寄存器和存储单元。(4)子程序中又调用的其它子程序。(5)调用实例(可有可无)。

例:有一子程序说明如下:;子程序DTOB;将两位10#(BCD码)转换成2#;入口参数:ALReg中存放10#

;出口参数:CLReg中存放转换完的2#;所用Reg:BX;执行时间:0.06ms

子程序常以过程形式存放在代码段,通常以一个标号开始,以RET指令结束。第59页,课件共78页,创作于2023年2月例:DTOBPROC…RETDTOBENDP

子程序标准格式二、子程序设计中的问题1.主程序与子程序的连接

子程序以过程的形式存放在代码段。当主程序与子程序在同一代码段,为段内调用;若主程序与子程序各在不同的代码段,为段间调用。CALL:段点保护,转子程序RET:段点恢复2、现场的保护与恢复用成对的PUSH、POP指令保护主程序与子程序中都要用到的Reg及mem

第60页,课件共78页,创作于2023年2月方法一:PUSHBXPUSHCXCALLPROC-1POPCXPOPBX方法二:.PROC-1PROC.PUSHBX.PUSHCX

CALLPROC-1.POPCX.POPBX.RETPROC-1ENDP…常用第二种方法保护和恢复现场。对中断子程序必须用第二种方法。3、主、子程序之间的参数传递入、出口参数即传给子程序的参数及从子程序出来的参数。参数传递通常有3种方法:(1)寄存器传递(2)存储单元(参数表)传递(3)堆栈传递第61页,课件共78页,创作于2023年2月三、子程序应用举例:

例1~例3四、BIOS/DOS功能子程序调用用户程序磁盘管理模块(DOS内核)MSDOS.SYS系统功能基本输入/输出BIOS模块IO.SYS设备驱动ROMBIOS基本I/O系统硬件装入命令处理模块COMMAND.COM用户命令DOS系统层次结构第62页,课件共78页,创作于2023年2月在汇编语言程序设计中,用户可通过使用ROMBIOS和及基本DOS系统提供的这些功能模块子程序,来编制直接管理和控制计算机硬件设备的底层软件,主要是完成I/O操作。1.调用BIOS/DOS功能子程序的基本方法BIOS/DOS的每个功能子程序都对应着一个子程序文件。使用这些子程序时,用户不必过问其内部结构和细节,也不必关心硬件I/O接口的特性,只要直接用一条软中断指令INTn即可(n称为中断类型号),这称为中断调用。

有的软中断命令对应一个子程序,有的软中断命令对应若干个子程序。前者无需②,后者必须严格按①②③顺序执行。常用的有:INT10H;INT16H;INT21H例:P181中断调用一般需要经过以下三个步骤:①子程序入口参数送规定寄存器;②子程序编号(也叫功能调用号)送AH寄存器;③发软中断命令:INTn。第63页,课件共78页,创作于2023年2月设置入口参数在AH设置功能号m执行中断指令INTN分析、应用出口参数第64页,课件共78页,创作于2023年2月2、常用的DOS功能子程序调用DOS功能调用在更高层次上提供了BIOS类同的功能,它是ROMBIOS的一部分,两者区别如下:①调用BIOS中断程序比调用DOS中断程序要复杂一些,但运行速度快,功能更强;②DOS功能调用只是在DOS的环境下适用,而BIOS功能调用不受任何操作系统的约束;③某些功能只有BIOS具有。在所有DOS功能调用中,将INT2lH软中断命令来实现的子程序调用称为DOS系统功能调用,它体现了DOS的核心功能,对应100多个子程序。常用如下:(1)1号调用:键入一个字符。(2)6号功能调用:直接控制台输入输出。

入口参数DL=FF键入ZF=0,AL=键值ZF=1,AL≠键值第65页,课件共78页,创作于2023年2月DL≠FF输出,DL中为输出字符的ASCII码值1号与6号区别:前者等待用户键入,后者不等待用户键入。(3)显示或打印输出单个字符(02号和05号功能调用)入口参数:DL=待输出的字符(4)字符串输入(0A号功能调用)键盘输入字符串后存入DS:DX为首址的缓冲区。①在数据段定义一个缓冲区DBX;缓冲区能容纳的字符个数DB?;存放实际输入字符个数DBXDUP(?);接受字符串②入口参数:DS:DX指向缓冲区首址(5)字符串输出(09号功能调用)将以$为结束符的字符串输出到显示器

入口参数:DS:DX指向字符体例:书P182第66页,课件共78页,创作于2023年2月4.5

模块化程序设计技术主要注意3个问题:(1)全局符号的定义和使用一个模块中定义的符号如不另家加说明,均为局部符号,局部符号只能在定义它的模块内使用。(2)模块间转移形式:JMP,CALL,INT近转移和远转移(3)多个模块的组合关系:NONEPUBLICSTACKCOMMONMEMORY第67页,课件共78页,创作于2023年2月

模块化程序设计举例:求无序表中的最大元素及其位置。程序见书

注(1)算法①先确定第一个值为最大值CX-1②再顺序与表后元素比较,取大的值取代当前的最大值MOV BX, OFFSETARRAYMOV CX, COUNTMOV AL [BX]DEC CXINC BXAA:CMP AL, [BX]JA NEXT MOV AL,[BX]NEXT:INC BXLOOP AA第68页,课件共78页,创作于2023年2月

4.6

实用程序举例算术运算例1 见书上例一例2多字节加减(二进制数)DATA SEGMENT X1 DW XXXXH,XXXXH X2DW XXXXH,XXXXH X3 DW 0000H,0000HDATA ENDSSTACK SEGMENT PARA STACK DW 20H DUP(?)STACK ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATA,SS:STACKMAIN PROC FAR PUSH DS第69页,课件共78页,创作于2023年2月

PUSH AX MOV AX,0 MOV AX,DATA MOV DS,AX CLC ;清CF MOV CX,02H LEA SI,X1 LEA DI,X2 LEA BX,X3E20: MOV AX,[SI] ADC AX,[DI] MOV [BX],AX ADD SI,2 ADD BX,2 LOOP E20 RETMAIN ENDPCODE ENDS第70页,课件共78页,创作于2023年2月若是十进制算术运算非压缩的十进制运算按字节运算用AAA,AAS调整压缩的十进制运算按字节运算用DAA,DAS调整十进制加减规律例3多位的非压缩的十进制数的加法STACK SEGMENT STACK ‘STACK’

……

STACK ENDS DATA SEGMENT FIRST DB 4,7,9,2,0;十进制数02974 SECOND DB6,2,3,7,0;十进制数07326 THIRD DB 5DUP(0) DATA ENDS CODE SEGMENT

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论