单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,1,1,35 控制汇编语言程序语句,MASM6.X版本提供了控制程序流程的三种汇编语句:,IF语句,DOWHILE语句,REPEAT UNTIL语句,其表达式常用的运算符见表3.9(P96)。,该类伪指令的书写格式与高级语言的书写方式相类似,汇编程序在汇编时会自动增加转移指令和相应的标号。理解并掌握该知识,对将来学习编译原理课程也有一定的帮助。,35 控制汇编语言程序语句,1,351 IF语句,对IF后面的表达式进行计算后再作为条件进行判断。,一般形式IF语句:,嵌套形式IF语句:,格式1:IF表达式 格式2:IF表达式,语句l 语句1,ELSE ELSEIF表达式,语句2 语句2,ENDIF ELSE,语句n,ENDIF,351 IF语句,2,例3.52 编程实现将键盘输入的字符、数字转换成十六进制数。,MODEL TINY,CODE,STARTUP,MOV AH,1 ;键盘输入,INT 21H,IF,ALA&ALF,;4146H,SUB AL,37H,ELSE,IF,ALa 61 66H,SUB AL,57H,ELSE,SUB AL,30H ;30 39H,ENDIF,EXIT,END,例3.52 编程实现将键盘输入的字符、数,3,352 DOWHILE语句,对WHILE、BREAK、CONTINUE后面的表达式进行计算后再作为条件进行判断。,格式1:WHILE 表达式,语句,ENDW,WHILE语句是一种先判断后执行的循环语句。其控制流程是,先计算表达式的值并判断。,352 DOWHILE语句,4,格式2:BREAK IF表达式,控制程序,当表达式条件成立时,退出本层循环体,。可用于在程序中设置断点。,例3.53 BREAK IF EAX=0,;当测试到EAX=0,则终止循环。,格式2:BREAK IF表达式,5,格式3:CONTINUE IF表达式,控制程序,当表达式条件成立时,循环继续进行,。否则跳过剩余语句到与它最近的循环条件判断语句。,在BREAK、CONTINUE后面的IF表达式不需要ENDIF来结束。,与C语言的相应功能一致。,例3.54 CONTINUE IF AL=6 ;测试到AL=6时,继续进行循环。,格式3:CONTINUE IF表达,6,例3.55 编程实现从BUF缓冲区10个字符中寻找$字符,如找到显示$字符,否则显示0。,IF AL$,MOV DL,AL,ELSE,MOV DL,0,ENDIF,MOV AH,2 ;显示字符,INT 21H,EXIT,END,(用REPNZ SCASB指令),MODEL SMALL,DATA,BUF DB ABCDEFGI$K,CODE,STARTUP,MOV CX,10,LEA BX,BUF,MOV AL,0,WHILE AL!$,MOV AL,BX,INC BX,DEC CX,BREAK IF CX0,ENDW,例3.55 编程实现从BUF缓冲区10个,7,353 REPEATUNTIL语句,对 UNTIL后面的表达式进行计算后再作为条件进行判断。循环至少执行一次。格式:,REPEAT 语句 UNTIL 表达式,例3.56 编程实现将BUF缓冲区100个字节数据传到BLOCK缓冲区。,MODEL SMALL,DATA,BUF DB 10,20,88,;(100个字节),BLOCK DB 100DUP(?),CODE,STARTUP,MOV CX,100,LEA BX,BUF,LEA SI,BLOCK,REPEAT,MOV AL,BX,MOV SI,AL,INC SI,INC BX,UNTILCXZ,;CXCX1,,并判断CX0,EXIT,END,(用REP MOVSB指令),353 REPEATUNTIL语句,8,36 结构和记录,汇编语言还提供了,用于说明复杂数据类型的伪指令,,利用这些伪指令能够描述复杂数据类型,本节介绍结构、联合和记录。,原则:,先说明、后定义、再访问,361 结构和联合,结构,是不同数据类型和不同长度数据区间的数据的集合,。除了联合中的数据区间可以在内存重叠外,联合和结构是相同的。,36 结构和记录,9,结构,中的任何一个数据区间,都具有相对于结构首地址的偏移地址的属性,,结构的长度是所有数据区间长度的总和,。,联合,中的任何一个数据区间,其首地址均相同,因此,联合的,长度是所有数据区间长度中最长区间的长度,。,所以联合允许在相同的区间定义不同的数据类型。换句话说,可以在程序中根据需要,改变同一区间的数据类型。,原则:先说明、后定义、再访问,结构中的任何一个数据区间,都具有相对于结构首,10,1结构与联合,类型说明,在描述结构与联合类型数据或使用结构与联合型变量之前,需要说明结构与联合类型。,一般格式如下:,结构名 STRUC|UNION 属性,数据定义语句序列,结构名 ENDS,属性:对齐属性,非独立属性,对齐属性:定义起始边界值,可以是1、2和4,缺省值是1。,1结构与联合类型说明,11,例3.57 下列语句说明了一个名为PERSON的结构类型:,PERSON STRUC,ID DD 0 ;偏移量为0,SCORE DW 60 ;偏移量为4,YEAR DB 10 ;偏移量为6,PERSON ENDS,结构中不同数据区间用不同数据类型来定义变量,,数据区间称为,结构的字段,,相应的变量名称为,字段名,。一个结构中可以含有多个字段,,各字段可以有不同的长度(以字节为基本单位),可以独立地存取任一字段,。,例3.57 下列语句说明了一个名为PERSON的结构类型,12,2结构与联合,变量的定义,字段名必须唯一,。它代表了从结构的开始到相应字段的偏移。,变量的定义,:,变量名 结构类型名,变量名 结构类型名 初值 ,初值 ,变量名 结构类型名 常数DUP(初值 ,初值 ),;(同时定义多个结构变量,并赋初值,建立结构数组),在说明结构类型时,可以给字段赋初值,也可以不赋初值。,2结构与联合变量的定义,13,例3.58 设已说明了上述结构PERSON,那么可定义如下结构变量:,STUDENT1 PERSON ,;三个字段都重赋初值,STUDENT2 PERSON ,;字段SCORE、YEAR用缺省初值,STUDENT3 PERSON ,;三个字段均用缺省初值,PERSON 99DUP(?),;定义99个结构变量,初值不变,例3.58 设已说明了上述结构PERSON,那,14,例3.59,DISP STRUC,;结构类型说明,A DB?,B DB?,C DB?,DISP ENDS,PLAY STRUC,;结构类型说明,ONE DB 100DUP(?),TWO DB NAME,THREE,DISP,;结构类型说明中定义结构变量,PLAY ENDS,PLAY1 PLAY ,TOM,0,0,0 ;字段ONE用缺省初值,例3.59 DISP STRUC,15,4结构或联合类型,变量及其字段的访问,通过结构变量名可直接存取结构变量,。,若要存取结构变量中的某一字段,则可采用如下形式:,结构变量名.结构字段名,结构字段的地址偏移值,是结构起始地址的偏移值与相应字段偏移值之和。,4结构或联合类型变量及其字段的访问,16,例3.62 程序实现对结构字段的访问,DATE STRUC,;,说明结构类型,YEAR DW?,MONTH DB?,DAY DB?,DATE ENDS,SOMEDAY DATE ;,定义结构变量,TODAY DATE,NEXTDAY DATE,MOV AL,SOMEDAYMONTH ;,访问结构变量,,AL=3,MOV AH,TODAYDAY ;AH=18,MOV CX,NEXTDAYYEAR ;CX=2002,MOV SI,OFFSET SOMEDAY,MOV AX,SIYEAR ;AL=2000,例3.62 程序实现对结构字段的访问,17,例:有关结构,PERSON STRUC ;,说明结构类型,ID DD 0 ;偏移量为0,SCORE DW 60 ;偏移量为4,YEAR DB 10 ;偏移量为6,PERSON ENDS,STUDENT1 PERSON ;,定义结构变量,STUDENT2 PERSON ,STUDENT3 PERSON ,PERSON 99DUP(?),;,访问结构变量及其字段,MOV EAX,STUDENT1,ID ;EAX=100,MOV AX,STUDENT2,SCORE ;AX=60,MOV EAX,STUDENT3,YEAR ;AL=10,MOV SI,OFFSET STUDENT1,MOV AL,SIYEAR ;AL=20,例:有关结构,18,362 记录,记录和结构相似,,记录的字段是位字符串,,可以作为常数或者表达式使用。可以使用位操作指令进行二进制位数据的存取。,1记录类型的说明,记录名 RECORD 字段 ,字段,字段格式如下:,字段名:宽度=表达式,宽度是常数(8位、16位或者32位),表示相应的字段所占的位数;,表达式的值将作为相应字段的缺省初值,若不设置默认为0。,362 记录,19,例如:,COLOR,RECORD,RED:2,BLUE:4,YELLOW:2,三个字段总宽度正好是8位,所以也称为,字节记录类型,。如果不正好是8位、16位或32位,那么,向右对齐,,记录未说明高端用0填充。,例如:,ABCD RECORD A1:5=11,A2:3=6,A3:2=3,例如:,20,2记录变量的定义,一般格式如下:,变量名 记录名 ,变量名 记录名 ,变量名 记录名 常数 DUP(初值 ,初值 ),记录变量名可以省略,如果省略,那么就不能直接通过符号名访问该记录变量。,2记录变量的定义,21,例3.64 设已定了记录类型COLOR,,COLOR,RECORD,RED:2,BLUE:4,YELLOW:2,那么可定义如下记录变量:,WARNING COLOR,;该字节的值是41H,COLOR,;该字节的值是2FH,COLORLST COLOR 32DUP(),;32个字节,例3.64 设已定了记录类型COLOR,,22,4记录专用操作符WIDTH和MASK,(1)操作符WIDTH,返回记录或记录字段的位数,。,一般格式如下:,WIDTH 记录名,或者 WIDTH 记录字段名,设记录COLOR如前面说明,那么:,MOV AL,WIDTH COLOR ;AL=8,MOV AL,WIDTH RED ;AL=2,MOV AL,WIDTH BLUE ;AL=4,4记录专用操作符WIDTH和MASK,23,(2)操作符MASK,MASK 记录名,或者 MASK 记录字段名,返回记录或记录字段位的位置状态,,返回的二进制数(8位或16位)中相应于指定字段的各位为1,其余各位为0。,设记录COLOR如前面说明,那么:,例3.66 MOV AL,MASK RED,;AL=11000000B,MOV AL,MASK BLUE,;AL=00111100B,(2)操作符MASK,24,(3)记录字段,记录字段名也可作为一个特殊的操作符,直接返回该字段移到所在记录的最右端所需移动的位数。,设记录COLOR如前面说明,那么:,例3.67 MOV CL,RED ;CL=6,MOV CL,BLUE ;CL=2,(3)记录字段,25,37 宏,宏是宏汇编语言的主要特征之一,。,在汇编语言源程序中,若某程序片段需要多次使用,为了避免重复书写,则可把它定义为一条宏指令(,宏定义,)。,在写源程序时,程序员用宏指令来表示某个程序片段(,宏调用,);在汇编时,汇编程序会扫描源程序,检查是否有已说明的宏指令应用在程序中,如果有则将宏指令所代表的内容插入该宏指令位置处(,宏展开,)。,26,371 宏指令的定义和使用(包括:,宏定义、宏调用、宏展开,),宏指令在使用之前要先定义。一般格式如下:,宏指令名 MACRO 形式参数表,宏定义体(由指令、伪指令