高级汇编语言程序设计.ppt

上传人:牧羊曲112 文档编号:6379936 上传时间:2023-10-22 格式:PPT 页数:89 大小:314.99KB
返回 下载 相关 举报
高级汇编语言程序设计.ppt_第1页
第1页 / 共89页
高级汇编语言程序设计.ppt_第2页
第2页 / 共89页
高级汇编语言程序设计.ppt_第3页
第3页 / 共89页
高级汇编语言程序设计.ppt_第4页
第4页 / 共89页
高级汇编语言程序设计.ppt_第5页
第5页 / 共89页
点击查看更多>>
资源描述

《高级汇编语言程序设计.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,

25、.model small.stack 256.datamsg1 equ this bytedstringmsg2 equ this bytedstring.codestart:mainbegin data;建立DS内容dispmsg msg1;显示msg1字符串dispmsg msg2;显示msg2字符串mainend;返回DOSend start,回 5.2,返回第五章,47,5.3 模块化程序设计,5.3 模块化程序设计 开发大型或较复杂的程序时,往往需要结合使用其他方法,如源程序文件的包含、目标代码文件的连接、子程序库的使用等等。本节简单介绍以上三种方法。5.3.1 源程序文件的包含 5

26、.3.2 目标代码文件的连接 5.3.3 子程序库的使用,返回第五章,48,5.3.1 源程序文件的包含,5.3.1 源程序文件的包含 对大型源程序,可以分成几个源文件,待汇编时在用包含伪指令INCLUDE将它们结合成一个文件进行汇编。格式为:INCLUDE 文件名 汇编时,汇编程序将指定的文件插在伪指令所在的位置,与其他部分同时汇编。适用于:汇集常用的子程序为一个源文件(.asm);汇集常用的宏定义为一个宏库文件(.mac);汇集常用的常量定义和声明为一个包含文件(.inc)。当源程序需要使用上述文件中的某些内容时,不用重新编写,只要使用包含伪指令将文件包含即可。,49,例5.12a,例5.

27、12a 利用源程序包含的方法实现将输入的数据按升序输出。要求:最多输入100个无符号字节数据;以十六进制形式输入;按照升序排序并显示。源程序由三个单独的文件组成:宏库文件 lt512a.mac(显示字符和字符串)子程序文件 sub512a.asm(输入、排序)主程序文件 lt512a.asm(提供入口参数、处理 出口参数、排序、显示),50,宏库文件 lt512a.mac,1)宏库文件 lt512a.macdispcharmacro char;显示char字符mov dl,charmov ah,2int 21hendmdispmsgmacro message;显示message字符串mov d

28、x,offset messagemov ah,9int 21hendm,51,子程序文件 sub512a.asm,2)子程序文件 sub512a.asm子程序源文件有3个子程序ALdisp;显示2位16进制数子程序(例4.10)sorting;排序子程序(例4.8)input;键盘输入子程序(后面分析)还包含一个宏convert;将DX两位ASCII码转换为两位16进制数,52,主程序文件 lt512a.asm,3)主程序文件 lt512a.asm include lt421a.mac;包含宏库文件,置于主程.model/.stack/.data/.code等 序头部dispmsg msg1;

29、提示输入数据mov bx,offset bufcall input;数据输入cmp cx,0je start4;没有输入数据则退出mov count,cx.;显示输入的数据.;数据排序.;显示经排序后的数据start4:.exit 0include sub421a.asm;包含子程序文件end,将三个文件分别编辑,主程序文件用两条包含伪指令将宏库文件和子程序文件包含(注意包含伪指令的位置),然后汇编并连接主程序文件,即可得到可执行文件。,53,键盘输入子程序/1,键盘输入子程序:;每次输入1位或2位 十六进制数字;空格或逗号确认输入;退格键删除当前输入 的数据;回车表示所有数据 输入结束。;入

30、口参数:ds:bx=存放数据的缓冲区;出口参数:cx=数据个数,54,/2,inputprocpush axpush dxxor cx,cx;数据个数清0input01:xor dx,dx;输入字符清0input02:mov ah,1;键盘输入一个字符int 21h,55,/3,input10:cmp al,0dhje input30;是回车,结束整个数据的输入cmp al,je input20 cmp al,je input20;是空格和逗号,确认输入了一个数据cmp al,08hje input17;是退格,丢弃本次输入的数据,出错,56,/4,cmp al,0;有效数字判断(图5.2b)

