还剩8页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
第三章汇编语言程序设计汇编语言主耍用于一些要求程序执行速度快而内存容量又有限的场合(如某些实时系统中)第一节汇编语言源程序的格式一个完整的汇编语言源程序通常由数据段、附加数据段、堆栈段和代码段组成代码段存放源程序中所有的指令数据段、附加数据段或者堆栈段存放数据、变量每个段以SEGMENT语句开始,以ENDS语句结束,整个源程序以END语句结尾汇编语言源程序的结构段名1SEGMENT段名1ENDS段名2SEGMENT段名2ENIIDI S段名n SEGMENTIIIII段名n ENDSIEND第二节汇编语言语句行的构成汇编语言语句的组成标识符、保留字、界符、常数和注释都称为标记
一、标记
1.标识符自定义的字符串可由字母、数字和下划线组成,以字母开头长度W31个字符作用语句的符号地址、程序的开头、数据块的开头、符号常量
2.保留字是一个汇编语言中预先保留下来的具有特殊用途的字符串,如8088的指令、伪指令、寄存器名等不可用作标识符
3.界符界符是一个程序或一条指令中两个部分的分隔符号
4.常量包括数字常量和字符串常量数字常量可以用不同数制(后缀)表示字符串常量是由引号引起来的一串字符,内存中存放的是字符所对应的ASCII码
二、符号及其属性L寄存器可以作为指令的操作数
5.变量实际上是内存单元的符号地址,也称内存变量可作为操作数被程序指令所引用(直接寻址方式)不能与保留字重名,也不能与段名重名变量三属性:段、偏移量和类型段属性:变量所在段的段地址(存放于DS或ES或SS中)偏移量属性:指该变量所在段的起始地址到变量地址之间的字节数,即偏移地址或有效地址类型属性:指变量具有的字节数,有BYTE(字节)、WORD(双字节)、DWORD(4字节)、QWORD(8字节)和TBYTE(10个字节)等
6.标号是某条指令的符号地址可作为操作数,被程序中其他指令所引用(如转移指令、循环指令、子程序调用指令等)不能与保留字重名,也不能与段名重名标号三属性:段、偏移量和类型段属性:标号所在代码段的段地址(存放于CS中)偏移量属性:标号所在段的起始地址到该标号地址之间的字节数,即所谓偏移地址、有效地址类型属性:有两个NEAR(近标号)和FAR(远标号)近标号只能在段内被引用,远标号既可在段内被引用,也可被其他段引用
三、表达式由操作数和运算符组成,在汇编时求得表达式的值可作为语句的操作数在程序执行时,表达式本身已是一个有确定值的操作数(立即寻址方式)
1.操作数可以是一个数据或存储单元地址符号常量用符号来表示的数据(应在程序中事先定义使它等于某个常数)
2.运算符表达式中常用的运算符有以下几种
(1)算术运算符+、-、*、/和MOD(取余)均可用于数值运算,运算结果数值对地址的运算仅有+(加)、-(减)运算符如DATA1+2表示变量DATA1的地址加上2得到新的存储单元地址注意没有意义的地址运算:1)不同段的地址之间的运算2)同段中地址之间的加运算
(2)逻辑运算符AND、OR、NOT、XOR在汇编时对数值进行按位运算,结果是数值注意1)不能对地址进行逻辑运算2)不要将逻辑运算符和同样名称的指令操作码相混淆,例如AND AX,0A6H ANDOCEH汇编时计算0A6H ANDOCEH=86H经过汇编,指令为AND AX,0086H;立即寻址方式程序执行时,作(AX)A86H的操作,结果存于AX中
(3)关系运算符(略)
(4)分析运算符和综合运算符1)分析运算符OFFSET、SEG、TYPE、SIZE、LENGTH用于分析并返回一个存储器操作数的属性,如段、偏移量和类型;OFFSET返回一个标号或变量的偏移地址(EA),例如MOV DI,OFFSET DATA1SEG返回一个标号或变量所在段的段地址,例如MOV AX,SEG ABCMOV DS,AXTYPE返回变量或标号的类型值变量、标号类型对应值变量BYTE(字节)1WORD(字)2DWORD(双字)4标号NEAR-1OFFFH__________FAR-2OFFFEHSIZE返回一个存储区的字节总数LENGTH返回一个存储区中以的DUP定义的单元可以是字节、字或者双字的数目例如ABC100DUP;定义变量ABC的类型为字wordDW111MOV TYPEABC;AX-2AX,MOV BX,SIZE ABC;BX-200MOV CX,LENGTH ABC;CX-100注意LENGTH运算只对数据定义中的DUP操作有效,如上述数据定义改为ABC DW3,67或ABC DW3,67,100DUP则LENGTH ABC返回的是1,而不是1002综合运算符PTR、SHORT用于规定一个存储器操作数的某项属性,如类型等PTR用于暂时改变变量或标号的原有属性,但这个新属性只在当前语句中有效,例如:ABC DW1234H;定义ABC为字变量DEF DB23H,56H,18H;定义DEF为字节变量••♦MOV AL,BYTE PTRABC;AL-34H,为什么?MOV BX,WORD PTRDEF;BX-5623HSHORT用于指定一个标号为短标号,短标号可以做为无条件转移和条件转移语句的操作数例如JMP SHORTSTART被引用的标号START离本条指令的距离必须在-128127个字节的范围内〜
四、语句[符号地址变量名或标号]操作码操作数;注释如SUM DB100,;伪指令,为操作一般在数据段里如GOMOV AX,MY-DATA;指令序列在代码段里MOVDS,AX指令性语句和指示性语句指令性语句由指令组成,经汇编产生对应的二进制目标代码指示性语句伪指令主要执行伪操作为汇编程序提供某些信息,以便汇编程序在汇编过程中执行某些特定的功能伪指令与指令的本质差别伪指令在汇编过程中并不形成任何代码,汇编以后不占内存介绍几种常用的伪指令
1.符号定义伪指令赋值语句格式符号常量EQU表达式符号常量=表达式功能该语句把表达式的值赋给符号名说明在程序中,用EQU语句赋值的符号名不能被重新赋值,但用号赋值的符号名可以被重新赋值例如VARI EQU100•••VARI EQU200第二个VAR1的定义是不允许的若要给VAR1重新赋值,则必须使用解除伪指令PURGE,例如VARI EQU100•••PURGE VARIVARIEQU200但是,运用“二”以后,下面的语句就是合法的VAR2=100VAR2,200VAR3=23•••VAR3=VAR3+
1002.内存数据定义伪指令格式[变量名]数据定义符表达式或数据项表功能定义数据类型,为数据项分配存储单元,并根据需要设置其初值说明表达式或项表中的每一项是一个用逗号间隔的数据,它们从符号地址名开始连续存放,直到表中数据项结束地址递增方向数据定义符有以下几种DB定义数据为单字节类型;DW定义数据为单字类型;DD定义数据为双字即4字节类型;DQ定义数据为8字节类型;DT定义数据为10字节类型数据可以是常数数据、字符串,或者是表达式其值为常数,例如DATA_BYTE DB10,4,10HDATAJVORD DW100,100H,-5DATA_DW DD3*20,OFFFD汇编程序可以是汇编期间在存储器中存入数据,如图3-1所示例
3.1D1DB12H,12H,12HD2DB3DUP12HCOUNT EQU$-DlD3CNT DB3DUP12H,,$-Dl“AND,6DUP20HBUF EQU1234,56DW,OK,DWMOV AX,BUF;正确MOV BX,DI;错误,数据类型不匹配说明1数据重复书写时,可用重复格式DUP简写,DUP是Duplicte的缩写DUP可以嵌套使用22表示地址计数器的当前值,本例中第一个表示6,故COUNT=6请问第二个表示几?CNT=3可以使用“?”,通知汇编程序预留存储空间,其长度由数据定义决定,此时该空间中为随机数;4数据项允许为字符串,汇编过程中将其相应的ASCH码存入存储器
3.段定义伪指令格式段名SEGMENT[定位方式][连接方式][类别名]段体段名ENDS功能段定义伪指令为程序的汇编和链接说明了段名、分段的各种属性以及分段的开始和结束段名是自定义符,开始的段名与结束的段名必须相同段的长度不超过64KBo SEGMENT后面的参数是可选项说明
(1)段名的命名规则和变量名以及标号一样,为阅读方便,往往起一个与段体性质相适应的段名
(2)SEGMENT后面三个属性参数可省略不写,尤其是单模块程序
4.段址寄存器说明伪指令格式ASSUME段寄存器段定义名1[,段寄存器段定义名2,•••]功能告诉汇编程序在汇编时,段寄存器CS、DS、SS和ES应具有的符号段基址,以便汇编指令时确定段和建立错误信息但是段寄存器实际值(CS除外)还要由传送指令(MOV)在执行程序时赋值
5.过程(子程序)定义伪指令格式过程名PROC[NEAR](或FAR)■过程名ENDP说明过程名是自定义符使用过程实质是实现子程序调用调用格式为CALL过程名过程由RET指令返回
6.模块开始伪指令(略)
7.建立标题伪指令(略)
8.模块结束伪指令格式END[启动标号或过程名]功能该伪指令告诉汇编程序源文件结束,并给出执行程序的人口位置启动地址只有在主模块才有意义
9.定位伪指令格式ORG表达式功能该伪指令把以下伪指令定义的内存数据或程序,从表达式指定的起点(偏移地址)开始连续存放,直至遇到新的ORG指令表达式的值是一个无符号数第三节汇编语言程序设计的方法基本结构顺序结构、分支结构、循环结构和子程序结构
一、顺序结构程序设计的方法顺序结构CPU按指令排列的顺序逐条执行(见图3-2)例
3.2两个无符号二进制数的加法DATA SEGMENT;定义数据段定义被DATA1DW OABH,3411;加数DATA2DW25,FCH;定义加数;数据段结束DATA ENDS定义附加段EXTRA SEGMENT;;定义结果存放区附SUM DW2DUP加段结束EXTRA ENDS;;定义代码CODE SEGMENTASSUME CS:CODE,DS:DATA,ES:EXTRA;初始化DSSTARTMOV AX,DATAMOV DS,AXMOV AX,EXTRA;初始化ESMOV ES,AX;存放结果的EA送SILEA SI,SUM;取被加数MOV AX,DATA1;两数相加ADD AX,DATA2;结果送入SUM单元中MOV ES:[SI],AXHLT;代码段结束CODE ENDSENDSTART;源程序结束
二、分支(选择)结构程序设计的方法分支结构根据不同的条件转到不同的程序段执行的程序结构(见图3-3)例
3.3符号函数x0当x=0当x0当分析要判断一个数是关于零、小于零还是等于零,只要将该数自身与自身相就可以根“与”或“或据标志寄存器的情况来判定程序如下(见图3-4)”,DATA SEGMENTXDW06HY DWDATA ENDS--SEGMENTSTACKDB100DUP STACKENDSCODEASSUME CS:CODE,DS:DATA,SS:STACKSTART:PUSH DSXOR AX,AXPUSH AXMOV AX,DATAMOV DS,AXMOVAX,XORAX,AXJZ ZEROJNSPLUSMOV BX,OFFFFHJMP DONEZEROMOV BX,0JMP DONEPLUSMOV BX,1DONEMOV Y,BXMOV AH,4CHINT2111CODE ENDSENDSTARTSEGMENT
三、循环结构程序设计的方法;清零AX循环结构由初始化、循环体和循环控制三部分组成初始化部分,完成对诸如地址指针寄存器、计数寄存器等循环过程中用到的寄存器及存储器置初值;循环体,完成需重复执行的工作;循环控制,则用于判断循环是否结束,若结束则跳出循环,未结束则修改地址指针和计数器值,为;建立标志;x=0,转ZERO;x0,转PLUS;x0,则BX=-1下一轮循环做准备(见图3-5)例
3.3在以MEM开始的内存区域中,存放了10个16位无符号数,找出其中的最大值和最小值,分别存于MAX和MIN为首的内存单元中;返回DOS分析要寻找100个无符数中的最大值和最小值,可先取数据块中的一个数据作为标准,将它放到MAX和MIN中,然后将数据块中的其它数逐个与MAX和MIN单元中的数比较,凡大于MAX者,取代MAX中原来的数据,小于MIN者,取代MIN中原来的数据(见图3-6)DATA SEGMENTMEMDW1,7,-5,1000,-300,346,……,50976;共100个数据MAX DWMIN DWDATA ENDSCODESEGMENTASSUMECS:CODE,DS:DATASTARTPUSH DSXORAX,AX;清零AXPUSH AXMOVAX,DATAMOV DS,AXLEA SI,MEM;(SI)—数据块首址MOV CX,100;CX—数据块长度CLD;清零DFLODSW;取一个16位无符号数到AXMOV MAX,AX;送MAX单元MOV MIN,AX;送MIN单元DEC CX;CX-lNEXTLODSW;取下一个数,并修改地址指针CMP AX,MAX;与MAX单元内容比较JNC GREATER;比MAX大,则转GREATERCMP AX,MIN;否则,与MIN单元内容比较JC LESS;比MIN小,则转LESSJMP GOON;否则,转GOONGREATERMOV MAX,AX;MAX—AXJMP GOON;转GOONLESSMOV MIN,AX;MIN—AXGOONLOOP NEXT;CX减1,若不等于0,转NEXTMOV AH,4CH;返回DOSINT21HCODE ENDSENDSTART
四、混合结构程序设计方法
五、子程序的设计方法(略)混合结构上述三种设计方法的组合应用(以上例为例说明)。
个人认证
优秀文档
获得点赞 0