《微机原理与接口技术(楼顺天)-第4章3.pptx》由会员分享,可在线阅读,更多相关《微机原理与接口技术(楼顺天)-第4章3.pptx(28页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 程序设计是指为计算机编写的、能够接受并执行的、且具有实际意义的语句序列。对于汇编语言程序设计,了解指令系统、伪指令及宏指令是最基本的要求,这些内容在前面都已进行了介绍。合理地使用不同的指令进行汇编语言程序的编制仅仅是一个基础,是编出高质量程序的一个方面。然而程序设计的方法可体现出一个程序设计者的思路及运用指令的水平。4.3汇编语言程序设计第1页/共28页 程序设计是把解决实际问题的方法转化为程序。由于实际问题有简单与复杂之分,因此程序设计就需要根据解决问题的思路,运用一些基本的程序设计方法设计出解决不同问题的程序来。在汇编程序设计过程中,首先对要解决的问题的过程进行具体的描述,这也是编程的准
2、备阶段,对于较小的程序可以使用程序流程图。第2页/共28页对于对于较大的程序可以采用模块化程序设计较大的程序可以采用模块化程序设计方法。无论采用流程图还是模块化的方法设计都要使用程序设计方法。无论采用流程图还是模块化的方法设计都要使用程序设计的基本程序结构来表现出来。的基本程序结构来表现出来。基本的程序结构包括基本的程序结构包括顺序结构、分支结构、循环结构及子程序结构。顺序结构、分支结构、循环结构及子程序结构。由于不由于不同的问题可采用不同结构设计,因此需要对各种结构形式有所了解,才能找到解决某一问题的最佳程序结同的问题可采用不同结构设计,因此需要对各种结构形式有所了解,才能找到解决某一问题的
3、最佳程序结构形式。构形式。第3页/共28页 1.顺序结构程序设计 顺序结构是一种最简单的程序设计结构形式。采用这种结构只能完成简单的任务程序设计。顺序结构在任何结构的程序中都会出现,因此说它是基础。下面举一个顺序结构的程序设计例子,要求完成表达式所规定的操作:Y=X1+X2+X3。首先分析程序设计方法:表达式Y=X1+X2+X3的计算过程可采用顺序执行的方法来完成:首先读入数据X1、X2、X3;其次计算X1、X2、X3的和;最后保存结果到指定变量Y中。根据计算步骤编写汇编语言程序:利用伪指令确定存储器的分配,将X1、X2、X3定义为字变量;按照汇编语言源程序结构要求编写源程序。4.3 程序结构
4、设计技术 第4页/共28页 程序如下:PROGRAM ;*DATA SEGMENT DATA1 DW X1,X2,X3,?DATA ENDS ;*CODE SEGMENT ASSUME CS:CODE,DS:DATA 4.3 程序结构设计技术 第5页/共28页 START:MOV AX,DATA MOV DS,AX MOV AX,DATA1 ADD AX,DATA1+2 ADD AX,DATA1+4 MOV DATA1+6,AX HLT CODE ENDS ;*END START4.3 程序结构设计技术 第6页/共28页 可以看出,上面的源程序是由数据段和代码段两部分组成的。在数据段定义了X1
5、、X2、X3为自变量,在运行时应填入具体数值。代码段确定了各段与段寄存器的关系,并且以计算机的基本操作指令按顺序执行的结构形式将计算机操作过程进行描述,从而完成程序设计的最初阶段任务。一个源程序的编写过程还说明不了程序的正确性,必须经过上机调试,才能验证设计的程序是否符合要求。第7页/共28页 2.分支结构程序设计 在解决某些实际问题时,解决问题的方法随着某些条件的不同而不同,将这种在不同条件下处理过程的操作编写出的程序称为分支程序。程序中所产生的分支是由条件转移指令来完成的。汇编语言提供了多种条件转移指令,可以根据使用不同的转移指令所产生的结果状态选择要转移的程序段,对问题进行处理。采用分支
6、结构设计的程序,结构清晰、易于阅读及调试。4.3 分支程序设计技术 第8页/共28页4.3 分支程序设计技术 如果程序执行过程中,能够根据某种条件进行不同的处理,这样就构成了分支程序。由于CPU能够对执行的结果进行判断,从而作出相应的处理,使程序的功能得到大大的增强。一般来说,包含两条及多条分支的程序称为分支程序,这样,实际上几乎所有的程序都可以归类于分支程序。第9页/共28页4.3 单分支程序设计程序分支是通过有条件和无条件转移指令实现的,它们又与上一次CPU操作所产生的PSW中的标志位有关,有条件指令与标志位的关系可以参见第三章的表3.6。单分支程序结构第10页/共28页 在汇编语言程序设
7、计中,常常要使用多分支结构。多分支结构相当于一个多路开关,在程序设计中通常是根据某寄存器或某单元的内容进行程序转移。在设计多分支转移程序时,如果分支太多,则平均转移速度太慢。如果用转移地址表实现多分支转移,则可以提高平均转移速度。多分支结构如图 4-2 所示。例如,设计一个256分支的段内程序转移程序。设JUMP单元有一个数X,若X0,则转移到标号为P000的程序段;若X1,则转移到标号为P001的程序段,;若X255,则转移到标号为P255的程序段。4.3 多分支程序设计技术 第11页/共28页 图 4-2多分支结构第12页/共28页 DATA SEGMENT JUMP DB?;某数X TA
8、B DW P000;分支程序标号 DW P001 DW P255 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA 第13页/共28页 BEG:MOV AX,DATA MOV DS,AX MOV BL,JUMP MOV BH,0 ADD BX,BX ;2XBX寄存器 MOV SI,OFFSET TAB JMP BX+SI ;DS:BX+SIIP实现转移 P000:.P001:.第14页/共28页 .P255:.CODE ENDS END BEG 第15页/共28页4.3 分支程序设计技术 注意:有些指令的执行对PSW的标志位没有影响,而且有条件转移指令
9、的转移范围为-128+127,因此合理选择条件转移指令在分支程序中是至关重要的,也是正确程序设计的关键。在分支程序设计中,要特别注意每个分支的完整性,分支中包含PUSH和POP指令时,应该确保每一条分支中PUSH和POP指令数的对等。第16页/共28页4.3 分支程序设计技术 下列以示例方式,对分支程序的设计进行说明。例4.2 字节型变量VAR1、VAR2和VAR3存放有3个无符号数,将其中的内容按从大到小重新排列。解:经重新排列后,VAR1的值最大,VAR3的值最 小。由于变量中存放的数据为无符号数,因此应该采用JA、JAE、JB、JBE等指令。编程思路:通过在三个数中找出最大值,将它与VA
10、R1单元进行交换;然后对剩余的两个数进行比较,将较大值存放在VAR2中。汇编语言程序如下:第17页/共28页4.3 分支程序设计技术 STACK SEGMENT STACK STACK DW 100H DUP(?)TOP LABEL WORDSTACK ENDSDATA SEGMENTVAR1DB 46H ;先假设一组值,以便检验程序设计的正确性VAR2DB 15HVAR3DB 0A2HDATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK第18页/共28页4.3 分支程序设计技术 START:MOV AX,DATA MOV
11、DS,AX MOV ES,AX MOV AX,STACK MOV SS,AX LEA SP,TOP MOV AL,VAR1;用户编写的程序 CMP AL,VAR2 JAE NO_CHG1 XCHG AL,VAR2NO_CHG1:CMP AL,VAR3 JAE NO_CHG2 XCHG AL,VAR3第19页/共28页4.3 分支程序设计技术 NO_CHG2:MOV VAR1,AL;最大值保存到VAR1 MOV AL,VAR2 CMP AL,VAR3 JAE NO_CHG3 XCHG AL,VAR3 MOV VAR2,AL;次大值保存到VAR2NO_CHG3:MOV AH,4CH;返回DOS操作
12、系统 INT 21HCODE ENDS END START第20页/共28页4.3 分支程序设计技术 程序执行后,(VAR1)0A2H,(VAR2)46H,(VAR3)15H,说明程序设计正确。一般来说,在程序结束处,应该使之返回到DOS状态,以便进行其它操作。当要排序的数据为有符号数时,只需要将程序中相应的JAE指令改成JGE指令。例43 有一组测试数据(有符号数),每个数据占用16位二进制数,数据个数存放在缓冲区的前2个字节,现要求分别统计出大于0、等于0和小于0的个数,分别存放在GREATZ、ZERO、LITTLEZ单元中。第21页/共28页4.3 分支程序设计技术 解:有符号数的比较应
13、该采用JG、JGE、JL、JLE等指令,同时还应该注意,MOV指令不会影响PSW中的标志位。编程思路:将字单元GREATZ、ZERO、LITTLEZ用作为计数器,其初值均为0。然后对数据与“0”比较,当其大于0时,GREATZ单元加1;当其等于0时,ZERO单元加1;当其小于0时,LITTLEZ单元加1。程序如下:STACK SEGMENT STACK STACK DW 100H DUP(?)TOP LABEL WORDSTACK ENDSDATA SEGMENT第22页/共28页4.3 分支程序设计技术 BUFFER DW 500;假设有500个数据,并利用重复宏随机 X=17 产生 REP
14、T 500 X=(X+979)mod 65535 DW X ENDMGREATZ DW?ZERO DW?LITTLEZ DW?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK 第23页/共28页4.3 分支程序设计技术 START:MOV AX,DATA MOV DS,AX MOV ES,AX MOV AX,STACK MOV SS,AX LEA SP,TOP XOR AX,AX ;用户编写的程序 MOV GREATZ,AX MOV ZERO,AX MOV LITTLEZ,AX MOV CX,BUFFER LEA SI,
15、BUFFER+2第24页/共28页4.3 分支程序设计技术 ST_COUNT:MOV AX,SIADD SI,2AND AX,AXJLE COUNT1INC GREATZJMP COUNT3COUNT1:JL COUNT2INC ZEROJMP COUNT3COUNT2:INC LITTLEZ第25页/共28页4.3 分支程序设计技术 COUNT3:DEC CX JNZ ST_COUNT MOV AH,4CH ;返回DOS操作系统 INT 21HCODE ENDS END START 分支程序经常可以采用循环程序实现,同样,循环程序也可以用分支程序设计。第26页/共28页4.3 分支程序设计技术 作业:1,4,7,8 ,9 第27页/共28页感谢您的观看。第28页/共28页