31、jb input17;小于0,不是有效数字,出错cmp al,fja input17;大于f,不是有效数字cmp al,ajb input11;检查是否再aF之间sub al,20h;af转换成大写AFjmp input12;有效数据处理input11:cmp al,Fja input17;字符小于a、大于F,出错cmp al,Ajae input12;是AF,有效字符cmp al,9ja input17;字符小于A、大于9,出错,57,/5,input12:cmp dl,0;有效字符的处理jne input13;dl0(已经有一位数据)mov dl,al;dl=0,输入了一个数据的高位,则d

32、laljmp input02;转到字符输入input13:cmp dh,0jne input17;dl0,dh0输入3位数据,出错mov dh,dl;dl0,dh0输入了一个数据的低位mov dl,al;dhdl,dlaljmp input02;转到字符输入,58,/6,input17:mov dl,7;输入错误处理(07h,控制码:鸣镝)mov ah,2int 21hmov dl,?mov ah,2int 21hjmp input01;转到输入一个数据,59,/7,;确认一个数据后,转换正确的输入数据(图5.2c)input20:convertjmp input01;转到输入一个数据;收到回

33、车符,最后一个数据输入结束,转此input30:convertpop dxpop axret;返回,出口参数已设定inputendp,60,宏:convert macro/1,;将DX两位十六进制形式的ASCII码转换为两位16进制数(8位二进制数):convertmacrolocal input21,input22local input24,input25cmp dl,0je input25;dl=0,没有要转换的数据,退出,61,/2,cmp dl,9jbe input21sub dl,7;字符AF,则减7input21:and dl,0fh;转换低位cmp dh,0;dh=0,没有高位数

34、据je input24cmp dh,9jbe input22sub dh,7;字符AF,则减7input22:shl dh,1;高位乘16shl dh,1shl dh,1shl dh,1;转换高位or dl,dh;合并高、低位,62,/3(end),input24:mov bx,dl;存入缓冲区 inc bx inc cx;数据个数加1input25:endm,Back5.3,63,5.3.2目标代码文件的连接,5.3.2 目标代码文件的连接 将常用子程序写成一个或多个源文件,并对其进行汇编,得到一个个单独的OBJ文件;对主程序也单独进行汇编得到OBJ文件,最后利用连接程序把多个OBJ文件连接

35、,形成可执行文件。用这种方法可缩短汇编时间,但宏结构文件、常量定义、声明文件等文件通常仍编辑成包含文件,因此这种方法往往和“源程序文件的包含”共同使用。需要遵循的原则:声明共用的变量、过程等 实现正确的段组合 处理好参数传递问题,64,/原则1,原则1各个模块间公用的变量、过程等要说明PUBLIC 标识符,标识符.;定义标识符的模块使用EXTERN 标识符:类型,标识符:类型.;调用标识符的模块使用 标识符是变量名、过程名等 类型是byte/word/dword(变量)或near/far(过程)在一个源程序中,public/extern语句可以有多条各模块间的public/extern伪指令要

36、互相配对,并且指 明的类型互相一致,65,/原则2,原则2子程序文件必须定义在代码段中,也可以具有局部的数 据变量采用简化段定义格式,只要采用相同的存储模式,容易 实现正确的近或远调用完整段定义格式中,为了实现模块间的段内近调用(near类型),各自定义的段名、类别必须相同,组合 类型都是public。实际的程序开发中,各个模块往往由 不同的程序员完成,不易实现段同名及类别相同,所以 索性定义成远调用(far类型)定义数据段时,同样也要注意这个问题。当各个模块的数据段不同时,要正确设置数据段DS寄存器的段基地址。,66,/原则3,原则3少量参数可用寄存器或堆栈直接传送数据本身大量数据可以安排在

