第五章:汇编语言程序设计2.ppt
- 文档编号:7478357
- 上传时间:2023-05-11
- 格式:PPT
- 页数:85
- 大小:3.45MB
第五章:汇编语言程序设计2.ppt
《第五章:汇编语言程序设计2.ppt》由会员分享,可在线阅读,更多相关《第五章:汇编语言程序设计2.ppt(85页珍藏版)》请在冰点文库上搜索。
5.2汇编语言程序的设计思想,5.2.1程序设计的基本概念,计算机所执行的每一步工作,必须先由人安排。
对所要解决的问题有一个明确的计算步骤或操作过程,把它用一系列指令或语句描述出来,为求解这个问题所有必须的完整的指令列、语句串加上必要的数据即构成程序。
因此,用计算机求解某个问题,首先必须编写出程序,这种编写程序的过程叫做程序设计。
在进行程序设计时应该考虑满足三个基本要求。
5.2.1程序设计的基本概念,程序的设计应满足三个基本要求:
1正确性:
满足设计的需求,保证程序的正常运行。
2可读性:
应尽可能把解题的算法和步骤作出说明或注释,增强程序的可读性,使程序简洁:
简:
最简化洁:
清晰明了,易读易理解3可维护性:
程序应该是模块化结构;易于调试、修改。
要达到以上目标,在学习程序设计的过程中,要掌握程序的基本设计方法和技巧,形成良好风格和素养,并在程序设计的实践中不断总结和提高。
根据实际问题,要全面分析所提供的条件、要求和特点,从中分析找出其规律性,然后抽象出描述该问题的数学模型。
对有些比较简单的问题,不一定非要写出数学模型,但也要用文字的形式把问题尽量阐述清楚,明确要做的工作。
5.2.2程序设计的基本步聚,一、分析问题,建立数学模型,二、确定算法,算法是解决问题的步骤和方法,解决一个问题可能有多种方法,找出合理的算法以及适当的数据结构就会简化计算机的处理。
计算机仅具有简单的算术和逻辑运算,虽然要解决的问题可以用数学公式描述,但不一定能在计算机中计算,还需要将这些数学问题转化为近似计算公式,成为计算机能执行的基本操作。
起始框:
处理框:
判断框:
子过程框:
终点框:
连接线:
流向线:
用流程图把解决问题的先后执行步骤直观而清晰地描述出来。
是设计程序的好方法,就象写文章、做报告,制定提纲一样。
三、绘制程序的流程图,程序流程图符号,四、安排程序的段结构、分配存储器空间,六、上机调试、运行程序用EDIT编辑程序:
编辑、建立ASM源程序(文件名.ASM)用MASM汇编程序:
对源程序汇编,产生目标程序(文件名.OBJ)用LINK连接程序:
将OBJ文件转换成可执行文件(文件名.EXE),五、编写汇编语言源程序,8086CPU的存储器采用分段管理方式,源程序必须采用段结构,即在源程序中要分别定义:
代码、数据、堆栈及附加段。
程序必须定义在代码段,工作单元可使用数据段中的存储单元,也可以使用CPU内部的寄存器。
要注意满足程序设计的正确性、可读性和易维护性。
5.2.3程序的基本结构,程序设计语言的语句、数据有序的组合在一起,对求解的问题进行描述,就构成了程序;由于有序组合的方式不同,就产生了不同类型的程序结构;一般分为四种基本结构:
顺序程序结构,子程序结构,循环程序结构,分支程序结构,一、顺序程序结构(简单程序),顺序程序结构有一个起始框、一个至多个矩形框和一个终止框组成,自上而下按处理框出现的先后顺序执行。
是最基础和最简单的程序结构;在程序设计中占主要部分。
但完全用顺序结构编写的完整程序并不多;这种结构是各种其它程序结构中的局部程序段:
分支程序就是在顺序程序基础上加上条件判断而构成分支流程;循环程序中的赋初值程序和循环体都是顺序程序结构。
它是学习如何编写程序的基础。
二、分支程序结构,在实际处理问题时,要根据不同的情况和给定条件做出不同的处理。
设计这样的程序,须事先把可能出现的各种情况和处理方法都编写在程序中,在执行程序时,根据具体情况做出判断,选择需要执行的程序段。
按这种要求编写的程序称为分支程序。
分支程序的结构有两种形式,如下图所示:
双分支结构,多分支结构,三、循环程序结构,程序设计中,常遇到需要反复执行某些操作,每次完成这些操作都是执行同样的程序,只是每一次执行时所需的参数不同而已。
对这种情况,循环程序结构是最好的程序设计方法。
循环程序可以使程序段自动执行多次,而无需将这段程序写出多次。
使程序大大缩短,节省内存。
是一种重要程序设计技巧。
要善于发现和寻找程序中具有重复性和规律性的过程。
循环程序的结构有两种形式,如右图所示:
先执行后判断,先判断后执行,三、循环程序结构,循环的准备工作:
建立地址指针、设置计数器初值和其它一些参数的起始值等,循环程序核心:
程序的重复执行部分,主要实现循环程序的功能,为下一次循环做准备:
保证在循环过程中,操作的数据及地址能按一定规律进行变化,与循环体协调地工作,保证循环程序按规定的循环次数或控制循环条件正常循环或结束循环,对循环的结果分析或保存;有些循环程序不需要这一部分,四、子程序结构(过程),子程序结构是模块化程序设计的重要手段,采用子程序结构具有以下优点:
1简化程序设计过程,节约程序设计时间。
2缩短源程序的长度,节约存储空间,更重要的是缩短程序运行时间。
3增加程序可读性,便于程序的修改和调试。
4便于实现程序的模块化和结构化。
5.3常用DOS功能调用,DOS系统不仅为用户提供了许多可以直接使用的命令,而且也提供了80多个可供汇编程序员直接调用的子程序。
这些子程序分别用于完成基本输入输出管理、文件管理、目录管理、内存管理、日期和时间设置及其它多种功能。
这些功能子程序提供了极大的方便,不必编写这些繁杂的程序,不必了解有关设备、电路、接口等,只须直接调用即可.DOS功能调用是通过软中断方式进行的。
5.3常用DOS功能调用,软中断的概念INTn,软中断分为三部分:
1DOS中断:
占用中断类型号n20H30H目前使用的有20H27H、2FH,其余类型号保留未用。
该部分称为DOS系统功能调用2ROM-BIOS中断:
占用中断类型号n10H1FH3自由中断:
占用中断类型号n40HFFH供用户应用程序设置开发的中断处理服务程序使用。
常用的软中断命令有8条:
1中断类型号为:
20H27H,2它们的功能及入口、出口参数如下表:
常用的软中断命令,5.3.1DOS功能调用方法,为方便使用功能调用子程序,DOS系统将所有子程序进行编号。
1将调用的功能子程序的功能号送AH寄存器;2根据调用功能子程序的入口条件将入口参数送入到规定的寄存器或存储单元;3执行软中断指令INT21H,即转入功能子程序;4相应功能子程序执行完后,获取输出参数。
称编号为功能号,调用时只要按如下步骤编写程序即可。
调用的步骤如下:
常用DOS功能调用一览表,5.3.2常用DOS功能调用简要说明及应用,一、键盘输入功能调用,1号功能调用:
带回显的键符输入格式:
MOVAH,1;功能号送AH寄存器INT21H;调用功能子程序功能:
等待将从键盘输入的一字符送入AL寄存器,有键按下时,系统检查是否是Ctrl-Break键,如果是则退出,否则将字符的ASCII码值送入AL,并在屏幕上显示该字符。
8号功能调用:
无回显键符输入功能与1号功能调用类似,检查Ctrl-Break键,但不回显。
7号功能调用:
无回显键符输入功能与1号功能类似,不同的是:
不回显也不检查Ctrl-Break键。
一、键盘输入功能调用,0AH号功能调用:
字符串缓冲输入,格式:
LEADX,D1;DX指向内存缓冲区,入口参数MOVAH,0AH;功能号送AH寄存器INT21H;调用功能子程序功能:
等待将从键盘输入的字符串写入特定的内存缓冲区。
使用0AH号功能调用,先要在数据段定义输入缓冲区缓冲区的第一个字节用于说明输入字符的个数,第二个字节用于存放实际输入的字符个数,从第三个字节开始存放从键盘输入的字符串;键入回车键表示字符串输入结束。
调用前,要求(DS:
DX)指向输入内存缓冲区的首地址。
二、键盘输出功能调用,2号功能调用:
字符显示,格式:
MOVDL,A;将显示的字符送DL,入口参数MOVAH,2;功能号送AH寄存器INT21H;调用功能子程序功能:
是将存于DL寄存器中的字符在屏幕上显示出来。
例如:
当执行完上面程序段后,就在屏幕上显示一个字母“A”,二、键盘输出功能调用,9号功能调用:
字符串显示,格式:
LEADX,BUF;DX指向显示缓冲区,入口参数MOVAH,09H;功能号送AH寄存器INT21H;调用功能子程序功能:
将指定内存缓冲区中的字符串在屏幕上显示出来。
它要求被显示的字符串必须以“$”字符作为结束符。
调用前,要求(DS:
DX)指向显示缓冲区的首地址。
5.3.3实现返回操作系统的常用方法,用户程序运行完后须返回操作系统,否则会出现死机现象。
在此简单介绍通过功能调用实现返回操作系统的常用方法。
INT20H在编写程序段并用DEBUG.COM调试程序时往往使用此方法。
MOVAH,4CHINT21H编写汇编语言源程序时往往使用此方法,该方法是最常用的方法。
PUSHDSMOVAX,0PUSHAX该方法与子程序中的RET指令配合来实现返回操作系统,相当于执行一条INT20H指令,与程序段前缀(PSP)有关。
5.4汇编语言程序上机调试过程,5.4.1汇编语言源程序的上机过程,一、编辑:
用编辑程序建立扩展名为.ASM的汇编语言源程序文件二、汇编:
用汇编程序将扩展名为.ASM文件汇编成目标程序文件,其扩展名为.OBJ文件。
当.ASM文件中有语法错误,汇编结束后汇编程序将给出提示,如:
位置、类型、说明等;用户根据提示用编辑软件重新调入.ASM文件进行修改,直至没有出现语法错误,才产生目标程序。
然后再进行连接;经汇编程序对.ASM文件进行汇编,将.ASM源文件程序转换成二进制代码表示的扩展名.OBJ目标程序文件;,汇编语言源程序,须经以下几步,才能对程序进行调试和运行。
5.4.1汇编语言源程序的上机过程,三、连接:
用连接程序将.OBJ文件转化成扩展名为.EXE文件,四、调试:
用调试程序对.EXE可执行文件进行调试,到无错为止。
此时的可执行文件在DOS命令下直接执行。
以上过程如下图所示:
5.4.2调试程序DEBUG.COM,DEBUG.COM用于试验和检测用户程序,一般语法错误和格式错误可以通过汇编和连接程序发现并指出,但逻辑错误必须用DEBUG.COM调试程序来排除调试程序功能:
设置断点、启动地址、单步跟踪、子程序跟踪、条件跟踪、检查修改内存和寄存器、行汇编和反汇编等。
DEBUG程序的调用:
在DOS提示符下键入DEBUG,随后键入用户文件名,则DEBUG将指定的文件装入内存中,即可调试;如果未键入文件名,可用DEBUG的N命令和L命令把需要的文件装入内存后再进行调试。
在调入DEBUG程序后,将出现提示符“一”,表示已进入DEBUG此时就可以调试程序了。
DEBUG程序对寄存器和标志位的初始化在调入DEBUG程序后,它把各寄存器和标志位置成以下状态:
1段寄存器(CS,DS,ES、SS))置于自由存储空间的底部,也就是DEBUG程序结束以后的第一个段。
2指令指针(IP)置为0100H。
3堆栈指针置于段的结尾处或装入程序的临时底部,取决于哪一个更低。
4余下的AX、BX、CX、DX、BP、SI和DD置为0。
5标志位都置为清除状态。
6默认的磁盘缓冲区置于代码段的80H。
注意:
若由DEBUG调入的程序具有扩展名.EXE,则DEBUG必须进行再分配,把段寄存器、堆找指针置为程序中所规定的值。
DEBUG的主要命令及功能
(1),DEBUG的主要命令及功能
(2),5.5汇编语言程序设计,5.5.1顺序结构程序设计(简单程序),是最基础和最简单的程序结构顺序结构在程序设计中占主要部分,例1:
已知Y=X+8X+8X+6,求当X=10时,Y的值。
解:
先将原公式变形为:
Y=(X8)X8X6,一、表达式计算,例1:
Y=(X8)X8X6,;源程序,以下是段定义DATASEGMENTXDW10YDW0DATAENDSSTACKSEGMENTSTADW100DUP(?
)TOPEQUSIZESTASTACKENDSCODESENGMENTASSUMEDS:
DATAASSUMESS:
STACKASSUMECS:
CODE,例1:
Y=(X8)X8X6,START:
MOVAX,STACK;主程序开始MOVSS,AXMOVSP,TOPMOVAX,DATAMOVDS,AX;以上是断寄存器赋值MOVAX,XADDAX,8MULXADDAX,8MULXADDAX,6MOVY,AX;运算结果送Y单元MOVAH,4CHINT21H;用软中断功能退出用户程序CODEENDS;代码断结束ENDSTART;程序结束,例2:
变量M为压缩BCD码;将其转换为相应,的ASCII码,存入M后的两个单元中。
DATASEGMENTMDB?
NDB2DUP(?
)DATAENDSCODESEGMENTASSUMEDS:
DATAASSUMECS:
CODESTR:
MOVAX,DATAMOVDS,AXLEASI,MLEADI,NMOVAL,SIANDAL,0FH,ADDAL,30HMOVDI,ALMOVAL,SIMOVCL,4SHRAL,CLADDAL,30HMOVDI+1,ALMOVAH,4CHINT21HCODEENDSENDSTR,二、查表程序,对于计算平方值、立方值、方根、三角函数等一些复杂的运算,无一定的算法关系,可以采用查表的方法解决。
查表的关键在于组织表格。
表格中应包括所有可能的值,且按顺序排列。
查表操作是利用表格首址加上索引值得到结果所在的单元地址,索引值通常就是被查的数值。
例:
在内存中自TABLE单元起连续存放着015的平方值,查表求X的平方值并送入Y单元中。
(0X15),程序流程图,DATASEGMENTTABLEDB0,1,4,9,16,25,36,49,64DB81,100,121,144,169,225XDB13YDB?
DATAENDSCODESEGMENTASSUMECS:
CODE,DS:
DATASTART:
MOVAX,DATAMOVDS,AXLEABX,TABLEMOVAL,XXLATMOVY,ALMOVAH,4CHINT21HCODEENDSENDSTART,5.5.2分支结构程序设计,分支的类型:
1两分支程序结构;2多分支程序结构,实现分支的两个要素:
1使用能影响FR的指令,将状态标志做为判别的条件2使用条件转移指令,根据状态标志确定转移的去向,但必须将可能出现的情况和处理方法都预先编写在程序中。
采用分支程序结构可使程序在运行时,根据不同的结果条件通过条件转移指令有选择地执行相应的处理程序。
一、简单的双分支程序设计,双分支程序是组成其它复杂程序的基础,设计步骤:
1确定需要判断的条件,根据条件选择条件转移语句;,2确定条件成立时和条件不成立时所要完成的任务;,3画出程序流程图并写出源程序。
例1:
内存单元M中有一个16位带符号数,求其绝对值,将结果放回原处。
DATASEGMENTMDW?
DATAENDSCODESEGMENTASSUMECS:
CODE,ASSUMEDS:
DATASTART:
MOVAX,DATAMOVDS,AXLEASI,MMOVAX,SIANDAX,AX;利用“与”对符号标志产生影响JNSDONE;SF=0,转移到DONENEGAX;SF=1,AX0,AX求补DONE:
MOVSI,AXMOVAH,4CHINT21HCODEENDSENDSTART,源程序,二、复杂的多分支程序设计,多分支结构有若干个条件,每一个条件对应一个基本程序段。
程序判断产生的条件,哪个条件成立,就执行对应的程序段。
实现多分支结构的方法有:
条件选择法转移表法地址表法,1、条件选择法(见例515)一个条件选择指令可以实现两路分支,多个条件选择指令即可实现多路分支。
这种方法适用于分支数较少的情况。
2、转移表法(见例516),把转移到各分支程序段的转移指令依次排,形成转移表。
把距离表首单元的偏移量作为条件来判断各分支转移指令在表中的位置。
进行多分支条件判断时,把当前的条件偏移量加上表首地址作为转移地址,转移到表中的相应位置去执行无条件转移指令,达到实现多分支的目的,3、地址表法(见例517)与转移表法不同,转移表位于代码段,存放的是转移指令;而地址表位于数据段,存放的是分支程序段的入口地址。
如果是段内转移,则入口地址为段内偏移地址,占用一个字单元;如果是段间转移,则入口地址为32位地址指针,占用两个字单元。
例515:
编写程序,完成下面分段函数的计算。
(X为单字节带符号数据),解:
X为内存中的一个带符号数,先判断其正负,若为负:
函数值Y为1;若为正,再判断是否为0,如果为0,函数值为0;否则函数值为1。
程序流程图,DATASEGMENTXDB?
YDB?
DATAENDCODESEGMENTASSUMECS:
CODE,DS:
DATASTART:
MOVAX,DATAMOVDS,AXMOVAL,X;X取到AL中CMPAL,0;AL中的内容和0比较JGEPLUS;大于等于0,转PLUSMOVBL,1;否则为负数,1送BLJMPEXIT;转到结束位置PLUS:
JEZERO;AL中的内容是否为0,为0转ZEROMOVBL,1;否则为大于0,1送BLJMPEXIT;转到结束位置ZERO:
MOVBL,0;0送BLEXIT:
MOVY,BL;BL中的内容送Y单元MOVAH,4CHINT21H;程序结束CODEENDSENDSTART;汇编结束,汇编语言源程序,5.5.3循环结构程序设计,对某些要反复执行多次的程序段,可将此程序段做为循环体放在主程序中,而不是重复写多次,这样可以简化程序的结构和数量。
一、循环程序由五部分组成:
初始化参数;循环体部分;修改参数部分;控制部分;结束处理,二、循环程序的基本结构形式“先执行、后判断”结构;最少要执行一次循环体“先判断、后执行”结构;可以不执行循环体,三、循环结构的类型单重循环结构:
循环体内只包含有顺序结构和分支结构多重循环结构:
循环体内还包含有循环结构,5.5.3循环结构程序设计,一、单重循环结构程序的设计,循环体内只包含有顺序结构和分支结构的程序设计单重循环结构程序的关键是掌握循环程序的控制方法常用循环程序的控制方法有:
计数控制法条件控制法混合控制法逻辑尺控制法,1计数控制法例519当循环次数是已知或可求的情况下,可采用计数法控制循环。
常用两种方法实现计数控制:
正计数法,即计数器从1加一计数到N;倒计数法,即计数器从N减一计数到0。
2条件控制法例520,有些问题循环次数预先不能确定,只能按照循环过程中的某个特定条件是否成立来决定循环是否继续执行;此类问题可通过测试条件是否成立来实现对循环的控制。
3混合控制法例521混合控制法是前两种控制方法的结合。
循环结束的条件是:
达到预定循环次数或退出循环的条件成立。
4逻辑尺控制法例522当循环体中的处理部分为分支程序,便构成分支循环结构。
实际应用中常用逻辑尺来实现控制分支和循环。
逻辑尺就是一个存储单元,单元中的每一位是一个标志,根据位为“0”或为“1”的状态可实现两路分支,多个标志即可重复地实现分支。
重复的次数就是逻辑尺中设定的位数。
计数控制法举例,数据段以BUF为首址的区域中,存有COUNT个有符号字节数。
请分别统计正数和负数的个数,将结果送MI和PL单元中。
解:
循环次数已知,用正计数法。
用BL计数正数的个数用DL计数负数的个数用SI做地址指针用CX做循环计数器,DATASEGMENTBUFDB32,25,COUNTEQU$BUFMIDB0;正数个数PLDB0;负数个数DATAENDSCODESEGMENTASSUMEDS:
DATAASSUMECS:
CODESTA:
MOVAX,DATAMOVDS,AXLEASI,BUFMOVCX,0MOVBL,0;计正数个数MOVDL,0;计负数个数,L1:
MOVAL,SICMPAL,0JGEMMINCDLJMPNTMM:
INCBLNT:
INCSIINCCXCMPCX,COUNTJNEL1MOVMI,BLMOVPL,DLMOVAH,4CHINT21HCODEENDSENDSTA,源程序,DATASEGMENTSTRINGDBWhereisaway,$,RESULTDW?
DATAEDNSCODESEGMENTASSUMEDS:
DATAASSUMECS:
CODESTA:
MOVAX,DATAMOVDS,AXLEABX,STRINGMOVDX,0FIN:
MOVAL,BXCMPAL,$JENETCMPAL,20HJNECNTINCDX,CNT:
INCBXJMPFINNET:
MOVRESULT,DXMOVAH,4CHINT21HCODEENDSENDSTA,条件控制法举例:
统计字符串STRING中空格的个数。
Z1X1Y1,Z2X2Y2,Z3X3Y3,Z4X4Y4,Z5X5Y5Z6X6Y6,Z7X7Y7,Z8X8Y8,Z9X9Y9,Z10X10Y10,逻辑尺控制法举例:
数据组X和Y中各有10个数据,编写程序计算并把结果存入数组Z中:
分析:
已知循环次数为10次,每次把数组X和Y中的对应元素分别进行处理,循环的操作数可以顺序取出,但要做的处理却不同。
为区别每次的处理,用存储单元中的位做为相应的标志位:
标志为0表示做加法,标志为1表示做减法。
存放逻辑操作标志的单元称为“逻辑尺”。
在程序流程中,通过测试标志位来确定相应的操作。
本例要进行十次操作,需十个逻辑位,用LR字单元作为逻辑尺,内容为:
0000000011011100B00DCH,由低位到高位开始表示每次要做的操作。
最高6位没有意义,可设为0。
流程图,LL,SB,LP,DATASEGMENTXDWX1,X10YDWY1,Y10ZDW10DUP(?
)LRDW0DCHDATAENDSCODESEGMENTASSUMEDS:
DATAASSUMECS:
CODESTA:
MOVAX,DATAMOVDS,AXMOVCX,10MOVDX,LRSUBBX,BXLP:
MOVAX,XBXSHRDX,1JCSBADDAX,YBXJMPLLSB:
SUBAX,YBXLL:
MOVZBX,AX,源程序,ADDBX,2LOOPLPMOVAH,4CHINT21HCODEENDSENDSTA,LP,LL,SB,流程图,二、多重循环结构程序的设计,1内循环必须完整地包含在外循环内,即内、外循环不能相互交叉。
2内循环在外循环中的位置可根据需要任意设置,在分析程序流程时要避免出现混乱。
3在外循环中,可以几个内循环并列存在。
可以从内循环直接跳到外循环;但不能从外循环直接跳到内循环中。
4无论是内循环,还是外循环,千万不要使循环回到初始化部分,以防止出现死循环。
并注意各循环体的初始参数设置和循环参数的修改,避免混乱和出错。
5每次完成外循环再次进入内循环时,初始条件必须重新设置。
有些比较复杂的问题,单重循环难以解决,须采用多重
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第五 汇编语言 程序设计