h3-567控制结构和宏.ppt_第1页
h3-567控制结构和宏.ppt_第2页
h3-567控制结构和宏.ppt_第3页
h3-567控制结构和宏.ppt_第4页
h3-567控制结构和宏.ppt_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

35控制汇编语言程序语句,MASM6.X版本提供了控制程序流程的三种汇编语句:IF语句DOWHILE语句REPEATUNTIL语句其表达式常用的运算符见表3.9(P96)。该类伪指令的书写格式与高级语言的书写方式相类似,汇编程序在汇编时会自动增加转移指令和相应的标号。理解并掌握该知识,对将来学习编译原理课程也有一定的帮助。,351IF语句对IF后面的表达式进行计算后再作为条件进行判断。一般形式IF语句:嵌套形式IF语句:格式1:IF表达式格式2:IF表达式语句l语句1ELSEELSEIF表达式语句2语句2ENDIFELSE语句nENDIF,例3.52编程实现将键盘输入的字符、数字转换成十六进制数。MODELTINYCODESTARTUPMOVAH,1;键盘输入INT21HIFALA3039HENDIFEXITEND,352DOWHILE语句对WHILE、BREAK、CONTINUE后面的表达式进行计算后再作为条件进行判断。格式1:WHILE表达式语句ENDWWHILE语句是一种先判断后执行的循环语句。其控制流程是,先计算表达式的值并判断。,格式2:BREAKIF表达式控制程序当表达式条件成立时,退出本层循环体。可用于在程序中设置断点。例3.53BREAKIFEAX=0;当测试到EAX=0,则终止循环。,格式3:CONTINUEIF表达式控制程序当表达式条件成立时,循环继续进行。否则跳过剩余语句到与它最近的循环条件判断语句。在BREAK、CONTINUE后面的IF表达式不需要ENDIF来结束。与C语言的相应功能一致。例3.54CONTINUEIFAL=6;测试到AL=6时,继续进行循环。,例3.55编程实现从BUF缓冲区10个字符中寻找$字符,如找到显示$字符,否则显示0。,IFAL$MOVDL,ALELSEMOVDL,0ENDIFMOVAH,2;显示字符INT21HEXITEND(用REPNZSCASB指令),MODELSMALLDATABUFDBABCDEFGI$KCODESTARTUPMOVCX,10LEABX,BUFMOVAL,0WHILEAL!$MOVAL,BXINCBXDECCXBREAKIFCX0ENDW,353REPEATUNTIL语句对UNTIL后面的表达式进行计算后再作为条件进行判断。循环至少执行一次。格式:REPEAT语句UNTIL表达式例3.56编程实现将BUF缓冲区100个字节数据传到BLOCK缓冲区。,MODELSMALLDATABUFDB10,20,88;(100个字节)BLOCKDB100DUP(?)CODESTARTUPMOVCX,100LEABX,BUFLEASI,BLOCK,REPEATMOVAL,BXMOVSI,ALINCSIINCBXUNTILCXZ;CXCX1,并判断CX0EXITEND(用REPMOVSB指令),36结构和记录汇编语言还提供了用于说明复杂数据类型的伪指令,利用这些伪指令能够描述复杂数据类型,本节介绍结构、联合和记录。原则:先说明、后定义、再访问361结构和联合结构是不同数据类型和不同长度数据区间的数据的集合。除了联合中的数据区间可以在内存重叠外,联合和结构是相同的。,结构中的任何一个数据区间,都具有相对于结构首地址的偏移地址的属性,结构的长度是所有数据区间长度的总和。联合中的任何一个数据区间,其首地址均相同,因此,联合的长度是所有数据区间长度中最长区间的长度。所以联合允许在相同的区间定义不同的数据类型。换句话说,可以在程序中根据需要,改变同一区间的数据类型。原则:先说明、后定义、再访问,1结构与联合类型说明在描述结构与联合类型数据或使用结构与联合型变量之前,需要说明结构与联合类型。一般格式如下:结构名STRUC|UNION属性数据定义语句序列结构名ENDS属性:对齐属性,非独立属性对齐属性:定义起始边界值,可以是1、2和4,缺省值是1。,例3.57下列语句说明了一个名为PERSON的结构类型:PERSONSTRUCIDDD0;偏移量为0SCOREDW60;偏移量为4YEARDB10;偏移量为6PERSONENDS结构中不同数据区间用不同数据类型来定义变量,数据区间称为结构的字段,相应的变量名称为字段名。一个结构中可以含有多个字段,各字段可以有不同的长度(以字节为基本单位),可以独立地存取任一字段。,2结构与联合变量的定义字段名必须唯一。它代表了从结构的开始到相应字段的偏移。变量的定义:变量名结构类型名变量名结构类型名初值,初值变量名结构类型名常数DUP(初值,初值);(同时定义多个结构变量,并赋初值,建立结构数组)在说明结构类型时,可以给字段赋初值,也可以不赋初值。,例3.58设已说明了上述结构PERSON,那么可定义如下结构变量:STUDENT1PERSON;三个字段都重赋初值STUDENT2PERSON;字段SCORE、YEAR用缺省初值STUDENT3PERSON;三个字段均用缺省初值PERSON99DUP(?);定义99个结构变量,初值不变,例3.59DISPSTRUC;结构类型说明ADB?BDB?CDB?DISPENDSPLAYSTRUC;结构类型说明ONEDB100DUP(?)TWODBNAMETHREEDISP;结构类型说明中定义结构变量PLAYENDSPLAY1PLAY,TOM,0,0,0;字段ONE用缺省初值,4结构或联合类型变量及其字段的访问通过结构变量名可直接存取结构变量。若要存取结构变量中的某一字段,则可采用如下形式:结构变量名.结构字段名结构字段的地址偏移值是结构起始地址的偏移值与相应字段偏移值之和。,例3.62程序实现对结构字段的访问DATESTRUC;说明结构类型YEARDW?MONTHDB?DAYDB?DATEENDSSOMEDAYDATE;定义结构变量TODAYDATENEXTDAYDATEMOVAL,SOMEDAYMONTH;访问结构变量,AL=3MOVAH,TODAYDAY;AH=18MOVCX,NEXTDAYYEAR;CX=2002MOVSI,OFFSETSOMEDAYMOVAX,SIYEAR;AL=2000,例:有关结构PERSONSTRUC;说明结构类型IDDD0;偏移量为0SCOREDW60;偏移量为4YEARDB10;偏移量为6PERSONENDSSTUDENT1PERSON;定义结构变量STUDENT2PERSONSTUDENT3PERSONPERSON99DUP(?);访问结构变量及其字段MOVEAX,STUDENT1ID;EAX=100MOVAX,STUDENT2SCORE;AX=60MOVEAX,STUDENT3YEAR;AL=10MOVSI,OFFSETSTUDENT1MOVAL,SIYEAR;AL=20,362记录记录和结构相似,记录的字段是位字符串,可以作为常数或者表达式使用。可以使用位操作指令进行二进制位数据的存取。1记录类型的说明记录名RECORD字段,字段字段格式如下:字段名:宽度=表达式宽度是常数(8位、16位或者32位),表示相应的字段所占的位数;表达式的值将作为相应字段的缺省初值,若不设置默认为0。,例如:COLORRECORDRED:2,BLUE:4,YELLOW:2三个字段总宽度正好是8位,所以也称为字节记录类型。如果不正好是8位、16位或32位,那么向右对齐,记录未说明高端用0填充。例如:ABCDRECORDA1:5=11,A2:3=6,A3:2=3,2记录变量的定义一般格式如下:变量名记录名变量名记录名变量名记录名常数DUP(初值,初值)记录变量名可以省略,如果省略,那么就不能直接通过符号名访问该记录变量。,例3.64设已定了记录类型COLOR,COLORRECORDRED:2,BLUE:4,YELLOW:2那么可定义如下记录变量:WARNINGCOLOR;该字节的值是41HCOLOR;该字节的值是2FHCOLORLSTCOLOR32DUP();32个字节,4记录专用操作符WIDTH和MASK(1)操作符WIDTH返回记录或记录字段的位数。一般格式如下:WIDTH记录名或者WIDTH记录字段名设记录COLOR如前面说明,那么:MOVAL,WIDTHCOLOR;AL=8MOVAL,WIDTHRED;AL=2MOVAL,WIDTHBLUE;AL=4,(2)操作符MASKMASK记录名或者MASK记录字段名返回记录或记录字段位的位置状态,返回的二进制数(8位或16位)中相应于指定字段的各位为1,其余各位为0。设记录COLOR如前面说明,那么:例3.66MOVAL,MASKRED;AL=11000000BMOVAL,MASKBLUE;AL=00111100B,(3)记录字段记录字段名也可作为一个特殊的操作符,直接返回该字段移到所在记录的最右端所需移动的位数。设记录COLOR如前面说明,那么:例3.67MOVCL,RED;CL=6MOVCL,BLUE;CL=2,37宏宏是宏汇编语言的主要特征之一。在汇编语言源程序中,若某程序片段需要多次使用,为了避免重复书写,则可把它定义为一条宏指令(宏定义)。在写源程序时,程序员用宏指令来表示某个程序片段(宏调用);在汇编时,汇编程序会扫描源程序,检查是否有已说明的宏指令应用在程序中,如果有则将宏指令所代表的内容插入该宏指令位置处(宏展开)。,371宏指令的定义和使用(包括:宏定义、宏调用、宏展开)宏指令在使用之前要先定义。一般格式如下:宏指令名MACRO形式参数表宏定义体(由指令、伪指令和宏指令构成的程序片段)ENDM宏指令名宏指令名的指定和一般标号命名规则一致。形式参数表为可选项,由若干参数组成,各形式参数间用逗号分隔。,在定义宏指令后,可使用宏指令来表示对应的程序片段,这称为宏调用。宏调用的一般格式如下:宏指令名实参数表其中,实参数表中的实参数应该与宏定义时的形式参数表中的形式参数相对应。,例3.68(宏定义)定义一个宏将AL寄存器内的低4位转换为对应的十六进制数ASCII码:CHANGEMACROANDAL,0FHADDAL,90HDAAADCAL,40HDAAENDM,例3.69(宏调用)下面的程序片段调用了刚定义的宏。MOVAL,BL;转换并显示高4位SHRAL,4CHANGEMOVDL,ALMOVAH,2INT21HMOVAL,BL;转换低4位CHANGE,宏展开:在对源程序汇编时,汇编程序把源程序中的宏指令替换成对应的宏定义体。上述程序片段在汇编时得到的指令如下:,MOVAL,BLSHRAL,41ANDAL,0FH1ADDAL,90H1DAA1ADCAL,40H1DAAMOVDL,ALMOVAH,2INT21H,MOVAL,BL1ANDAL,0FH1ADDAL,90H1DAA1ADCAL,40H1DAAMOVDL,ALMOVAH,2INT21H,372宏指令中参数的使用带参数使宏指令更具灵活性。宏指令的参数可以是常数、寄存器、存储单元和操作码,还可以是表达式。例3.70定义一条宏指令CHAN,实现对指定寄存器的运算。CHANMACROREG,COM,NUMANDREG,0FHCOMREG,NUMENDM此后,可有如下格式的各种宏调用:CHANBL,OR,30HCHANAL,SUB,5在汇编时,宏指令CHANBL,OR,30H扩展成如下的代码:1ANDBL,0FH1ORBL,30H,373宏与子程序的区别两种方法均能达到简化源程序的目的,但有质的不同。两者的区别:1关于目标程序。2关于参数传递。宏调用时的参数由汇编程序通过实参替换形参的方式实现传递,所以参数很灵话。子程序调用时的参数须通过寄存器、堆栈或约定的内存单元传递。3关于时间开销。宏调用是在汇编时完成,所以不需要额外的时间开销。子程序调用和子程序返回均需要时间,且还涉及堆栈。4宏要先定义后调用。宏指令:可简化源程序。当程序片段不长,解决的主要矛盾是速度。子程序:可简化源程序和目标程序。当程序片段较长,额外操作所附加的时间就不明显,解决的主要矛盾是节约存储空间。,374与宏有关的局部变量说明伪指令LOCAL在程序中多次使用宏指令时,避免宏展开出现标号重复定义错误,可用伪指令LOCAL说明宏的局部标号。伪指令LOCAL的一般格式如下:LOCAL标号表;逗号分隔汇编程序在每次展开宏时,总把由LOCAL伪指令说明的标号用唯一的符号(?0000至?FFFF)代替,从而避免标号重定义错误。,LOCAL伪指令用于宏定义

温馨提示

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

评论

0/150

提交评论