《8-第三章、程序设计的基本技巧(3.3-3.7)课件》由会员分享,可在线阅读,更多相关《8-第三章、程序设计的基本技巧(3.3-3.7)课件(51页珍藏版)》请在金锄头文库上搜索。
1、程序设计的基本技术程序设计的基本技术(3.33.7内容内容)复复 习习v8086的指令系统的指令系统数据传送类指令数据传送类指令 MOVMOV、XCHGXCHG、PUSHPUSH、POPPOP、ININ、OUTOUT、XLATXLAT、LEALEA、PUSHFPUSHF、POPFPOPF、ADD ADD 、ADC ADC 、INCINC、SUBSUB、SBBSBB、DECDEC、NECNEC、CMPCMP、MULMUL、DIVDIV、CBWCBW、CWDCWD、DAADAA逻辑运算类指令逻辑运算类指令 ANDAND、OROR、XORXOR、NOTNOT、TESTTEST、SALSAL、SARS
2、AR、SHLSHL、SHRSHR、 ROLROL、RORROR、RCLRCL、RCRRCR程序控制类指令程序控制类指令callcall、jmpjmp、retret、jxxjxx、looploop、intint、iretiret处理器控制类指令处理器控制类指令 XXX:STCXXX:STC、CLCCLC串操作类指令串操作类指令 reprep、movsmovs8086的汇编程序框架的汇编程序框架(简化定义格式):(简化定义格式): .model small .stack .data ;数据定义数据定义 .code start:mov ax,data ;程序中要执行的第一条指令的标号程序中要执行的第
3、一条指令的标号 mov ds,ax ;程序代码程序代码 mov ah,4ch; 或者或者 mov ax,4c00h int 21h end start ; 8086的汇编程序框架:的汇编程序框架: DATA SEGMENT (DB、DW、$)DATA ENDSSTACK SEGMNET STACK STACK ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATA, ES:DATA,SS:STACK START:MOV AX, DATA ;程序中要执行的第一条指令的标号;程序中要执行的第一条指令的标号 MOV DS, AX; MOV ES, AX . MOV AH ,
4、 4CH ;返回;返回DOS操作系统操作系统 INT 21HCODE ENDS END START ; 程序设计的几种基本结构程序设计的几种基本结构顺序程序结构顺序程序结构分支程序结构分支程序结构循环程序结构循环程序结构子程序结构子程序结构一一 、 顺序程序设计顺序程序设计 特点:特点:程序运行时,完全按照编写的指令顺序执行,程序运行时,完全按照编写的指令顺序执行,且每条指令仅执行一次。且每条指令仅执行一次。 例例1:1:两个字型单元两个字型单元M1M1和和M2M2中各有一中各有一1616位无符号数位无符号数, ,将它们相将它们相乘的结果存入乘的结果存入N1N1和和N2N2单元单元. .分析:
5、要使用到无符号数乘法指令分析:要使用到无符号数乘法指令 MULMUL格式:格式: MUL OPRD MUL OPRD ;OPRDOPRD为其中的一个操作数;另一个隐含放在为其中的一个操作数;另一个隐含放在ALAL或或AXAX中中程序流程图程序流程图:AX M1DX,AX (AX)M2N1 (AX)N2 (DX)开始开始结束结束源程序:源程序:.model small.stack.data m1 dw 1234H m2 dw 2345H n1 dw ? n2 dw ?.code Start:mov ax,data mov ds,ax mov ax,m1 mul m2 mov n1,ax mov
6、n2,dx mov ah,4cH ; int 21H END Start v见书见书P60例例3.4例例3: 3: 利用查表法,从键盘上输入利用查表法,从键盘上输入0 0到到9 9中的任一自然数中的任一自然数x x,将其立方值送将其立方值送xxxxxx字存储单元。字存储单元。X3值所在地址的值所在地址的EA与与X对应关系为:对应关系为:(tab2*X)为)为X3值所在地址值所在地址EA 具体程序见文档具体程序见文档程序程序-立方立方作业作业14(课堂)(课堂)1、将、将AX中小于中小于255大于大于0的的3位压缩位压缩BCD码数转换为二进制码数转换为二进制数,存放于字节变量数,存放于字节变量S
7、B中。(要求:完整的简化段定义书中。(要求:完整的简化段定义书写)写)二、分支程序设计二、分支程序设计特点:特点:在程序运行过程中,依据不同情况,在几个程序段中选在程序运行过程中,依据不同情况,在几个程序段中选择其一,由转移指令来实现。择其一,由转移指令来实现。复习:用于实现分支的转移指令:复习:用于实现分支的转移指令:一、无条件转移指令一、无条件转移指令 格式:格式:JMP 目标地址目标地址 功能:执行指令后,无条件地转移到功能:执行指令后,无条件地转移到“目标地址目标地址”处,而不处,而不执行下一条指令。执行下一条指令。二、条件转移指令二、条件转移指令 格式:格式:J* 目标地址目标地址
8、功能:功能:若条件成立,则转移至目标处指令,否则顺序执行。若条件成立,则转移至目标处指令,否则顺序执行。 该该指令都是以标志寄存器中某一个或几个标志位作为判断指令都是以标志寄存器中某一个或几个标志位作为判断条件(标志位有:条件(标志位有:CF、ZF、SF、OF和和PF) 如:如:JC L1v见书见书P61例例3.5v见书见书P62例例3.6作业作业14(课堂)(课堂)2、X为符号数为符号数,要求要求Y1 X00 X=01 X=(SI)?AL (SI)N Y(CX)-1=0? MAX (AL)YNBIGER:LOP:开始开始结束结束程序代码段:程序代码段: MOV SI,OFFSET ARRAY
9、 MOV CX,9 ;重复次数;重复次数 MOV AL,SI ;赋初值;赋初值 LOP:INC SI ;取下一个数;取下一个数 CMP AL,SI ;比较大小;比较大小 JAE BIGER MOV AL,SI ;重新赋最大值;重新赋最大值 BIGER:LOOP LOP ;继续循环;继续循环 MOV MAX,AL ;最大值送存储单元;最大值送存储单元 v计数控制循环,见书计数控制循环,见书P64例例3.8、3.9、3.10v条件控制循环,见书条件控制循环,见书P66例例3.11、3.12v串操作类指令,见书串操作类指令,见书P68例例3.13、3.14作业作业14(课堂)(课堂)3、编写将某数据
10、区中的十六进制数加密的程序,每个数字占编写将某数据区中的十六进制数加密的程序,每个数字占一个字节。其中数据放在一个字节。其中数据放在data起始的起始的10个字节单元中。(要个字节单元中。(要求:完整的简化段定义书写)求:完整的简化段定义书写)十十六六进制制数数0123456789ABCDEF加加密密数数A98EF10B25D3746C四、子四、子 程程 序序主要讨论的问题:主要讨论的问题:v子程序的定义子程序的定义v子程序的调用与返回指令子程序的调用与返回指令v子程序的设计要求子程序的设计要求v子程序设计举例子程序设计举例 (1)子程序的定义)子程序的定义 定义:在程序设计中,通常将多次反复
11、使用、具有定义:在程序设计中,通常将多次反复使用、具有一定功能的程序段设计为一个子程序,在程序中使一定功能的程序段设计为一个子程序,在程序中使用程序过程定义伪指令来定义子程序。用程序过程定义伪指令来定义子程序。 过程定义伪指令语句格式过程定义伪指令语句格式 过程名过程名 PROC NEAR/FAR ;PROC表示过程的起始表示过程的起始 RET 过程名过程名 ENDP ;ENDP表示过程的结束表示过程的结束 过程名有过程名有3个属性个属性:偏移量属性、段属性和类型属性。:偏移量属性、段属性和类型属性。 (2 2)子程序的调用与返回)子程序的调用与返回 调用指令:调用指令:段内直接调用段内直接调
12、用段内间接调用段内间接调用段间直接调用段间直接调用段间间接调用段间间接调用返回指令返回指令段内返回段内返回段间返回段间返回带参数的返回指令带参数的返回指令调用指令调用指令 1、段内直接调用、段内直接调用 指令格式:指令格式:CALL 过程名过程名/子程序名子程序名 注意:过程名注意:过程名/子程序名的类型属性必需是子程序名的类型属性必需是NEAR指令功能:指令功能: a、将将返返回回地地址址的的偏偏移移量量压压栈栈。返返回回地地址址是是CALL指指令令的的下下一一条地址,即条地址,即IP的内容,将其压栈的内容,将其压栈 b、形成子程序入口地址送到、形成子程序入口地址送到IP c、不影响如何标志
13、位、不影响如何标志位 2、段内间接调用、段内间接调用 要要求求将将子子程程序序的的入入口口地地址址放放在在16位位的的通通用用寄寄存存器器或或存存储单元中储单元中 例:例: CALL BX ;将;将IP的内容压栈、的内容压栈、BX的内容送到的内容送到IP CALL WORD PTR SI; 将将IP的内容的内容压栈、压栈、(SI指指 向的字单元向的字单元)送到送到IP 3、段间直接调用、段间直接调用例:例: CALL FAR PTR PROCB ;将将返返回回地地址址压压栈栈,即即(CS)、(IP)压栈,将形成的子程序入口地址送到压栈,将形成的子程序入口地址送到CS、IP中中 4、段间间接调用
14、、段间间接调用 要求将子程序的入口地址放在一个双字存储单元中,低要求将子程序的入口地址放在一个双字存储单元中,低字单元存偏移量,高字单元存段基值字单元存偏移量,高字单元存段基值例例 : CALL DWORD PTR ADDR;将返回地址压栈,即;将返回地址压栈,即( (CS)、( (IP)压栈,然后形成子程序入口地址,将压栈,然后形成子程序入口地址,将ADDR指向的双字指向的双字内容内容( (ADDR)送到送到IP、( (ADDR2)送到送到CS中中 返回指令返回指令 1、 段内返回段内返回格式:格式: RET机器指令编码:机器指令编码:C3H 功能:功能:a、将(栈顶字单元)送到、将(栈顶字
15、单元)送到IP b、(、(SP)2 送到送到SP c、不影响标志位、不影响标志位2、段间返回、段间返回格式格式: RET机器指令编码:机器指令编码:CBH 功能:功能:a、返回地址偏移量送到、返回地址偏移量送到IP b、返回地址段基值送到、返回地址段基值送到CS c、不影响标志位、不影响标志位 3、带参数的返回指令、带参数的返回指令 例:段内带参数返回指令例:段内带参数返回指令 格式:格式:RET n; 功能:功能: a、返回地址偏移量送到、返回地址偏移量送到IP,(SP)2送到送到SP b、(SP)n送到送到SP(3)子程序设计的要求)子程序设计的要求 编写子程序时要满足以下要求:编写子程序
16、时要满足以下要求:1、具有通用性、具有通用性2、主程序与子程序之间的参数传递方式:、主程序与子程序之间的参数传递方式: 寄存器传送寄存器传送 、参数传送、参数传送 、堆栈传送、堆栈传送 3、注意保存信息,通常保存信息的方法:、注意保存信息,通常保存信息的方法: 调用程序中保存信息、子程序中保存信息调用程序中保存信息、子程序中保存信息4、正确使用堆栈、正确使用堆栈 (4 4)子程序设计举例)子程序设计举例 例:将例:将8/16位二进制数按位转换成它的位二进制数按位转换成它的ASCII串,并将转换结果串,并将转换结果存放到指定的存储单元中。存放到指定的存储单元中。分析分析: 程序采用主、子程序结构
17、。程序采用主、子程序结构。 主程序:提供被转换的数,存放转换后主程序:提供被转换的数,存放转换后ASCIIASCII串首址;串首址; 子程序:完成将二进制数转换为子程序:完成将二进制数转换为ASCIIASCII串,转换要求从高串,转换要求从高 位到低位依次进行位到低位依次进行 入口参数:待转换数据、位数、存放转换入口参数:待转换数据、位数、存放转换ASCIISCII码码结果首址结果首址 出口参数:无出口参数:无 程序的数据段和堆栈转:程序的数据段和堆栈转:.model small.data BIN8 DB 53H ; 01010011B BIN16 DW 0A84BH ASCBUF 20H D
18、UP(0) ;WHY?.stack 1、寄存器传递参数、寄存器传递参数 入入口口参参数数:待待转转换换数数在在DX中中,待待转转换换数数位位数数在在AX,存放结果存放结果ASCII首址在首址在DI中中 信息保存由主程序完成。信息保存由主程序完成。 程序见文本程序见文本子程序子程序-寄存器法寄存器法 2、堆栈传递参数、堆栈传递参数 首首先先在在主主程程序序中中将将参参数数压压入入堆堆栈栈中中,然然后后在在子子程程序序中从堆栈中取出参数中从堆栈中取出参数 上例中将待转换数、待转换数位数、存放结果上例中将待转换数、待转换数位数、存放结果ASCII的首址先压入堆栈中的首址先压入堆栈中 保存信息的工作由
19、子程序完成保存信息的工作由子程序完成 程序见文本程序见文本子程序子程序-堆栈法堆栈法v见书P73例3.17v见书P73例3.18v见书P75例3.19v作业作业14(课堂)(课堂) 4、编制程序,反复从键盘输入字符,并将其送显编制程序,反复从键盘输入字符,并将其送显示器显示,当输入示器显示,当输入“Enter”键时,结束程序。键时,结束程序。程序编制中常见的问题程序编制中常见的问题1、设计好数据段,充分使用、设计好数据段,充分使用“$”例:表格形的数据段,如要设计一个数组,其中学号、名例:表格形的数据段,如要设计一个数组,其中学号、名次是字变量,分数是字节变量次是字变量,分数是字节变量DA S
20、EGMENTXH DW 1 DB 90 DW ? DW 2 DB 80 DW ? N=($-XH)/5 第一个第一个第二个第二个2、选择合适的指令及寻址方式、选择合适的指令及寻址方式指令要求无语法错误指令要求无语法错误 *双操作数指令中,不能同时为存储器双操作数指令中,不能同时为存储器 例:例:MOV A, B MOV BX,SI MOV NUM, 2 *单操作数指令,操作数可以是寄存器或存储器,但不单操作数指令,操作数可以是寄存器或存储器,但不能为立即数能为立即数 例:例: INC AX INC A INC BX INC BYTE PTR BX *寄存器号不能出现在不带寄存器号不能出现在不带
21、 的表达式中的表达式中 例:例: MOV AX, SI+1*注意寻址方式的区别注意寻址方式的区别 例例: ADD SI,SI ;SI的内容改变否?的内容改变否? ADD SI, SI*不要插入不必要的指令不要插入不必要的指令 例:例: DEC BX CMP BX, 0 JNE LOP3、合理安排源程序格式用、合理安排源程序格式用“ ;”号对程序进行注释号对程序进行注释宏功能程序设计宏指令的使用要经过两个基本步骤:宏指令的使用要经过两个基本步骤: (1)宏宏定定义义:使使用用伪伪指指令令MACRO、ENDM将将重重复复的的语语句句序序列列定定义义成成宏宏指指令令,选选定定好好形形参参,并并为为该
22、该宏宏指令取一符号名(简称宏名字)指令取一符号名(简称宏名字) (2)宏宏调调用用:在在程程序序中中需需要要的的地地方方通通过过带带实实参参的的宏名字(宏指令)来调用宏定义宏名字(宏指令)来调用宏定义 (1 1)宏定义)宏定义 语句格式:语句格式: 宏指令名宏指令名 MACRO 形式参数形式参数 ,形式参数,形式参数 宏体宏体 ENDM 例:在某个程序中,由于要经常输出例:在某个程序中,由于要经常输出缓冲区中的字符串,需要反复进行缓冲区中的字符串,需要反复进行9号功能调用。号功能调用。 LEA DX, BUF1 MOV AX, 9 INT 21H LEA DX, BUF2 MOV AX, 9
23、INT 21H LEA DX, BUF3 MOV AX, 9 INT 21H 宏指令定义格式为:宏指令定义格式为: WRITE MACRO A LEA DX, A MOV AX, 9 INT 21H ENDM()宏调用()宏调用 调用格式:调用格式: 宏指令名宏指令名 实在参数实在参数,实在参数,实在参数若使若使用宏指令的调用用宏指令的调用 WRITE MACRO A LEA DX, A MOV AX, 9 INT 21H ENDM WRITE BUF1 WRITE BUF2 WRITE BUF3 LEA DX, BUF1 MOV AX, 9 INT 21H LEA DX, BUF2 MOV AX, 9 INT 21H LEA DX, BUF3 MOV AX, 9 INT 21H v见书P94例3.21三、宏功能程序与子程序的区别三、宏功能程序与子程序的区别 子程序子程序 优点:编译时产生的机器代码短优点:编译时产生的机器代码短 缺点:调用时开销较大缺点:调用时开销较大宏功能程序宏功能程序 优点:源程序结构清晰,程序短优点:源程序结构清晰,程序短 缺点:编译时产生的机器代码长,占用缺点:编译时产生的机器代码长,占用 较多的内存空间较多的内存空间