37、缓冲区,用寄存器或堆栈传送数据 的存储地址还可利用变量传递参数,但是要采用public/extern声 明为公共(全局)变量 这些也是子程序间的参数传递方法另外,更好的传递参数方法是用堆栈传递参数。,67,例5.12b,例5.12b 利用目标代码文件连接的方法,实现将输入的数据按升序输出。宏定义并入主程序lt512b.asm。子程序文件sub512b.asm,要加上段定义语句、声明语 句等,但不需要起始点和结束点。模块连接的操作步骤:分别编辑生成各个文件 分别汇编各个文件 连接各个目标文件,形成可执行文件,68,例5.12b主程序,例5.12b 主程序:.;宏定义(也可以使用包含语句).cod

38、epublic count;定义(本模块的)count公用extern ALdisp:near,sorting:near,input:far;声明其他模块中的子程序.startup.exit 0;去掉(lt512a.asm中的)包含语句end,69,例5.12b子程序(end),例5.12b子程序.model small;定义同样的存储模式extern count:word;在其他模块定义了字变量count.code;子程序在代码段中public aldisp,sorting,input;3个子程序是共用的Aldispproc;仍然作为近调用sortingproc;仍然作为近调用inputpr

39、oc far;修改为远调用.mov count,cx;提供出口参数.inputendpend;结束汇编,Back5.3,70,5.3.3 子程序库的使用,5.3.3 子程序库的使用 将子程序源文件生成OBJ文件,然后和主程序连接,由于被连接的每个OBJ文件的全部代码都会成为可执行程序的一部分,在最后生成的可执行文件中,会包括无用的子程序,造成可执行程序庞大。为此,可使用子程序库。子程序库(.LIB文件)是子程序模块的集合,库文件中存放着各子程序的名称、目标代码以及有关的定位信息。执行连接程序时,只要指定所需要的库文件,连接程序将从库文件中摘取主程序调用的子程序,而未调用的子程序不会进入最后的可

40、执行程序。库文件由MASM提供的LIB.EXE程序管理。,71,例题5.12c/1,例题5.12c 利用子程序库的调入方法,实现将输入的数据按升序输出。实现步骤:1)编辑4个文件:主程序文件 lt512c.asm 子程序文件 sub512c1.asm(显示)子程序文件 sub512c2.asm(排序)子程序文件 sub512c3.asm(输入),72,例题5.12c/2,2)分别汇编,得到4个目标模块(obj文件)3)生成子程序库文件(或加入其它子程序库)LIB 库文件名+子程序目标文件名 LIB sub512c.lib+sub512c1.obj+sub512c2.obj+sub512c3.o

41、bj 4)运行连接程序:link lt512c.obj 提示输入库文件时,输入sub512c.lib(也可在主程序源文件中使用子程序库包含伪 指令includelib sub512c.lib。),73,例题5.12主程序,例题5.12主程序.;宏定义.code Extern ALdisp:near,sorting:near,input:near;声明其他模块中的子程序.startup.call input.exit 0 end,74,sub512c1.asm,sub512c1.asm.model small.codepublic aldispAldispproc.Aldispendpend,7

42、5,sub512c2.asm,sub512c2.asm.model small.codepublic sortingsortingproc.sortingendpend,76,sub512c3.asm(end),sub512c3.asm.model small.codepublic inputinputproc.inputendpend,Back5.3,返回第五章,77,5.4输入输出程序设计,5.4 输入输出程序设计 完成CPU与外设端口之间数据传送的程序称为输入输出程序。通常有3种端口,数据口、状态口以及控制口,分别对应接口中的数据寄存器、状态寄存器以及控制寄存器。每个端口有一个端口地址,

43、CPU使用该地址访问接口中的相应寄存器,执行输入输出的指令为IN指令和OUT指令。输入输出(数据交换)的方式分为两大类:程序控制输入输出方式和直接存储器存取方式(DMA方式)。由于该部分内容是微机原理和接口技术的主要内容之一,本节只进行简单介绍。,返回第五章,78,数据交换方式,79,1.无条件传送方式,1.无条件传送方式 CPU可以在任何时刻向端口写入数据和从端口读入数据,也就是说,CPU假设外设接口电路总是处于准备好的状态。采用无条件传送方式,只适用于简单外设(或定时关系以知的外设),如输出设备为数码显示电路,或输入设备为一组提供某种数据的开关,在这种情况下,CPU执行输出或输入操作不需要

