高级汇编语言程序设计.ppt
《高级汇编语言程序设计.ppt》由会员分享,可在线阅读,更多相关《高级汇编语言程序设计.ppt(89页珍藏版)》请在三一办公上搜索。
1、1,封面,2,第五章高级汇编语言程序设计,第五章 高级汇编语言程序设计 5.1 高级语言特性 5.2 宏结构程序设计 5.3 模块化程序设计 5.4 输入输出程序设计 本章重点及习题分析,MASM 6.X 新特性,3,5.1 高级语言特性,5.1 高级语言特性通过引入一些伪指令,使汇编语言程序设计具有高级语言程序设计的特性,即可以采用类似高级语言的形式设计分支、循环和子程序结构,大大减轻了使用汇编语言编程的工作量。5.1.1 条件控制伪指令 5.1.2 循环控制伪指令 5.1.3 过程声明和调用伪指令,返回第五章,4,5.1.1 条件控制伪指令,5.1.1 条件控制伪指令.IF/.ELSEIF
2、/.ELSE/.ENDIF:类似高级语言的IF/THIN,ELSE和ENDIF的相应功能。汇编时展开,自动生成相应的比较和条件转移指令,实现分支结构。.IF 条件表达式;条件为真,执行分支体1 分支体1.ELSEIF 条件表达式;前面IF及前面ELSEIF为假,分支体2;当前条件为真,执行分支体2.ELSE;前面IF及前面ELSEIF为假,分支体3;执行分支体3.ENDIF;分支结束,5,条件控制伪指令,不考虑多层嵌套,有4种基本格式.IF 条件表达式;条件表达式为真,执行 分支体;分支体,否则执行后面.ENDIF;语句.IF 条件表达式 分支体1.ELSE 分支体2.ENDIF;分支体1、2
3、必做其一,6,条件控制伪指令,.IF 条件表达式 分支体1.ELSEIF 条件表达式 分支体2;分支体1和分支体2可能.ENDIF;都不做.IF 条件表达式;条件为真,执行分支体1 分支体1.ELSEIF 条件表达式;前面IF及前面ELSEIF,分支体2;为假当前条件为真,执行分支体2.ELSE;前面IF及前面ELSEIF为假,分支体3;执行分支体3.ENDIF;分支结束,7,条件表达式的三个问题,三个问题:1.关于条件表达式中的操作符2.条件表达式举例3.条件表达式中的有符号数和无符号数的规定,8,1.关于条件表达式中的操作符,1.关于条件表达式中的操作符 1)表5.1列出的操作符用于伪指令
4、的条件表达式,第三章介绍的操作符用于数值表达式和地址表达式(构成指令的操作数),两类操作符不可混淆。例如表示相等,条件表达式用“=”,数值表达式用“EQ”;表示逻辑与,条件表达式用“&”,数值表达式用AND。2)操作符可分为:比较、逻辑运算和测试三类,其中测试又可分为:标志测试、位测试、寄存器测试、存储单元测试(regmem)。3)操作符中,单目操作符为!、标志测试、寄存器测试和存储单元测试,其他都是双目操作符。4)操作符的优先级可用圆括号规定。,9,2.条件表达式举例/1,2.条件表达式举例 reg;寄存器不为0,条件为真;为0,条件为假.if al dec al.endif mem;存储器
5、不为0,条件为真;为0,条件为假.if byte ptrbx dec al.endif carry?/overflow?位测试操作符使用格式:数值表达式&位数 如“AL&5”,测试AL寄存器的 D5。,10,/2,reg OP reg;OP为表5.1中任意双目操作符 ax=bx/al=bl/al 寄存器不为0,条件为假;为0,条件为真 注释:1)条件控制伪指令不支持数值表达式,如.if(x+1)=dx)。,11,3.条件表达式中的符号数/1,3.条件表达式中比较的两个数据可能是无符号数,也可能是有符号数,可分成以下情况:数据为变量:用DB、DW、DD等定义的变量一律作为无符号数,若需要进行有符
6、号数比较,必须使用SBYTE、SWORD、SDWORD定义。数据为寄存器或存储单元:默认为无符号数,若需要进行有符号数比较,必须使用操作符SBYTE PTR或SWORD PTR指明类型。SBYTE PTR BXSBYTE PTR BX+SI+DISPVar db 1 var sbyte 1.If alsbyte ptr var.if alvar,12,/2,若表达式中有一个数据为有符号数,则强制另一个数据也作为有符号数进行比较。如.IF SWORD PTR BX=AX,AX被强制作为有符号数看待。(对变量不适用。若变量作为有符号数使用,必须用sbyte/sword/sdword定义),13,条
7、件控制伪指令(end),6)本节新增内容:用于条件表达式的操作符有符号数专用的变量定义伪指令有符号数专用的类型说明操作符分析教材举例浏览汇编结果例题5.1(实根判断),回5.1,14,5.1.2循环控制伪指令,5.1.2循环控制伪指令.WHILE和.ENDW:当型循环结构.REPEAT和.UNTIL/.REPEAT和.UNTILCXZ:直到型.BREAK:退出循环;.CONTINUE:转向循环体开始 格式 1.WHILE 条件表达式;表达式为真,执行循环体 循环体;.ENDW;循环体结束,15,循环控制伪指令,格式 2.REPEAT;重复执行循环体 循环体.UNTIL 条件表达式;直到条件表达
8、式为真 格式 3.REPEAT;重复执行循环体 循环体.UNTILCXZ 条件表达式;CXCX-1,直到CX=0;或条件表达式结果为真,16,循环控制伪指令,注 释:对.REPEAT/.UNTILCXZ(条件表达式)1)不带表达式,结束循环的条件为CX-1减到0,循环控制被汇编为LOOP指令。2)带条件表达式,结束循环的条件为CX减到0 或表达式为真,表达式只能比较寄存器与寄存器(存储单元、常数),以及存储单元与常数相等(=)或不等(!=),所以,汇编后的指令为LOOPE或LOOPNE。分析教材举例 浏览汇编结果例题 5.2:求数组前若干非负数之和。浏览例题5.2汇编结果,回 5.1,17,5
9、.1.3过程声明和调用伪指令,5.1.2 过程声明和过程调用伪指令利用堆栈传递参数为常用方式,但传统的编程方法容易出错。MASM6.X扩充了PROC伪指令的功能,并新增了几条伪指令,使调用子程序具有高级语言的特性。按使用顺序介绍:1.过程声明 PROTO过程名 PROTO 语言类型,参数名:类型,注释:1)使用带参数的过程调用,必须定义语言类型,一般用C或STDCALL。2)参数必须用逗号打头;多个参数之间用逗号分割。3)参数名可省略,类型不可省略。例5.3 CHECKSUMD PROTO C,V1:WORD,V2:WORD,18,过程定义格式,2.过程定义PROC 过程名 PROC 语言类型
10、 USES 寄存器列表,形参1:类型,形参2:类型 LOCAL 参数表 过程名 ENDP注释:1)语言类型与 USES 之间用空格分割。2)寄存器列表:用空格分割的通用寄存器,决定保护现场和恢复现场。3)参数用逗号打头,且用逗号分割;参数名为形参名,调用时被实参替换。4)如果过程用到局部变量,用LOCAL伪指令定义。,19,几个可选项的说明,过程定义中其他几个可选项的说明:1)调用距离:为NEAR或FAR,简化段定义格式中,由.model语句选择的存储模式决定,small模式下,调 用距离为NEAR。可省略。2)作用范围:为PUBLIC、PRIVATE等,表示该过程是否 对其他模块可见(可引用
11、)。默认为PUBLIC,表示 该过程其他模块可见(可引用)。可省略。3)起始参数:是一个可带参数的宏的名字。该宏决定 过程的起始代码和结束代码,例如控制参数如何设 置、如何保存寄存器等。MASM调用的宏由用户自行 定义。可省略。,20,过程定义举例,例5.3 过程定义 checksumd PROC c USES bx cx,countp:word,arryp:wordmov bx,arrypmov cx,countp retchecksumd ENDP,语言类型,寄存器列表,形参、形参类型,21,过程调用,3.过程调用伪指令 INVOKEINVOKE 过程名,实参1,实参2,INVOKE ch
12、ecksumd,count,offset array调用时:实参用逗号打头,且用逗号分隔。实参1替换形参1,实参2替换形参2。例题5.3源程序(语言类型:C)例题5.3汇编结果 例题5.3a源程序(语言类型:STDCALL)例题5.3a汇编结果,22,过程定义的说明(end),几点说明:如果在过程中使用参数,必须指定语言类型。如果在.MODEL语句中和过程定义中都没有指定语言类型,会产生汇编错误。如果在.MODEL语句中指定了语言类型,则过程声明和过程定义中可以省略语言类型。.MODEL SMALL,C;指定了C语言类型 过程定义和过程声明必须一致。如编程过程中修改了一个,忘记修改另一个,则会
13、造成错误。为避免此种情况发生,可以把全部过程定义放在代码段内开始的部分(.STARTUP之前),而省略过程声明。,返回第五章,回 5.1,23,5.2宏结构程序设计,5.2宏结构程序设计对常用的、具有独立功能的程序段,除了可定义为过程外,还可定义为宏结构或宏指令。宏指令提供了简化程序设计的另一种方法。通常与宏指令配合使用的伪指令还有重复汇编和条件汇编。宏指令、重复汇编和条件汇编统称宏结构。本节介绍宏指令的定义和调用,以及重复汇编和条件汇编。5.2.1 宏汇编 5.2.2 重复汇编 5.2.3 条件汇编,返回第五章,24,5.2.1 宏汇编 宏的定义和调用,5.2.1 宏汇编1.宏的定义和调用、
14、宏展开宏定义宏名 MACRO 形参1,形参2,宏定义体;指令语句的组合 ENDM宏调用 宏名 实参1,实参2,,例题5.4a+5.4b,25,宏展开,宏展开 汇编时,用宏体取代宏调用,用实参取代形参,称为宏展开。宏展开时,实参替代形参按位置匹配的原则。实参与形参的个数可以不等,参数替换时,多余的实参不于考虑;多余的形参以空格替代。实参替代形参时,不进行类型检查,完全是字符串的替代,替代后是否合法有效,由汇编程序翻译时进行语法检查。宏展开后5.4B,26,宏的参数及宏操作符,2.宏的参数 参数的形式灵活多变,可以是常数、变量、存储单元、指令操作码或它们的一部分,也可以是表达式,使用灵活多变的参数
15、,同一个宏定义甚至可以执行不同的操作。几个宏操作符:替换操作符:用于将参数与其他字符分开。用在宏体中。如果参数紧接在其他字符之前或之后,或者参数出现在带引号的字符串中,就必须使用该伪操作符,27,宏操作符,:字符串传递操作符:用在宏调用的实参中。在宏调用中,如果传递的字符串实参数含 有逗号、空格等间隔符号,则必须用这对 操作符,以保证字符串的完整!:转义操作符:指示其后的一个字符作为一般 字符,无特殊意义。如!/!:宏注释符,用于表示在宏定义中的注释。采 用这个符号的注释,在宏展开时不出现,例题5.5A、5.5B、5.6,“:REQ、:=默认值”可参考宏汇编大全,28,与宏有关的伪指令1,3.
16、与宏有关的伪指令局部标号伪指令LOCAL 标号列表;当宏定义体内有标号,同一程序内多次调用,会造成标号的重复定义。用LOCAL说明的标号,第一次宏展开时,产生的标号为?0000,第二次宏展开时产生的标号为?0001,(?ffff)注释:只能在宏体内使用。只能紧接在宏定义语句之后使用。,29,与宏有关的伪指令2,如宏定义:ABSOL MACRO OPRD LOCAL NEXT CMP OPRD,0 JGE NEXT NEG OPRD NEXT:ENDM宏调用1:ABSOL WORD PTR BX宏调用2:ABSOL BX,30,与宏有关的伪指令3,宏展开后的代码:CMP WORD PTRBX,0
17、JGE?0000NEG WORD PTRBX?0000:CMP BX,0JGE?0001NEG BX?0001:,第一个宏展开,第二个宏展开,31,与宏有关的伪指令2,宏定义删除PURGE 宏名表;在各类名字中,只有宏名可以和指令同名;当同名时,宏定义优先级最高。宏定义退出(宏展开退出)EXITM;对EXITM后面的语句停止宏展开。,32,宏与子程序,4.宏与子程序相同点:简化源程序的设计和结构不同点:处理时间段不同。对目标程序的长度影响不同。对目标程序执行速度的影响不同。传递参数的方式不同;传递参数过程中如出现错误,错误的性质不同。(宏:语法;子程序:逻辑)通常,当程序段较短,要求较快执行时
18、,用宏定义。当程序段较长,或为减小目标代码长度,用子程序。,回 5.2,33,5.2.2重复汇编,5.2.2重复汇编 重复汇编指在汇编过程中,重复展开一段(基本)相同的语句。如果程序中需要连续重复一段相同的语句或基本相同的语句,可以使用重复汇编伪指令,也就是让汇编程序代替程序员完成重复的工作。重复汇编伪指令常在宏体内使用,但也可以在宏体外使用。重复汇编没有名字,不能被调用。重复汇编伪指令有3条,3条伪指令区别在于如何规定重复次数。,34,按参数值重复伪指令,1.按参数值重复伪指令 REPEAT 重复次数重复体 ENDM,例5.8 定义26个大写字母char=AAztabel EQU THIS
19、BYTEREPEAT 26DB charchar=char+1ENDM,汇编结果:DB charchar=char+1DB charchar=char+1DB charchar=char+1,35,按参数个数重复伪指令,1.按参数个数重复伪指令 FOR 形参,重复体 ENDM,例5.9a 保护常用寄存器FOR regad,PUSH regadENDM,汇编结果:PUSH AXPUSH BXPUSH CXPUSH DX,形参:重复体中使用的参数 注意:形参只有一个实参:汇编展开时使用的参数,用其替换重复体中出现的形参;按实参个数重复。必须使用“”括起。,36,按参数字符个数重复伪指令,1.按参数
20、字符个数重复伪指令 FORC 形参,字符串;FORC 形参,重复体 ENDM,例5.9b 恢复常用寄存器FORC regad,dcbaPOP®ad&xENDM,汇编结果:POP DX POP CXPOP BXPOP AX,回 5.2,37,5.2.3 条件汇编,5.2.3 条件汇编条件汇编伪指令使汇编程序根据某种条件是否成立决定是否汇编某段语句序列条件汇编伪指令格式:IFxx 表达式分支语句体 1ELSE分支语句体 2ENDIF伪指令中的“xx”为组成条件汇编伪指令的其他字符,不同的“xx”,表达的条件不同。如“IF 表达式”,表达的条件为:如表达式的值不为0,则条件满足;“IFE 表达
21、式”表达的条件为:如表达式的值为0,则条件满足。(见教材表5.3),38,条件汇编伪指令(IF|IFE)中的表达式,条件汇编伪指令(IF|IFE)中的表达式:运算符使用第三章介绍的关系运算符:EQ、NE、GT、LT、GE、LE 注意,不同于条件控制伪指令(.IF)中使用的运 算符。表达式用0FFFFH(或任意非0数)表示真,用0表 示假。,39,例5.10,例5.10:定义一个元素个数不超过100个的数组。PDATAMACRO NUM IF NUM LT 100 DB NUM DUP(?)ELSE DB 100 DUP(?)ENDIFENDM,宏调用:PDATA 12宏展开:DB 12 DUP
22、(?),宏调用:PDATA 105宏展开:DB 100 DUP(?),40,例5.11/1,例5.11 编写宏MAXNUM,计算3个以内的数据中的最大值,并将结果送入AX寄存器,要求根据宏调用时的实参个数展开相应代码。分析:1)至少应有一个参数,故第一个参数设为不 可缺少;2)宏指令应能够作到:根据实参情况产生不 同的程序段,进行不同的处理。实参可分 三种情况:A.只有一个参数 B.有两个参数 C.有三个参数 显然,应使用条件汇编。,41,/2,MAXNUM MACRO WX:REQ,WY,WZLOCAL MAXNUM1,MAXNUM2MOV AX,WX;只有一个实参替换WX IFNB;还有W
23、Y时CMP AX,WYJGE MAXNUM1MOV AX,WYENDIFMAXNUM1:IFNB;当有WZ时,汇编本段CMP AX,WZJGE MAXNUM2MOV AX,WZENDIFMAXNUM2:ENDM,42,/3,宏调用:汇编结果:,Maxnum bx;只有1个参数,Mov ax,bx;只有1个参数,Maxnum 3,4;有2个参数,Mov ax,3 Cmp ax,4 Jge?0000 Mov ax,4?0000:,43,/4,宏调用:汇编结果:,Maxnum n1,n2,n3;有3个参数,mov ax,n1 cmp ax,n2 jge?0000 mov ax,n2?0000:cmp
24、 ax,n3 jge?0001 mov ax,n3?0001:,注意区别条件控制伪指令 和条件汇编伪指令,44,P149例题/1,P149例题:用宏结构实现信息显示。dstringMACRO string;定义字符串db 显示,形参为偏移地址mov dx,offset messagemov ah,09hint 21hENDM,45,/2,mainendMACRO retnum;返回DOS,可不带参数 ifb;宏调用没有实参数 mov ah,4ch else;有参数 mov ax,4c00h+(retnum AND 0ffh)endif int 21hENDM,保证不破坏AH的内容,46,/3,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 高级 汇编语言 程序设计

链接地址:https://www.31ppt.com/p-6379936.html