




已阅读5页,还剩61页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
12,1,步骤:编制要解决的问题的程序框图;确定数据结构、算法、工作单元、变量等;按照已编制的程序框图编写源程序;调试源程序,直至实现预定的功能。,第三章汇编语言程序设计,12,2,3.1简单程序设计,例1两个无符号双字节数相加。设被加数存放于内部RAM的40H(高位字节),41H(低位字节),加数存放于50H(高位字节),51H(低位字节),和数存入40H和41H单元中。,12,3,程序如下:START:CLRC;将Cy清零MOVR0,41H;将被加数地址送数据指针R0MOVR1,51H;将加数地址送数据指针R1AD1:MOVA,R0;被加数低字节的内容送入AADDA,R1;两个低字节相加MOVR0,A;低字节的和存入被加数低字节中DECR0;指向被加数高位字节DECR1;指向加数高位字节MOVA,R0;被加数高位字节送入AADDCA,R1;两个高位字节带Cy相加MOVR0,A;高位字节的和送被加数高位字节RET,12,4,3.2分支程序设计,图4.1分支结构框图(a)单分支流程;(b)多分支流程,12,5,例4比较两个无符号数的大小。设外部RAM的存储单元ST1和ST2中存放两个不带符号的二进制数,找出其中的大数存入外部RAM中的ST3单元中。,图3.3,12,6,程序如下:ORG1000HST1EQU2000HST2EQU2100HST3EQU2200HSTART:CLRC;清零CyMOVDPTR,ST1;第一个数的指针MOVXA,DPTR;取第一个数MOVR2,A;保存MOVDPTR,ST2;第二个数的指针MOVXA,DPTR;取第二个数CLRC,12,7,SUBBA,R2;两数比较JNCBIG1;若第二个数大,则转XCHA,R2;第一个数大BIG0:MOVDPTR,ST3MOVXDPTR,A;存大数RETBIG1:MOVXA,DPTR;第二个数大(ADDA,R2)SJMPBIG0,12,8,循环程序一般由四个主要部分组成:(1)初始化部分:为循环程序做准备,如规定循环次数、给各变量和地址指针预置初值。(2)处理部分:为反复执行的程序段,是循环程序的实体,也是循环程序的主体。(3)循环控制部分:这部分的作用是修改循环变量和控制变量,并判断循环是否结束,直到符合结束条件时,跳出循环为止。(4)结束部分:这部分主要是对循环程序的结果进行分析、处理和存放。,3.3循环程序设计,12,9,图4.4,12,10,1.已知循环次数的循环程序设计例5工作单元清零。在应用系统程序设计时,有时经常需要将存储器中各部分地址单元作为工作单元,存放程序执行的中间值或执行结果,工作单元清零工作常常放在程序的初始化部分中。设有50个工作单元,其首址为外部存储器8000H单元,则其工作单元清零程序如下:,12,11,CLEAR:CLRAMOVDPTR,8000H;工作单元首址送指针MOVR2,#50;置循环次数CLEAR1:MOVXDPTR,AINCDPTR;修改指针DJNZR2,CLEAR1;控制循环RET,CLEAR:CLRAMOVDPTR,#8000HMOVR2,#50CLR2:DJNZR2,CLR1RETCLR1:MOVXDPTR,AINCDPTRSJMPCLR2,#50+1,12,12,例6设在内部RAM的BLOCK单元开始处有长度为LEN个的无符号数据块,试编一个求和程序,并将和存入内部RAM的SUM单元(设和不超过8位)。,BLOCKEQU20HLENEQU30HSUMEQU40HSTART:CLRA;清累加器AMOVR2,LEN;数据块长度送R2MOVR1,BLOCK;数据块首址送R1LOOP:ADDA,R1;循环加法INCR1;修改地址指针DJNZR2,LOOP;修改计数器并判断MOVSUM,A;存和RET,12,13,2.未知循环次数的循环程序,需根据判断循环条件的成立与否,或用建立标志的方法,控制循环程序的结束。,例7:计算字符串长度设在内部RAM的BLOCK单元开始存有一个字符串,请统计字符串的长度存内部RAM的SUM单元。已知字符串以回车符为结束标志。,12,14,程序如下:START:MOVSUM,0FFHMOVR0,BLOCK-1;数据指针R0置初值LOOP:INCR0INCSUMCJNER0,0DH,LOOPRET,START:MOVSUM,#00HMOVR0,#BLOCKLOOP:CJNER0,#0DH,LOP1RETLOP1:INCR0INCSUMSJMPLOOP,12,15,二、多重循环,多重循环程序,即在一个循环体中又包含了其它的循环程序,这种方式是实现延时程序的常用方法。使用多重循环时,必须注意:(1)循环嵌套,必须层次分明,不允许产生内外层循环交叉。(2)外循环可以一层层向内循环进入,结束时由里往外一层层退出。(3)内循环可以直接转入外循环,实现一个循环由多个条件控制的循环结构方式。,12,16,例10:10秒延时程序。延时程序与指令的执行时间有关,如果使用11.0592MHz晶振,一个机器周期为1.085s,计算出一条指令以至一个循环所需要的执行时间,给出相应的循环次数,便能达到延时的目的。1秒延时程序如何写?,12,17,ORG0040H;1秒延时程序delay1s:movr1,#46;立即数46送寄存器R1del1:movr2,#100;立即数100送寄存器R2del2:movr3,#100;立即数100送寄存器R3del0:djnzr3,del0;寄存器R3中的内容减1,不为零转移到当前指令djnzr2,del2;寄存器R2中的内容减1,不为零转移到del1djnzr1,del1;寄存器R1中的内容减1,不为零转移到del0end,(Tdjnzr3100)+Tmovr3+Tdjnzr2100+Tmovr2+Tdjnzr146+Tmovr1Tm式中Tdjnzr3是执行指令djnz的机器周期数,Tmovr3是执行指令mov的机器周期数。将Tdjnzr3=Tdjnzr2=Tdjnzr1=2,Tmovr3=Tmovr2=Tmovr1=1,Tm=1.085s代入上式,算得1.013秒。,12,18,例11:冒泡程序:在外部RAM中,BLOCK开始的单元中有一无符号数据块,其个数为LEN个字节。试将这些无符号数按递减次序重新排列,并存入原存储区。,36512,35126,31256,12356,要用双重循环来实现,内环完成相邻数据的两两比较,外环控制内循环的次数。,12,19,图4.5,12,20,ORG0000HSTART:MOVDPTR,BLOCK;置地址指针MOVP2,DPH;P2作地址指针高字节MOVR7,LEN;置外循环计数初值DECR7;比较与交换n-1次LOOP0:CLRF0;交换标志清0MOVR0,DPL;MOVR1,DPL;置相邻两数地址指针低字节,12,21,INCR1MOVA,R7;置内循环计数器初值MOVR6,ALOOP1:MOVXA,R0;取数MOVB,A;暂存MOVXA,R1;取下一个数CJNEA,B,NEXT;相邻两数比较,不等转SJMPNOCHA;相等不交换,12,22,NEXT:JCNOCHA;Cy=1,则前者大于后者,不必交换SETBF0;否则,置交换标志MOVXR0,A;XCHA,B;两数交换,大者在前,小者在后MOVXR1,A;NOCHA:INCR0INCR1;修改指针DJNZR6,LOOP1;内循环未完,则继续JNBF0,EXIT;若从未交换,则结束DJNZR7,LOOP0;外循环未完,则继续EXIT:RET,12,23,3.4散转程序设计,散转程序是分支程序的一种,它可根据运算结果或输入数据将程序转入不同的分支。MCS-51指令系统中有一条跳转指令JMPA+DPTR,用它可以很容易地实现散转功能。该指令把累加器的8位无符号数与16位数据指针的内容相加,并把相加的结果装入程序计数器PC,控制程序转向目标地址去执行。此指令的特点在于,转移的目标地址不是在编程或汇编时预先确定的,而是在程序运行过程中动态地确定的。目标地址是以数据指针DPTR的内容为起始的256字节范围内的指定地址,即由DPTR的内容决定分支转移程序的首地址,由累加器A的内容来动态选择其中的某一个分支转移程序。,12,24,例11一应用系统设有N个功能键,分别用键号0(N-1)表示,已知读出的键号存放在R0中,请根据R0的内容转入相应的功能程序。(R0)=0对应的分支程序标号为PKEY0;(R0)=1对应的分支程序标号为PKEY1;(R0)=N-1对应的分支程序标号为PKEYN-1。,12,25,方法1:用长转移指令表。程序如下:LP0:MOVDPTR,TAB;取表头地址MOVA,R0MOVB,03H;长跳转指令占3个字节MULABXCHA,BADDA,DPH;DPTR高8位调整,低8位在散转指令过程进行相加MOVDPH,AXCHA,BLP1:JMPA+DPTR;跳至散转表中相应位置TAB:LJMPPKEY0LJMPPKEYN-1,12,26,方法2:用转移地址表,程序如下:MOVDPTR,#TABMOVA,R0ADDA,R0;R0*2MOVB,AMOVCA,A+DPTR;入口高8位XCHA,BINCAMOVCA,A+DPTR;入口低8位MOVDPL,AMOVDPH,BCLRAJMPA+DPTR,PUSHACC;低8位进栈PUSHB;高8位进栈RET;地址退栈至PC,指针恢复,TAB:DWPKEY0,PKEY1,.PKEYN-1,TAB:,PKEY0:,12,27,3.5子程序和参数传递,一、子程序的概念通常把这些基本操作功能编制为程序段作为独立的子程序,以供不同程序或同一程序反复调用。在程序中需要执行这种操作的地方放置一条调用指令,当程序执行到调用指令,就转到子程序中完成规定的操作,并返回到原来的程序继续执行下去。,主,子,12,28,二、子程序的调用调用子程序的指令有“ACALL”和“LCALL”,执行调用指令时,先将程序地址指针PC改变(“ACALL”加2,“LCALL”加3),然后PC值压入堆栈,用新的地址值代替。执行返回指令时,再将PC值弹出。子程序调用中,主程序应先把有关的参数存入约定的位置,子程序在执行时,可以从约定的位置取得参数,当子程序执行完,将得到的结果再存入约定的位置,返回主程序后,主程序可以从这些约定的位置上取得需要的结果,这就是参数的传递。,12,29,1.用寄存器传递参数,例:求平方计算。SQU:MOVB,AMULABRET如要完成30H、31H两数的平方和存32H33H,MOVA,30HLCALLSQUMOV32H,BMOV33H,AMOVA,31HLCALLSQU,ADDA,33HMOV33H,AMOVA,BADDCA,32HMOV32H,A,12,30,2.用指针传递参数,例:对内RAM多个单元清零。CLEAR:CLRAMOVR0,AINCR0DJNZR2,CLEARRET比如要对50H单元开始的10个单元清零。MAIN:MOVR0,#50HMOVR2,#10LCALLCLEAR.,12,31,例12把内部RAM某一单元中一个字节的十六进制数转换成两位ASCII码,结果存放在内部RAM的连续两个单元中。假设一个字节的十六进制数在内部RAM40H单元,而结果存入50H,51H单元,可以用堆栈进行参数传递:,内RAM,0BH0AH09H08H07H,SP,LCALLCHHA,SP,PC.L,PC.H,CHHA:.RET,SP,SP,SP,PC.H,PC.L,PUSHACC,PC.H,PC.L,ACC,3.用堆栈传递参数,12,32,HEASC:MOVR0,SPDECR0DECR0;R0指向十六进制数参数地址XCHA,R0;取被转换参数ANLA,0FH;保留低半字节ADDA,?;修改A值MOVCA,A+PC;查表XCHA,R0;结果送回堆栈RETTAB:DB30H,31H,32H,2;增加MOVC指令首地址与表头地址之间的单元数,12,33,MAIN:MOVR1,50H;R1为存结果的指针MOVA,40H;A为需转换的十六进制数SWAPA;先转换高位半字PUSHACC;压栈,输入参数LCALLHEASC;调用将低半字节的内容转换;成ASCII码子程序HEASCPOPACC;读出结果MOVR1,A;存高半字节转换结果INCR1PUSH40HLCALLHEASCPOPACCMOVR1,A;存低半字节转换结果SJMP$,12,34,3.6查表程序设计,查表程序是一种常用程序,它广泛使用于LED显示控制、打印机打印控制、数据补偿、数值计算、转换等功能程序中,这类程序具有简单、执行速度快等特点。所谓查表法,就是预先将满足一定精度要求的表示变量与函数值之间关系的一张表求出,然后把这张表存于单片机的程序存储器中,这时自变量值为单元地址,相应的函数值为该地址单元中的内容。查表,就是根据变量X在表格中查找对应的函数值Y,使Y=f(X)。,12,35,MCS-51指令系统中,有两条查表指令:MOVCA,A+PCMOVCA,A+DPTR,12,36,例13一个十六进制数存放在内部RAM的HEX单元的低4位中,将其转换成ASCII码并送回HEX单元。十六进制09的ASCII码为30H39H,AF的ASCII码为41H46H,ASCII码表格的首地址为ASCTAB。编程如下:,ORG1000HHEXASC:MOVA,HEXANLA,0FHADDA,3;修改指针MOVCA,A+PCMOVHEX,ARET,12,37,ASCTAB:DB30H,31H,32H,33H,34HDB35H,36H,37H,38H,39HDB41H,42H,43H,44H,45HDB46H在这个程序中,查表指令MOVCA,A+PC到表格首地址有两条指令,占用3个字节地址空间,故修改指针应加3。,12,38,例14设有一个巡回检测报警装置,需对96路输入进行控制,每路有一个额定的最大值,是双字节数。当检测量大于该路对应的最大值时,就越限报警。假设R2为保存检测路数的寄存器,其对应的最大额定值存放于31H和32H单元中。查找最大额定值的程序如下:,FMAX:MOVA,R2ADDA,R2;表中一个额定值为2个字节MOV31H,AMOVDPTR,TAB;表首址,12,39,MOVCA,A+DPTR;查表读取第一个字节XCHA,31H;第一个字节内容存入31HINCDPTRMOVCA,A+DPTR;查表读取第二个字节MOV32H,A;第二字节的内容存入32HTAB:DW1230H,1450H,.DW2230H,2440H,.DW3120H,3300H,.,12,40,例15在一个温度检测系统中,温度模拟信号由10位A/D输入。将A/D结果转换为对应温度值,可采用查表方法实现。先由实验测试出整个温度量程范围内的A/D转换结果,把A/D转换结果000H3FFH所对应的温度值组织为一个表存储在程序存储器中,那么就可以根据检测到的模拟量的A/D转换值查找出相应的温度值。设测得的A/D转换结果已存入20H#,21H单元中(高位字节在20H中,低位字节在21H中),查表得到的温度值存放在22H,23H单元(高位字节在22H中,低位字节在23H中)。,12,41,程序如下:FTMP:MOVDPTR,TAB;DPTR表首地址MOVA,21H;(20H)(21H)2CLRCRLCAMOV21H,AMOVA,20HRLCAMOV20H,AMOVA,21H;表首地址+偏移量ADDCA,DPLMOVDPL,A,12,42,MOVA,20HADDCA,DPHMOVDPH,ACLRAMOVCA,A+DPTR;查表得温度值高位字节MOV22H,ACLRAINCDPTRMOVCA,A+DPTR;查表得温度值低位字节MOV23H,ARETTAB:DW,12,43,3.7数制转换,1、十六进制到十进制的转换。例16:将一个字节二进制数转换成3位非压缩型BCD码。设一个字节二进制数在内部RAM40H单元,转换结果放入内部RAM50H,51H,52H单元中(高位在前),程序如下:,在应用系统中,由于人们日常生活中用的是十进制数,而计算机中用的是十六进制数,所以应用系统中一定有数制之间的转换,如十进制到十六进制、十六进制到十进制、十进制到ASCII、十进制到段选码等的转换。,12,44,HEXBCD:MOVA,40HMOVB,100DIVABMOV50H,AMOVA,10XCHA,BDIVABMOV51H,AMOV52H,BRET,12,45,例:多字节二进制数转换成十进制数,将内RAM30H31H中的16位二进制数转换成十进制数存在32H33H34H中。,1100110B,=(1*2+1)*2+0)*2+0)*2+1)*2+1)*2+0,=(00*2+1)*2+1)*2+0)*2+0)*2+1)*2+1)*2+0,所以每一个包括内都是完成一个数乘2再加一位二进制数的过程,乘2可以用自身相加方式来实现,加一位二进制数可以ADDC加进位的方式实现,加的过程用DAA进行十进制数调整,则是式的计算过程可实现二进制数到十进制数的转换。,12,46,CHHD:MOV32H,#00HMOV33H,#00HMOV34H,#00HMOVR2,#16LOOP:MOVA,31HRLCAMOV31H,AMOVA,30HRLCAMOV30H,AMOVA,34HADDCA,34H,12,47,DAAMOV34H,AMOVA,33HADDCA,33HDAAMOV33H,AMOVA,32HADDCA,32HDAAMOV32H,ADJNZR2,LOOPRET,12,48,例17设4位BCD码依次存放在内存RAM中40H43H单元的低4位,高4位都为0,要求将其转换为二进制数,结果存入R2R3中。,2、十进制到十六进制的转换,一个十进制数可表示为:Dn10n+Dn-110n-1+D0100,=(Dn10+Dn-1)10+Dn-2)10+)+D0,当n=3时,上式可表示为:(D310+D2)10+D1)10+D0,12,49,BCDHEX:MOVR0,40H;R0指向最高位地址MOVR1,03;计数值送R1MOVR2,0;存放结果的高位清零MOVA,R0MOVR3,ALOOP:MOVA,R3MOVB,10MULABMOVR3,A;(R3)10的低8位送R3MOVA,BXCHA,R2;(R3)10的高8位暂存R2MOVB,10,12,50,MULABADDA,R2MOVR2,A;R210+(R310)高8位送R2INCR0;取下一个BCD数MOVA,R3ADDA,R0MOVR3,AMOVA,R2ADDCA,0;加低字节来的进位MOVR2,ADJNZR1,LOOPRET,12,51,3。十六进制与ASCII码之间的相互转换,4。十六进制到段选码的转换,12,52,3.8运算程序,一、加、减法程序,例18将40H开始存放的10个字节的数与50H开始存放的10个字节的数相减(假设被减数大于减数)。设被减数指针为R0,减数指针为R1,差数放回被减数单元,R5存放字节个数,则程序如下:,12,53,SUB:MOVR0,40HMOVR1,50HMOVR5,10CLRCSUB1:MOVA,R0SUBBA,R1MOVR0,AINCR0INCR1DJNZR5,SUB1RET,12,54,二、乘法运算程序在计算机中,常将乘法采用移位和加法来实现。一般而言,设被乘数x、乘数y都是小于1的n位定点正数:x=0.x1x2xn;y=0.y1y2yn其乘积为xy=x(0.y1y2yn)=x(y12-1+y22-2+yn2-n)=2-1(y1x+2-1(y2x+2-1(+2-1(yn-1x+)令zi表示第i次部分积,则上式可写成如下递推公式:z0=0z1=2-1(ynx+z0)zi=2-1(yn-i+1x+zi-1)zn=xy=2-1(y1x+zn-1)显然,欲求xy,则需设置一个保存部分积的累加器。乘法开始时,。依此类推,直到求得y1x加上zn-1并右移1位得最后部分积,即得xy。显然,两个n位数相乘,需重复进行n次“加”及“右移”操作,才能得到最后乘积。这就是实现原码一位乘法的规则。,12,55,例19将(R2R3)和(R6R7)中双字节无符号数相乘,结果存入R4R5R6R7。此乘法可以采用部分积右移的方法来实现,其程序框图如图所示,程序如下:NMUL:MOVR4,0;初始化MOVR5,0CLRCMOVR0,16,12,56,NMUL1:MOVA,R4;CyR4R5R6R7右移一位RRCAMOVR4,AMOVA,R5RRCAMOVR5,AMOVA,R6RRCAMOVR6,AMOVA,R7RRCMOVR7,AJNCNMUL2;C为移出乘数的最低位MOVA,R5;(R4R5)+(R2R3)(R4R5),12,57,ADDA,R3MOVR5,AMOVA,R4ADDCA,R2MOVR4,ANMUL2:DJNZR0,NMUL1;循环16位MOVA,R4;最后结果再移一位RRCAMOVR4,AMOVA,R5RRCAMOVR5,AMOVA,R6,12,58,RRCAMOVR6,AMOVA,R7RRCAMOVR7,ARET,12,59,例20假定被乘数在(R4R3)中,乘数放在R2中,乘积放在R7R6和R5中。MCS-51中有8位数的乘法指令MUL,用它来实现多字节乘法时,可表示为(R4R3)(R2)=(R4)28+(R3)(R2)=(R4)(R2)28+(R3)(R2)其中(R4)(R2)和(R3)(R2)都
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年教师招聘之《幼儿教师招聘》能力检测试卷含答案详解ab卷
- 医疗行业大数据隐私保护在2025年医疗数据匿名化处理中的应用报告
- 快速干道工程招标方案(3篇)
- 净化工程选材方案(3篇)
- 酒店共享工程方案模板(3篇)
- 2025年音乐产业版权运营中的知识产权保护与科技创新报告
- 车床电工知识培训课件
- 电商供应链金融创新模式下的风险防范与控制策略研究报告
- 热转移防护膜涂布工设备调试考核试卷及答案
- 混凝土机械装配调试工职业技能考核试卷及答案
- 陕西水资源论证报告表
- 大学生暑期社会实践登记表
- 单选题51-100试题含答案
- 最新苏教牛津译林版英语五年级上册Unit 4《Hobbies》Grammar time 公开课课件
- 危险品管理台帐
- 现场技术服务报告模版
- 一年级上《人与自然》
- 高等有机化学PPT精品课程课件全册课件汇总
- 教学课件·固体物理基础(第2版)
- 完整课件-西方经济学下册(第二版)
- 青岛版四年级科学新教材上册实验
评论
0/150
提交评论