首页 单片机汇编语言程序设计

单片机汇编语言程序设计

举报
开通vip

单片机汇编语言程序设计会计学1单片机汇编语言程序设计一、分清可执行指令和非执行指令及其功能二、将高级语言程序设计方法迁移到汇编语言程序设计中来三、特别注意汇编语言是面向机器的,要记住CPU的资源;存储器结构与寻址方式;I/O口、定时/计数器、中断系统等关键的参数;寄存器间接寻址中指针的选择和使用技巧。四、从宏观上看,MCS-51汇编语言程序的整体结构从微观上看,微机中各组成部分是如何通过程序联系起来。汇编语言程序设计的要点:第1页/共81页4.1汇编语言程序设计基础4.2MCS-51单片机汇编语言程序设计第四章汇编语言程序设计第...

单片机汇编语言程序设计
会计学1单片机汇编语言程序 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 一、分清可执行指令和非执行指令及其功能二、将高级语言程序设计 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 迁移到汇编语言程序设计中来三、特别注意汇编语言是面向机器的,要记住CPU的资源;存储器结构与寻址方式;I/O口、定时/计数器、中断系统等关键的参数;寄存器间接寻址中指针的选择和使用技巧。四、从宏观上看,MCS-51汇编语言程序的整体结构从微观上看,微机中各组成部分是如何通过程序联系起来。汇编语言程序设计的要点:第1页/共81页4.1汇编语言程序设计基础4.2MCS-51单片机汇编语言程序设计第四章汇编语言程序设计第2页/共81页4.1.1汇编语言与机器语言4.1.2汇编语言的格式4.1.3伪指令4.1.4汇编语言源程序的汇编4.1.5汇编语言程序设计的一般步骤4.1汇编语言程序设计基础第3页/共81页4.2.1简单程序设计4.2.2分支程序设计4.2.3循环程序设计4.2.4查表程序设计4.2.5散转程序设4.2.6子程序设计4.2.7运算程序设计4.2MCS-51单片机汇编语言程序设计第4页/共81页机器语言计算机唯一能够识别和执行的语言,面向机器,二进制。汇编语言“符号语言”,用指令助记符代表机器语言指令,面向机器。要经过汇编。低级语言适合开发实时控制程序高级语言面向算法、过程、对象,类似自然语言,可移植性好,须经解释或翻译后才能被执行。4.1.1汇编语言与机器语言第5页/共81页4.1.2汇编语言的格式标号段:LABEL操作码段OPCODE操作数段OPRAND;注释段COMMENT指令格式:伪指令格式:名字定义符参数,…,参数;注释或[标号:]定义符项表;注释第6页/共81页1.   标号段标号段位于语句的开头,指明标号所在指令的首地址,标号又称为标号地址或符号地址,是一个可选项,只有需要时才设置。绝对不允许把指令的保留字、寄存器号及伪指令字符作为语句的标号;标号在同一程序单位中只能出现一次。2、操作码段操作码段可以是可执行指令的助记符,操作码段用于指示计算机进行何种操作,因此,是任何一条语句中的必选项,汇编语言根据这一字段生成目标代码。操作码段也可以是伪指令的助记符,对汇编程序下命令,在汇编时起作用。LOOP:MOVA,@R0……DJNZR2,LOOP第7页/共81页3、操作数段操作数段用于存放指令的操作数或操作数地址,操作数的个数因指令的不同而不同,通常有三种情况:无操作数RET单操作数JCLOOP双操作数MOVA,B可以采用字母或数字等多种表示形式:(1)操作数是立即数,可用二进制、十进制和十六进制形式(2)作寄存器和特殊功能寄存器名MOVA,PSW(3)标号地址DJNZR7,NEXT(4)带加、减运算符的表达式,例:MOVA,#100-14、 注释段:注释指令或程序的含义,便于阅读程序、维护程序。必须用“;”隔开,续行时,也必须以“;”开头。常数:01010101B;12D,12;0F1H,59H67Q;‘A’,‘a’操作数:A,B,DPTR表达式movA,#(12H-03H)第8页/共81页4.1.4汇编语言源程序的汇编汇编可分成两种:人工汇编机器汇编机器汇编是用机器自动把汇编语言源程序翻译成可以运行的目标代码程序,即二进制程序的过程,它是一种用机器来代替人脑的汇编,完成这一汇编过程的软件称为“汇编程序”。汇编机器语言目标程序汇编语言源程序汇编程序汇编机器语言目标程序汇编语言源程序人工查指令机器码表第9页/共81页4.1.5汇编语言程序设计的一般步骤程序设计的方法程序设计的步骤第10页/共81页程序设计的方法结构化设计模块化设计开发方法自底向上开发先底层开发自顶向下开发先顶层开发混合方法底顶第11页/共81页程序设计的步骤 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 ,确定算法和思路根据算法和思路画出流程图根据流程图编写程序上机调试,排除错误第12页/共81页流程图图例起止框处理框判断框连线开始结束XX+1YY-1F>5?YN第13页/共81页程序设计步骤流程图第14页/共81页4.1.3伪指令定义:仅向汇编程序发出的,并仅由汇编程序在汇编过程中识别和执行的一种汇编控制命令,它本身在目标程序中不产生机器码。汇编起始伪指令:ORG汇编结束伪指令:END定义字节伪指令:DB定义字伪指令:DW定义位伪指令:BIT赋值伪指令:EQUDATA第15页/共81页汇编起始伪指令格式:ORG<起始地址>功能:指定汇编源程序编译成机器语言程序的起始地址例如:ORG0000HLJMP0100HORG0100HStart:MOVA,#5AHSJMP$END程序中可以有多条ORG语句,但定义的起始地址既不要交叉,也不要重叠。必须从小地址向大地址分配程序所占空间。第16页/共81页汇编结束伪指令格式:END[起始地址]功能:停止汇编示例:ORG0000Hljmp0100HORG0100HStart:movA,#5Ahsjmp$END第17页/共81页定义字节伪指令格式:<标号:>DB<项或项表>功能:把项或项表的数值存入从标号开始的连续单元,其中项或项表可以是一个字节、数或以引号括起来的字符串。ORG1000HDat:DB11h,-1,’A’,’BCD’END该指令只能为程序存储器赋初值,不能为其他存储器赋初值,尤其不能为内部数据存储器赋初值。注意:1000H11HFFH41H42H程序存储器43H44H补码ASCII码‘’第18页/共81页定义字伪指令格式:<标号:>DW<项或项表>功能:把项或项表的数值存入从标号开始的连续单元,其中项或项表是一个字(两字节)。ORG1000HDat:DW1122h,3344h,-1END1000H11H22H33H44H程序存储器只对程序存储器起作用FFHFFH第19页/共81页定义位伪指令格式:<符号>BIT<位地址>功能:定义位变量地址UBIT20H.0VBIT20H.1WBIT20H.2XBITP1.0YBITP2.4ZBITP3.2QBITTCON.2第20页/共81页赋值伪指令格式:<符号>EQU<变量值>功能:定义符号变量值XEQU05HYEQU06HNEXTEQU2000H格式:<符号>DATA<变量值>功能:定义符号变量值(内部RAM)ONEDATA30H(数据或地址)TWODATAONE+1第21页/共81页4.2.1简单程序设计语句1语句2语句n结束……Ø 特点:从第一条指令开始依次执行每一条指令,直到程序执行完毕,中间没有转移指令,没有分支。只有一个入口一个出口。入口出口1、[例4-3]两位压缩的BCD码转换成相应的ASCII码算法1ANL拆字、ORL#30H拼字算法2DIV拆字、ORL#30H拼字存储两位BCD数指压缩的BCD码占一个单元相应的ASCII码占二个单元2、[例4-4]将8位无符号二进制数转换成三位BCD码算法1DIV100得百位,再DIV10的十位和个位算法2DIV10的个位,再DIV10的十位和百位存储8位无符号二进制数占一个单元个位、十位和百位各占一个单元第22页/共81页4.2.2分支程序设计用条件转移语句实现二分支用cjne实现三分支例4-6多分支用jmp@A+DPTR实现多分支第23页/共81页根据不同的条件,执行不同的程序段。JZ、JNZ、JC、JNC、JB、JNB、CJNE、DJNZ正确合理地运用用条件转移语句实现二分支条件语句组1语句组2YesNo入口出口第24页/共81页用cjne实现三分支编程要点:cjne=等于≠不等于则:jc<小于或jnc>大于如何实现≤?≥?ORG0000HCjneR3,#15,NEQsjmpL1;=15NEQ:jnCL1;>15sjmpL2;<15L1:nop;≥15……L2:第25页/共81页≠?Cy=0?语句组1语句组2语句组3入口YesYesNoNoCJNE出口或CY=1?第26页/共81页y=(R0)x(R1)y2、判正负CJNER0,#0,NZEROCLRCMOVA,R0SUBBA,#0JZZEROMOVA,R0JZZERO其它方法?分析:1、判零MOVA,R0JNBACC.7,positiveCJNER0,#7FH,DO1SJMPpositiveDO1:JCpositive……;negativePositive:….∴0FFH~80Hnegative00H~7FHpositive第27页/共81页用cjne实现三分支cjneR0,#0,MP1movR1,#0sjmpMP3MP1:movA,R0jnbACC.7,MP2movR1,#0FFhsjmpMP3MP2:movR1,#01hMP3:sjmp$endy=开始结束y0y-1y+1x=0?x<0?YYNN(R0)x(R1)y判正负判零分支间隔离第28页/共81页ORG1000HONEDATA30HTWODATA31HMAXDATA32HCLRCMOVA,ONESUBBA,TWOJZXMAXJBACC.7,NEGJBOV,YMAXSJMPXMAXNEG:JBOV,XMAXYMAX:MOVA,TWOSJMPRMAXXMAX:MOVA,ONERMAX:MOVMAX,ASJMP$END[例4-6]ONE和TWO单元中的两个带符号数比较大小,将较大者存入MAX单元中。两数相等则任一个存入MAX即可。若X-Y为负,则OV=0,X<YOV=1,X>Y若X-Y为正,则OV=0,X>YOV=1,X<Y第29页/共81页用jmp@A+DPTR实现多分支KeyB5:movDPTR,#JMPTBLclrCsubbA,#0AhrlAJMP@A+DPTRJMPTBL:ajmpAAAajmpBBBajmpCCCajmpDDDAAA:……BBB:…键入10,转AAA11,转BBB12,转CCC13,转DDDCCC:……DDD:……第30页/共81页(A)=?语句组1语句组2语句组3语句组40AH0BH0CH0DH入口AAABBBCCCDDD第31页/共81页4.2.3循环程序设计循环程序结构循环程序通常有两种编制方法循环问题的类型循环程序设计举例第32页/共81页循环程序结构循环初始化:循环控制变量的初始化、数据变量的初始化循环工作部分:循环主体,重复执行的部分循环控制部分:循环变量的修改、终止控制循环结束:这部分程序用于存放执行循环程序所得结果以及恢复各单元的初值。第33页/共81页1、先循环处理后循环控制,称为直到型循环;2、先循环控制后循环处理,称为当型循环。     循环程序通常有两种编制方法第34页/共81页1、计数型—举例循环次数已知,用计数方法控制循环的终止。2、条件型—循环次数未知,根据某种条件判断是否终止循环。[例4-7]内部RAM块传,遇到“#”字符结束3、计数型+条件型[例4-8]8031外部RAM块传及冒泡排序重点 循环问题的类型第35页/共81页单循环程序例1:多个单字节数求累加和计数型例2:内部数据区清零计数型[例4-7]内部RAM块传改为条件型没讲多重循环程序例3:50ms延时程序计数型[例4-7]内部RAM块传计数型+条件型没讲[例4-8]外部RAM块冒泡排序重点计数型+条件型没讲循环程序设计举例第36页/共81页例1:多个单字节数求累加和ORG0000HSUM:movR3,#0movR4,#0movR0,#50HmovR2,#5Loop:movA,R4addA,@R0movR4,AincR0clrAaddcA,R3movR3,AdjnzR2,Loopsjmp$END内部RAM50HR0R4R3R4R3@R0CY+ADDCADD23H98H0A8H0FDH6DH累加和单元要先请零∑第37页/共81页例2:内部数据区清零ORG0000HZero:movR0,#30HmovR7,#10movA,#00HLoop:mov@R0,AincR0djnzR7,Loopsjmp$END内部RAM30HR023H98H0A8H0FDH…00000010个第38页/共81页例3:50ms延时程序Delay:movR7,#200Del1:movR6,#123nopDel2:djnzR6,Del2djnzR7,Del1sjmp$;(不计入);1us;1us;1us;2us;2usT=[200×(1+1+123×2+2)+1]×1us=50001us=50ms第39页/共81页[例4-7]把内部RAM中起始地址为BLK1的数据块传送到外部RAM以BLK2为起始地址的区域,直到遇到“#”字符的ASCⅡ码为止。去掉块长度。参考程序如下:ORG2000HBLK1EQU30HBLK2EQU1000HMOVSP,#6FHMOVR0,#BLK1;BLK1数据块起始地址MOVDPTR,#BLK2;BLK2数据块起始地址XH:CLRCMOVA,@R0;取数据PUSHACCSUBBA,#23H;判是否为“#”字符JZSTOPPOPACCMOVX@DPTR,A;数据传送INCR0INCDPTRAJMPXH;循环控制STOP:SJMP$END原题为计数型+条件型改为条件型第40页/共81页[例4-7]把内部RAM中起始地址为BLK1的数据块传送到外部RAM以BLK2为起始地址的区域,直到遇到“#”字符的ASCⅡ码为止。块长度在R1中。参考程序如下:ORG2000HBLK1EQU30HBLK2EQU1000HNEQU100MOVSP,#6FHMOVR0,#BLK1;BLK1数据块起始地址MOVDPTR,#BLK2;BLK2数据块起始地址MOVR1,#N;块长度INCR1SJMPCHECK;防止数据块的长度为零XH:CLRCMOVA,@R0;取数据PUSHACCSUBBA,#23H;判是否为“#”字符JZSTOPPOPACCMOVX@DPTR,A;数据传送INCR0INCDPTRCHECK:DJNZR1,XH;循环控制计数STOP:SJMP$END计数型+条件型条件改错第41页/共81页[例4-8]设单片机8031外部RAM从3600H单元开始存放有100个无符号数,试编写程序能使它们按从小到大的顺序排列。(最小的数放在3600H单元) 解:排序程序采用“冒气泡”的方法,其“冒气泡”的过程如下:(设N=5时)98542985243600H3600H排序前排序后外部RAM第42页/共81页85429542842524第一轮比较4次第二轮比较3次第三轮比较2次第四轮比较1次9854289542859428549285425842548254242452对n个数,则要进行n-1轮扫描,在第i轮扫描中要进行n-i次比较。可以推知:若将原始数据改为98245,则排序过程如下:第43页/共81页82459245824524第一轮比较4次第二轮比较3次第三轮比较2次第四轮比较1次9824589245829458249582452845248524524245可以看出:第三轮排序中没有发生交换,即第三轮结束后,已经排好了,应结束排序,不必再排第四轮。为此增加一个“排好序标志位”,预先将它清0,当产生交换时,将它置1,表示没排好,可以进行下一轮排序,否则,结束排序。第44页/共81页外循环中循环内循环计数条件计数轮数排好序标志轮内比较次数1N-1有交换置1继续N-1次N-2无交换跳出结束N-2次N-3N-3次……N-222次N-111次倒计数倒计数逻辑变量第45页/共81页36H00H01H02H03H04H05H06HP2R0R1movxA,@R0mov30h,AmovxA,@R1movx@R0,AxchA,30Hmovx@R1,A交换用一个指针?用一个R0?用一个DPTR?A30H第46页/共81页冒泡法排序ORG0000hmovPSW,#00hmovP2,#36hmovR2,#100-1Loop0:movR0,#00hmovR1,#01hmov03h,R2clr7Fh;排好序标志清0Loop1:movxA,@R0mov30h,AmovxA,@R1cjneA,30h,Loop2sjmpL1Loop2:JNCL1;小到大,JC大到小movx@R0,AxchA,30hmovx@R1,Asetb7Fh;排好序标志置1L1:incR0incR1djnzR3,Loop1;轮内次数jnb7Fh,Loop3;排好序标志djnzR2,Loop0;轮数Loop3:sjmp$END交换第47页/共81页4.2.6子程序设计子程序设计方法子程序的调用过程与子程序嵌套调用过程中的参数传递通过寄存器传递通过堆栈传递通过数据指针(DPTR)传递第48页/共81页子程序设计方法格式:;子程序名;子程序功能:;入口参数:;出口参数:;占用资源:子程序名:...第49页/共81页子程序的调用过程与子程序嵌套主程序要调用子程序时通过call指令子程序执行完后通过ret指令返回防止自然进入子程序和自然退出子程序子程序嵌套正在执行主程序CPU正在执行子程序SubACPU正在执行子程序SubB第50页/共81页通过寄存器传递方法简单、参数有限例:ORG0000HMain:movsp,#5FHmovR0,#40HmovR7,#10HlcallZerosjmp$;子程序名:Zero;功能:对内部数据区清零;入口参数:R0内部数据区;R7内部数据区长度;出口参数:无;占用资源:A,R0,R7Zero:clrALoop:mov@R0,AincR0djnz,R7,LoopretEND第51页/共81页通过堆栈传递ORG0000HMain:MOVSP,#5FHmov70H,#40hmov71H,#10Hpush70hpush71hlcallZerosjmp$;子程序名:Zero;功能:对内部数据区清零;入口参数:70内部数据区地址;71h内部数据区长度;出口参数:无;占用资源:,R0,R7,70h,71hZero:popDPHpopDPLpop07h;R7pop00h;R0clrALoop:mov@R0,AincR0djnz,R7,LooppushDPLpushDPHretENDSP5FH61H40H10HPCLPCH63H第52页/共81页ZERO:MOVR0,SPDECR0DECR0MOV07H,@R0DECR0MOV01H,@R0CLRALOOP:MOV@R1,AINCR1DJNZ,R7,LOOPRETENDORG0000HMain:MOVSP,#5FHmov70H,#40hmov71H,#10Hpush70hpush71hlcallZeropopaccpopaccsjmp$方法2:SP5FH61H40H10HPCLPCH第53页/共81页通过数据指针(DPTR)传递将待传递参数紧跟在调用指令之后ORG0000HMain:MOVSP,#6FHNOPACALLPRINTDB‘THISISAN’DB’EXAMPLE’DB0AH,0DH,00HNEXT:NOPSJMP$PRINT:POPDPHPOPDPLPPP1:MOVA,#00HMOVCA,@A+DPTRINCDPTRJZPPPENDPPP2:MOVP1,ASJMPPPP1PPPEND:JMP@A+DPTREND第54页/共81页4.2.7运算程序设计多字节加、减、乘、除运算程序的设计1.多字节加减运算程序设计[例4-19]多字节无符号数求和[例4-20]8位二进制带符号数加法[例4-21]多字节减法子程序[例4-22]BCD数减法运算程序2.多字节乘除运算程序设计[例4-23]两个16位二进制无符号数相乘(连加)[例4-24]16位二进制无符号数除法[例4-25]两个16位二进制带符号数相乘[例4-26]两位十进制数乘法程序设计[例4-27]两位十进制数除法程序设计3.讲解举例第55页/共81页查表程序•以PC为指针•以DPTR为指针4.2.4查表程序设计第56页/共81页4.2.5散转程序设散转程序•转移指令表•地址偏移量表•转向地址表第57页/共81页逻辑运算程序ASCII码二进制数据的拼装与逻辑简单实例多字节左移一位讲解举例算术运算程序•两个多字节数加法•多字节BCD码减法•多字节左移加乘法•多字节乘法,用MUL指令第58页/共81页两个多字节数加法ORG0000HJIA:MOVR0,#40HMOVR1,#50HMOVR2,#4CLRCJIA1:MOVA,@R1ADDCA,@R0MOV@R0,AINCR0INCR1DJNZR2,JIA1MOVF0,CSJMP$END2F5BA7C3H(43424140)H+14DF35B8H(53525150)H443ADD7BH(43424140)H(F0)(CY)用三个指针怎么做?第59页/共81页ORG1000HMOVR0,#40HMOVR1,#50HMOVR2,#4SETBRS0MOVR0,#60HCLRRS0CLRCLOOP:MOVA,@R0ADDCA,@R1INCR0INCR1SETBRS0MOV@R0,AINCR0CLRRS0DJNZR2,LOOPMOVF0,CSJMP$END+0区R00区R11区R040H50H60H例:24H+56H=7AH((R0))((R0))((R0))0区1区2区问:下例怎么设计?第60页/共81页多字节BCD码减法99887766H(43424140)H-44556677H(53525150)HORG0000HJia:movR0,#40hmovR1,#50hmovR2,#4clrCJia1:movA,#9AhsubbA,@R1addA,@R0daACPLCmov@R0,AincR0incR1djnzR2,Jia1movF0,Csjmp$END9AH-77H23H+66H89HCY=19AH66H133H+77HAAH+66H10HCY=09AH55H45H+88HCDH+66H33HCY=09AH-44H56H+99HEFH+66H55HCY=09999999AH-44556677H??????????9A9AH第61页/共81页数据的拼装x7x6x5x4x3x2x1x0(20H)y7y6y5y4y3y2y1y0(21H)y2y1y0x4x3x2x1x0(30H)ORG0000HSTART:MOV30H,20HANL30H,#00011111BMOVA,21HSWAPARLAANLA,#11100000BORL30H,ASJMP$END第62页/共81页ASCII码二进制ORG0000HAtoH:MOVA,#’A’CLRCSUBBA,#30HCJNEA,#0AH,NEQSJMPBIGNEQ:JCAENDBIG:SUBBA,#07HAEND:SJMP$ENDORG0000HHtoA:MOVA,#0BHADDA,#90HDAAADDCA,#40HDAASJMP$END0BH+90H9BH+66H101H40H+142H第63页/共81页与逻辑简单实例P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0执行主程序的逻辑函数:F=P1.6●P1.4●P1.2P1.2——准备就绪信号,为“1”表示就绪P1.4——主回路工作正常信号,为“1”表示正常P1.6——启动开关闭合信号,为“1”表示闭合程序片段:WAIT:MOVA,P1;(P1)=XXXXXXXXBANLA,#54H;01010100BCJNEA,#54H,WAIT;F=1?MAIN:……;主程序第64页/共81页多字节左移一位0cycycy10010011100100001001011030H31H32Hcy100100110100100001100101101B3L:CLRCLOOP:MOVA,@R0RLCAMOV@R0,AINCR0DJNZR2,LOOPRETENDORG2000HMAIN:MOVSP,#5FHMOVR0,#30HMOVR2,#3ACALLB3LSJMP$第65页/共81页两个多字节数左移加乘法算法简介:例:1011B×1001B1011B×1001B1011+101100001100011B手算:机器算:1001000000100000+101100101011010101101010110001011000+1011011000111CY001乘数扩展积被乘数+先左移,再判断为1,加被乘数CY积第66页/共81页循环初值:1、乘法次数=左移次数=乘数的位数=(R3)*82、左移字节数=乘数的字节数+被乘数的字节数=积的字节数(R3)+(R2)=(R5)3、扩大部分积的字节数=被乘数的字节数,=扩大部分积要清零的单元数=(R2)4、加法次数=(R2),有CY=1,再ADDC处理存储结构:(R0)=45H,(R1)=43H(R6)=(R1)-(R2)=43H-3=40H47H46H45H44H43H42H41H40H被乘数最低位乘数最低位积最低位积R0R1第67页/共81页ORG0000HMIAN:MOVR0,#45HMOVR1,#43HMOVR2,#3MOVR3,#2MOVA,R3ADDA,R2MOVR5,AMOVA,R1CLRCSUBBA,R2MOVR6,AMOVR7,00HMOVA,#0MOV00H,R6MOV20H,R2LOOP:MOV@R0,AINCR0DJNZ20H,LOOPMOVB,R3MOVA,#8MULABMOV21H,AGOON:MOV22H,R5MOVR1,06HCLRCRLCP:MOVA,@R1RLCAINCR1DJNZ22H,RLCPMOVR1,06HJNCNEXTMOV22H,R2MOVR0,07HCLRCADDP:MOVA,@R0ADDCA,@R1MOV@R1,AINCR0INCR1DJNZ22H,ADDPJNCNEXTMOVA,@R1ADDCA,#0MOV@R1,AJNCNEXTINCR1MOVA,@R1ADDCA,#0MOV@R1,ANEXT:DJNZ21H,GOONSJMP$END第68页/共81页用MUL指令做多字节乘法3344H*56H4456H4456L+3356H3356L(32H)(31H)(30H)例:3344H*56H=?ORG3000HMOVA,#44HMOBB,#56HMULABMOV30H,A;(A)=4456L=(30H)MOV31H,B;(B)=4456H=(31H)MOVA,#33HMOVB,#56HMULAB;(A)=3356LADDA,31H;4456H+3356L=(31H))MOV31H,ACLRAADDCA,B;(B)=3356H+CYMOV32H,ASJMP$END第69页/共81页查表程序实现查表算法。该方法把事先计算或实验数据按一定顺序编成 表格 关于规范使用各类表格的通知入职表格免费下载关于主播时间做一个表格详细英语字母大小写表格下载简历表格模板下载 ,存于程序存储器内,然后根据输入参数值,从表中取得结果。查表指令:MOVCA,@A+DPTR查表前数据表格表头地址存入DPTR,要查得的数在表中相对表头地址的偏移量送入累加器A,最后MOVCA,@A+DPTR完成查表,可在64KB内查表因为DPTR可以人为修改。MOVCA,@A+PC分为三步:1)用传送指令把所查数据的项数送入累加器A;2)使用ADDA,#data指令对累加器A进行修正,data值由下式确定:PC当前值+data=数据表头地址实际上data值等于查表指令和数据表格之间的字节数;3)用指令MOVCA,@A+PC完成查表由于PC指针只能在A中提供的偏移地址的范围内查表,故,查表范围进在一页内。查表程序设计第70页/共81页7402240383F880FE30313233PCASCTAB+00123ASCTAB+2PC当前值3BPC当前值+3=PC当前值+3+2=表头(A)补偿值=表头地址-PC当前值表中偏移量MOVA,#2ADDA,#03H;计算偏移量MOVCA,@A+PC;查表MOVR0,A;存结果SIMP$ASCTAB:DB‘0’,‘1’,‘2’,‘3’第71页/共81页ORG0100HMOVA,R0;取转换值ANLA,#0FH;屏蔽高四位ADDA,#03H;计算偏移量MOVCA,@A+PC;查表MOVR0,A;存结果SIMP$ASCTAB:DB‘0’,‘1’,‘2’,‘3’DB‘4’,‘5’,‘6’,‘7’DB‘8’,‘9’,‘A’,‘B’DB‘C’,‘D’,‘E’,‘F’END303132333435363738394142ASCTAB1B2BPC当前值3B第72页/共81页以PC为指针查表程序TB1:movA,R2addA,R2movR3,AaddA,#07HmovcA,@A+PCxchA,R3addA,#03H+1movcA,@A+PCmovR4,Asjmp$TAB1:DW1520H,7586HDW2345H,1000HDW883H,9943HDW4051H,6785HDW4468H,5871HEND152075862345100008839943TAB11B2B1B1B2B第73页/共81页以DPTR为指针查表程序LTB2:movDPTR,#TAB2movA,R3clrCrlcAmovR3,AxchA,R2rlcAxchR2,AaddA,DPLmovDPL,AmovA,DPHaddcA,R2movDPH,AclrAmovcA,@A+DPTRmovR2,AclrAincDPTRmovcA,@A+DPTRmovR3,AretTAB2:DW......……END第74页/共81页使用转移指令表的散转程序ORG0000HmovR2,#2Main:movDPTR,#TAJ1movA,R2addA,R2jncNADDincDPHNADD:jmp@A+DPTRTBJ1:ajmpPRG0ajmpPRG1ajmpPRG2ajmpPRG3sjmp$PRG0:movA,#0sjmpHaltPRG1:movA,#1sjmpHaltPRG2:movA,#2sjmpHaltPRG3:movA,#3Halt:sjmp$END第75页/共81页使用地址偏移量表的散转程序JMP3:movR2,#2movDPTR,#TBJ3movcA,@A+DPTRjmp@A+DPTRTBJ3:DBPRG0-TBJ3DBPRG1-TBJ3DBPRG2-TBJ3DBPRG3-TBJ3DBPRG4-TBJ3DBPRG5-TBJ3PRG0:movR0,#0sjmpHaltPRG1:movR0,#1sjmpHaltPRG2:movR0,#2sjmpHaltPRG3:movR0,#3sjmpHaltPRG4:movR0,#4sjmpHaltPRG5:movR0,#5Halt:sjmp$END第76页/共81页使用转向地址表的散转程序JMP4:movR2,#1movDPTR,#TBL4movA,R2addA,R2jncNADDincDPHNADD:movR3,AmovcA,@A+DPTRxchA,R3incAmovcA,@A+DPTRmovDPL,AmovDPH,R3clrAjmp@A+DPTRTBL4:DWPRG0DWPRG1DWPRG2DWPRG3PRG0:movR0,#0sjmpHaltPRG1:movR0,#1sjmpHaltPRG2:movR0,#2sjmpHaltPRG3:movR0,#3Halt:sjmp$end第77页/共81页专题五结束下次见第78页/共81页3.6第六讲2学时内容专题四第三章1、位操作指令及举例2、调用子程序和返回指令及举例专题五1、4.1节5个问题2、4.2节4.2.1顺序程序4.2.2分支程序4.2.3循环程序及举例3个还有三个没讲第79页/共81页3.10第七讲内容1、循环程序举例(1)条件型(2)冒泡排序条件+计数2、子程序参数传递及举例3.13第八讲1、实验讲解2、运算类程序3.17第九讲第五周实验一1、查表2、散转3、教科书中运算程序讲点第80页/共81页
本文档为【单片机汇编语言程序设计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
莉莉老师
暂无简介~
格式:ppt
大小:595KB
软件:PowerPoint
页数:0
分类:
上传时间:2021-10-16
浏览量:1