版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章汇编语言程序设计一、程序设计基本步骤分析问题,明确要求。建立数学模型。确定算法。画程序流程图。编写程序。上机调试。1、算法(Algorithm)算法是对特定问题求解步骤的一种描述,是指令的有限序列。每一条指令表示一个或多个操作。(1)有穷性。一个算法必须在有穷步之后结束,即必须在有限时间内完成。(2)确定性。算法的每一步必须有确切的定义。算法的执行对应着的相同的输人仅有惟一的一条路径。(3)可行性。算法中的每一步都可以通过已经实现的基本运算的有限次执行得以实现。(4)输入。一个算法具有零个或多个输人,这些输人取自特定的数据对象集合。(5)输出。一个算法具有一个或多个输出,这些输出同输人之间存在某种特定的关系。一个好的算法通常要考虑以下的要求:(1)正确。算法的执行结果应当满足预先规定的功能和性能要求。(2)可读。一个算法应当思路清晰、层次分明、简单明了、易读易懂。(3)健壮。当输入不合法数据时,能作正当处理,不至引起严重后果。(4)高效。有效使用存储空间和有较高的时间效率。2、程序流程图程序流程图是通过使用各种形状的框,用来表示各种不同的操作,框内文字由人们根据操作的需要指定,应当是明确而无“歧义性”的。带箭头的流程线,用来表示操作的顺序,即指向下一步的操作,用流程图表示算法形象直观、流向清楚。程序流程图潜在的缺点:允许流程线向任意方向转移,这可能出现“乱麻式”流程,有时使人难以看懂其来龙去脉(可用N-S结构化流程图)。3、基本程序结构顺序结构也就是顺序执行结构,它是最基本、最常用的结构。所谓顺序执行,就是按照程序语句行的自然顺序,一条语句按一条语句地执行程序。选择结构包括简单选择和多分支选择结构,这种结构可以根据设定的条件,控制语句流程,有选择地执行不同的语句序列。重复结构是用于在某些程序中,常常需要重复使用某一段相同的或类似的程序段,利用重复结构可简化大量的程序行。二、顺序结构程序设计及实例没有分支、循环等转移指令的程序,会按指令书写的前后顺利依次执行,这就是顺序程序顺序结构是最基本的程序结构完全采用顺序结构编写的程序并不多见例1、将内存单元DAT1中的组合BCD码变换成两个非组合BCD码,存于其后面的两个单元。
DATASEGMENTDAT1DB76H,2DUP(?)
DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVSI,OFFSETDAT1DAT1DAT1+1DAT1+2760607
MOVAL,[SI]ANDAL,0FHMOV[SI+1],ALMOVAL,[SI]ANDAL,0F0HMOVCL,4RORAL,CLMOV[SI+2],ALHLTCODEENDSENDSTART问题一:如要将2个非组合BCD码变为组合BCD码怎么办?问题二:如要将1个组合BCD码变为2个ASCⅡ码怎么办?问题三:如要将2个ASCⅡ码变为组合BCD码怎么办?DAT1DAT1+1DAT1+2060886DAT1DAT1+1DAT1+2543435二一DAT1DAT1+1DAT1+2323552三例2、从键盘中键入0~9中的任意自然数X,求其立方值。利用查表法,构建0~9的立方表,字节变量X存放键入的自然数,其立方值存于下面的单元。
DATASEGMENTTABDW0H,1H,8H,27H,64H,125H,
DW216H,
343H,512H,729HXDB?
XXXDW?
DATAENDS
CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVBX,OFFSETTABMOVSI,OFFSETXMOVAH,1INT21HANDAL,0FHMOV[SI],AL
ADDAL,ALMOVAH,0ADDBX,AXMOVAX,[BX]MOV[SI+1],AXMOVAH,4CHINT21HCODEENDSENDSTART问题:可否直接查表指令?为什么?
三、分支程序设计及实例分支程序根据条件是真或假决定执行与否判断的条件是各种指令,如CMP、TEST等执行后形成的状态标志转移指令Jcc和JMP可以实现分支控制分支结构有单分支结构双分支结构多分支结构1、单分支结构条件成立跳转,否则顺序执行分支语句体注意选择正确的条件转移指令和转移目标地址例1、从端口地址为PORT1的输入端口输入数值,与预定值相比,将差额的绝对值反馈给控制端口PORT2DATASEGMENTADB50H;设预定值
DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAGO:MOVAX,DATAMOVDS,AX
MOVBL,AINAL,PORT1CMPAL,BLJGLB1XCHGAL,BLLB1:SUBAL,BLOUTPORT2,ALCODEENDSENDGO问题一:求差的绝对值还有其他方法吗?解答:一、先减,为正即为绝对值,为负,需求补。2、双分支结构条件成立跳转执行第2个分支语句体,否则顺序执行第1个分支语句体注意:第1个分支体后一定要有一个JMP指令跳到第2个分支体后问题:分支程序中最需要注意的指令是哪一条?JMP指令例、内存单元中有一数X(8位无符号),按下式计算Y值,并将Y值存于X后面的单元
DATASEGMENTXDB42HYDW?DATAENDSY=3X+100X≧50X2-5X+20X<50CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,XMOVAH,0CMPAX,50JNBLOP1MOVBX,AXMULBX
MOVDX,BXMOVCL,2SHLBX,CLADDBX,DXSUBAX,BXADDAX,20
JMPLOP2LOP1:MOVBX,AXSHLAX,1ADDAX,BXADDAX,100
LOP2:MOVY,AXHLTCODEENDSENDSTART问题一:如X是有符号数怎么办?问题二:如X是16位数怎么办?问题三:如X是BCD码怎么办?3、多分支结构多分支结构是多个条件对应各自的分支语句体,哪个条件成立就转入相应分支体执行AH=0fuction0YNAH=1fuction1YNAH=2fuction2YN例、将某班同学的成绩按优、良、中、及格、不及格分类统计人数。设A:优(5)B:良(4)C:中(3)
D:及格(2)E:不及格(1)
DATASEGMENTADB0BDB0CDB0DDB0EDB0
DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATABEGIN:MOVAX,DATAMOVDS,AXMOVAH,1INT21HA1:CMPAL,‘5’JNEB1INCAJMPNEXTB1:CMPAL,‘4’JNEC1INCBJMPNEXTC1:CMPAL,‘3’JNED1INCCJMPNEXTD1:CMPAL,‘2’JNEE1INCDJMPNEXTE1:CMPAL,‘1’JNENEXTINCENEXT:MOVAH,4CHINT21HCODEENDSENDBEGIN编写分支程序要注意的问题1、条件转移语句的转移范围在-128~+127字节之间,若超出此范围要和无条件转移语句联合使用例JALOP1…LOP1:JMPLOP2…LOP2:…2、分支程序编写时要注意每个分支的出口位置,如果程序复杂,要画流程图或N-S结构化流程图3、利用间接转移的方式,可以实现动态转移如:SWDWLM0,LM1,LM2,…….,LMn
在:CODE中可使用以下语句
MOVSI,N;N为n的2倍
JMP[SW+SI]
三、循环程序设计循环程序结构是满足一定条件的情况下,重复执行某段程序循环结构的程序通常有3个部分:循环初始部分——为开始循环准备必要的条件,如循环次数、循环体需要的数值等循环体部分——指重复执行的程序部分,其中包括对循环条件等的修改程序段循环控制部分——判断循环条件是否成立,决定是否继续循环关键是什么?循环控制循环结构程序的设计关键是循环控制部分循环控制可以在进入循环之前进行,也可以在循环体后进行,于是形成两种结构:“先判断、后循环”结构“先循环、后判断”结构循环结束的控制可以用循环次数,还可以用特定条件等,于是又有:计数控制循环条件控制循环先循环后判断的循环结构
结束
初始化
循环的初始状态
循环体
循环的工作部分及修改部分
计数控制循环条件控制循环修改部分控制条件YN1、计数控制循环计数控制循环利用循环次数作为控制条件易于采用循环指令LOOP和JCXZ实现初始化:将循环次数或最大循环次数置入CX循环体循环控制:用LOOP指令对CX减1、并判断是否为0例1、数据块是带符号的8位二进制数,要求把其中的正负数分开,分别存在其后的存储区中。
DATASEGMENTDA1DB25H,BDH,7FH,94H,65H,…,A5HDA2DB20DUP(?);正数
DA3DB20DUP(?);负数
DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVES,AXLEASI,DA1LEADI,DA2LEABX,DA3MOVCX,20GO1:LODSBTESTAL,80HJNZNEG1STOSBJMPNEXTNEG1:XCHGBX,DISTOSBXCHGBX,DINEXT:LOOPGO1
HLTCODEENDSENDSTART问题:还需要要统计正、负数的个数该如何处理?例2:内存中连续存放10个8位无符号数,计算其平均值,并将其存入其后的一个单元。DATASEGMENTDA1DB35H,7BH,64H,89H,…,A2H
10个数DA2DB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATABEGIN:MOVAX,DATAMOVDS,AXLEABX,DA1;LEADI,DA2;MOVCX,10;XORAX,AX;LP1:ADDAL,[BX];JNCM1;INCAH;M1:INCBX;LOOPLP1;MOVBL,10;DIVBL;MOV[DI],ALCODEENDSENDBEGIN问题一:注意高8位的处理?问题二:如是BCD码如何处理?
个数等于10
xorax,axmov
cl,4lp1:addal,[bx]shrax,cl
daa
mov[di],al
adcah,0incbxlooplp1
个数大于10
,求累加和
xorax,axlp1:addal,[bx]
daa
xchg
al,ah
adcal,0
daa
xchg
al,ahincbxlooplp12.条件控制循环条件控制循环需要利用特定条件判断循环是否结束条件控制循环用条件转移指令判断循环条件转移指令可以指定目的标号来改变程序的运行顺序,如果目的标号指向一个重复执行的语句体的开始或结束,便构成了循环控制结构显示以0结尾的字符串 ;数据段string db'Letushaveatry!',0
;代码段
mov
bx,offsetstringagain:
mov
dl,[bx]
cmpdl,0
jzdone
;为0结束
movah,2 ;不为0,显示
int21h incbx
;指向下一个字符
jmpagaindone: ……条件控制循环先判断后循环记录某个字存储单元数据中1的个数
;数据段number dw1110111111100100B
;代码段
mov
bx,number
xordl,dl ;循环初值:DL←0again: testbx,0ffffh ;也可以用cmpbx,0
jzdone
;全部是0就可以退出循环,减少循环次数
shlbx,1 ;用指令shrbx,1也可以
adcdl,0
;利用ADC指令加CF的特点进行计数
jmpagain条件控制循环先判断后循环3、多重循环(循环嵌套)
循环之中还有循环,可以多次嵌套,典型例子双重循环。例:将一组数据按一定的顺序(大小)排列。基本方法:1、两两相比(沉底法)大循环用交换标志控制,有交换继续,否则停止。小循环利用循环次数控制,循环次数依次递减。
2、依次相比法(冒泡法)大、小循环用都利用循环次数控制,大循环n-1次,小循环从n-1开始,并依次递减
例、将一组16位有符号数按从大到小的顺序排列DATASEGMENTARRAYDW1234H,5376H,796AH,...,0AB10HCOUNTEQULENGTHARRAYDATAENDSSTACKSEGMENTSTAPNDW100dup(?)TOPEQULENGTHSTAPNSTACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXMOVAX,TOPMOVSP,AXMOVBL,0FFH;
A1:CMPBL,0FFHJNEA4;XORBL,BLMOVCX,COUNT-1;XORSI,SI;A2:MOVAX,[SI+ARRAY];CMPAX,[SI+ARRAY+2];JGEA3XCHG[SI+ARRAY+2],AX;MOV[SI+ARRAY],AXMOVBL,0FFH;A3:INCSI;INCSI;LOOPA2;JMPA1;A4:HLTCODEENDSENDSTART循环程序应用举例例1:将存储器AL中的二进制数变为十进制后,取转变后的百位数放在寄存器DL中
KIOKDB100LEABX,KIOK;MOVAL,0F3H;CVDEC:MOVDL,30H;CVDEC1:SUBAL,[BX]JBCVDEC2;INCDL;JMPCVDEC1;例2:两个非组合BCD码相乘,数的ASCII码形式存于内存(低位在上)
如:94573X6DATASEGMENTADB‘3’,‘7’,‘5’,‘4’,‘9’BDB‘6’CDBLENGTH(A)+1DUP(?)DATAENDS
CODESEGUMEASSUMECS:CODE,DS:DATAGO:MOVAX,DATAMOVDS,AXMOVES,AXCLDMOVSI,OFFSETAMOVDI,OFFSETCMOVCX,LENGTHAMOVBL,BYTEPTR[B];ANDBL,0FH;MOVBYTEPTR[DI],0CYCLE:LODSB;ANDAL,0FHMULBL;AAMADDAL,[DI];AAA;STOSB;MOV[DI],AH;LOOPCYCLEHLTCODEENDSENDGO四、子程序设计把功能相对独立的程序段单独编写和调试,作为一个相对独立的模块供主程序使用,就形成子程序子程序可以实现源程序的模块化,可简化源程序结构,可以提高编程效率主程序(调用程序)需要利用CALL指令调用子程序(被调用程序)子程序需要利用RET指令返回主程序过程定义和子程序编写汇编语言中,子程序要用一对过程伪指令PROC和ENDP声明,格式如下:
过程名
PROC[NEAR|FAR] …… ;过程体
过程名
ENDP可选的参数指定过程的调用属性。没有指定过程属性,则采用默认属性NEAR属性(段内近调用)的过程只能被相同代码段的其他程序调用FAR属性(段间远调用)的过程可以被相同或不同代码段的程序调用子程序编写注意事项⑴子程序要有一定的通用性,准确、精确,可以被反复调用。⑵子程序最后利用RET指令返回主程序,主程序执行CALL指令调用子程序。⑶子程序中对堆栈的压入和弹出操作要成对使用,保持堆栈的平衡。⑷子程序开始应该保护使用到的寄存器,子程序返回前应进行恢复。⑸子程序应必须写明入口、出口条件,以方便调用。例1:将5位十进制数(<65535)转换为二进制数方法:(abcde)=ax104+bx103+cx102+dx10+e=(((((ax10)+b)x10+c)x10)+d)x10+e)在运算过程中不调整,结果即为二进制数
入口条件:5位的十进制数以ASCII码的形式存于内存,SI为高位首地址,CX为n-1
出口条件:结果存于AX中ZH1PROCZH1:PUSHBXPUSHDXMOVBX,000AHMOVAH,0;MOVAL,BYTEPTR[SI];ANDAL,0FH;AA1:MULBX;ADDAL,BYTEPTR[SI+1];SUBAL,30H;INCSI;LOOPAA1;POPDX;POPBX;RETZH1ENDP主程序(子程序的调用):DATASEGMENTBUFFDB‘3’,‘6’,‘4’,‘1’,‘5’SUMDW2DUP(?)COUNTEQULENGTHBUFFDATAENDSSTACKSEGMENTSTAPWDW100DUP(?)TOPEQULENGTHSTAPNSTACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXMOVAX,TOPMOVSP,AXMOVSI,OFFSETBUFFMOVDI,OFFSETSUMMOVCX,COUNT-1CALLZH1MOV[DI],AXHLTCODEENDSENDSTART例2、将二进制转换为十进制,除10取余法(亦可用乘法)入口条件:要转换的数在DX中出口条件:结果存于SI指明的内存中(ASCII码的形式)XXXXHXXXH0AH0AH00AH余D0....余D1余DnZH2PROCZH2:PUSHAXPUSHCXPUSHDXA1:MOVAX,DXMOVDX,0MOVCX,000ADIVCXXCHGAX,DXADDAL,30HMOVBYTEPTR[SI],ALINCSICMPDX,0JNZA1B1:CMPSI,BUF2JZDONEINCSIMOVAL,30HMOVBYTEPRE[SI],ALJMPB1DONE:POPDXPOPCXPOPAXRETZH2ENDP参数传递主程序与子程序间一个主要问题是参数传递入口参数(输入参数):主程序调用子程序时,提供给子程序的参数出口参数(输出参数):子程序执行结束返回给主程序的参数参数的具体内容传数值:传送数据本身传地址:传送数据的主存地址常用的参数传递方法寄存器共享变量堆栈
用寄存器传递参数最简单和常用的参数传递方法是通过寄存器,只要把参数存于约定的寄存器中就可以了由于通用寄存器个数有限,这种方法对少量数据可以直接传递数值,而对大量数据只能传递地址采用寄存器传递参数,注意带有出口参数的寄存器不能保护和恢复,带有入口参数的寄存器可以保护、也可以不保护,但最好能够保持一致用共享变量传递参数子程序和主程序使用同一个变量名存取数据就是利用共享变量(全局变量)进行参数传递如果变量定义和使用不在同一个源程序中,需要声明如果主程序还要利用原来的变量值,则需要保护和恢复利用共享变量传递参数,子程序的通用性较差,但特别适合在多个程序段间、尤其在不同的程序模块间传递数据用堆栈传递参数参数传递还可以通过堆栈这个临时存储区。主程序将入口参数压入堆栈,子程序从堆栈中取出参数;子程序将出口参数压入堆栈,主程序弹出堆栈取得它们采用堆栈传递参数是程式化的,它是编译程序处理参数传递、以及汇编语言与高级语言混合编程时的常规方法使用堆栈传递参数,其子程序返回时要使用指令
RETn第四章习题1、下面程序段的功能是将内存单元DAT1起始的20个8位二进制数,按正、负分别存放,正数存于BUF1开始的单元,负数存于BUF2开始的单元,仔细阅读程序,改正其中的错误。
CLDSTOSWMOVSI,DAT1JMPGONDMOVDI,BUF1MIUS:XCHGBX,SIMOVBX,BUF2STOSBLOP1:LODSBXCHGBX,DIMOVCX,20GOND:LOOPLOP1TESTAL,80HLTJZMIUS
2、下面程序段的功能是将SI=2000H为起始的6个单元的组合BCD码累加,其结果仍在SI为指针的内存中,仔细阅读程序,改正其中的错误。
MOVSI,2000HMOVSI,ALMOVCX,6INCSIXORAL,ALLOOPLOP1LOP1:ADDAL,[SI]MOV[SI],AHAAAHLTADDAH,03、下面程序段的功能是将SI=1000H为起始的2个单元的ASCⅡ码(个位数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《信用销售管理》课件2
- 新疆和田地区(2024年-2025年小学五年级语文)人教版竞赛题((上下)学期)试卷及答案
- 广西南宁市(2024年-2025年小学五年级语文)人教版专题练习(上学期)试卷及答案
- 关于学期工作计划模板集锦9篇
- 《专利权的客体》课件
- 《怎样构建和谐校园》课件
- 关于医生个人先进事迹材料(5篇)
- 2024年技术转让合同:知识产权许可
- 幼儿园活动方案2024(32篇)
- 2024乙方为甲方提供物业安全服务的合同
- 盘古开天地“智慧课堂”展示课教学设计
- MRI设备详细介绍讲课稿
- SPSS主成分分析和因子分析课件(PPT 69页)
- 高温合金行业报告:变形高温合金、铸造高温合金、粉末高温合金
- 地铁屏蔽门设计_论文
- IPC77117721电子组件的返工维修和修改教程课件
- 交货实施方案
- 新《行政处罚法》修订要点解读PPT课件
- 第七章:化学动力学(物理化学)
- 钢筋混凝土梁柱箍筋面积表(打印)
- 培训学校校长绩效考核表
评论
0/150
提交评论