44、任何先决条件。无条件传送方式局限性比较大,对大部分外设不适用,因而采用较少。,80,2.查询方式,2.查询方式 CPU在执行输入输出操作时,先查询外设的状态口,当状态口表示外设已准备好时,CPU执行输入输出操作;当状态口反映外设未准备好时,CPU继续查询状态口,直到外设准备好,再执行输入输出操作。,查询方式适用于大部分外设,但CPU的利用率较低。,81,3.中断传送方式,3.中断传送方式 中断传送方式基于计算机的中断控制系统。当外设准备好传送数据时,向CPU发出中断请求,如有关条件满足,则CPU响应中断请求,执行相应中断服务程序,完成数据的输入或输出,然后继续执行原来的程序。中断传送方式相对查

45、询方式,可提高CPU的利用率。以上三种传送方式虽然各不相同,但有一点是相同的,即通过CPU执行输入输出程序实现数据的传送,因而数据传输率低,要得到高数据传输速率,应采用直接存储器存取方式,即DMA方式,用DMA控制器控制数据的传输过程。,返回第五章,回 5.4,82,本章重点及习题分析,本章重点及习题分析本章重点 条件控制伪指令 循环控制伪指令 带参数的过程定义、声明及调用伪指令 宏结构的定义及宏调用 重复汇编伪指令 条件汇编伪指令,83,5.1,习题分析 5.1条件表达式中逻辑与“&”表示两者都为真,整个条件才为真,对于程序段:.if(X=5)&(AX!=BX)INC AX.endif用转移

46、指令实现上述分支结构,并比较汇编程序生成的代码序列。cmp x,5 cmp x,005hjnz n1 jne c0001cmp ax,bx cmp ax,bxjz n1 je c0001inc ax inc axN1:c0001:,84,5.2,5.2条件表达式中逻辑或“|”表示两者之一为真,整个条件就为真,对于程序段:.if(X=5)|(AX!=BX)INC AX.endif用转移指令实现上述分支结构,并比较汇编程序生成的代码序列。cmp x,5 cmp x,005h jz n1 je c0002 cmp ax,bx cmp ax,bx jnz n1 je c0001 jmp n2 c000

47、2:inc axN1:inc ax c0001:N2:,85,5.3,5.3 对于程序段.whileax!=10 mov bx,ax inc bx inc bx inc ax.endw用处理器指令实现上述循环结构,并与汇编结果比较。lop:cmp ax,10 jmp c0001 jz next c0002:mov bx,ax mov bx,ax inc bx inc bx inc bx inc bx inc ax inc ax c0001:cmp ax,00ah jmp short lop jne c0002 next:,86,5.4,5.4 对于程序段.repeat mov bx,ax in

48、c bx inc bx inc ax.until ax=10用处理器指令实现上述循环结构,并与汇编结果比较。lop:mov bx,ax c0001:mov bx,axinc bx inc bxinc bx inc bxinc ax inc axcmp ax,10 cmp ax,10jnz lopjne c0001,87,5.55.7,5.5 宏是如何定义、调用和展开的?5.6 宏定义中的形参有和特点?是如何进行形参和实参结合的?5.7 宏汇编、重复汇编与条件汇编有何异同?都是伪指令,都是在汇编时处理。宏汇编适用于多次使用的程序段;重复汇编适用于连续重复适用的语句;条件汇编适用于根据条件是否符合

49、,最终程序应包含的语句。,88,5.10,5.11,5.10 定义一个宏logical,代表4条逻辑运算指令:And/or/xor/test。logical macro scode,sdest,ssorcescode sdest,ssorce endm 宏调用:logical and,ax,bx logical xor,al,80h 5.11 修改logical,将neg指令包括进去。logical macro scode,sdest,ssorceifnb scode sdest,ssorceelsescode sdestendifendm 宏调用:logical neg,bx logical neg,byte ptrbx,89,5.12,5.12 编写一个宏指令 move doprnd,soprnd,实现任意寻址方式的字量源操作数送到目的操作数,包括存储单元到存储单元的传送功能。movemacro doprnd,soprndpush axmov ax,soprndmov doprnd,axpop axendm 宏调用:move ax,cx move bx,bx+si,end,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号