第3章程序设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

单片机微型计算机与单片机微型计算机与接口技术接口技术(第5版)第三章汇编语言程序设计李群芳主编第3章汇编语言程序设计3.1概述无论哪种嵌入式系统,都有两种编程语言------汇编语言和高级语言(主要是C语言)。汇编语言产生的目标程序简短,占用存储空间小,执行快,能充分发挥计算机的硬件功能。高级语言编程快捷,但程序长,占用存储空间大,执行的实时较差;为发挥各自的优势,在复杂的嵌入式系统中,往往实时控制部分采用汇编语言,而数据的运算和处理部分采用C语言。因此对于嵌入式系统的工程师而言,两种语言都必须掌握。无论是高级语言还是汇编语言,源程序都要转换成目标程序(机器语言)计算机才能执行。支持写入8XX51单片机或仿真调试的目标程序有两种文件格式:.BIN文件和·HEX文件,.BIN文件是由编译器生成的二进制文件,是程序的机器码。·HEX文件是由INTER公司定义的一种格式,这种格式包括地址、数据和校验码,并用ASCII码来存储。.BIN文件需通过符号转换程序OHS51进行转换,成为·HEX文件后,才能显示并可供打印出来,两种语言的操作过程见图3-1。连接/定位器L51汇编语言源程序汇编器A51符号转换程序OHS51绝对地址目标程序.BINC语言程序浮动地址目标程序编译器C51·HEX图3-1两种语言源程序转换成目标程序•汇编:将汇编语言源程序转换成机器语言目标程序的过程称为汇编。(翻译)•汇编程序:能将汇编语言源程序转换成机器语言目标程序的系统软件称为汇编程序。(翻译官)•汇编语言源程序:用户用汇编语言助记符编的应用程序。•目标程序:计算机能识别的机器码程序汇编(编译)的方法有两种:1.手工汇编:人工查指令表,查出程序中每条指令对应的机器代码。早期的计算机使用。目前很多公司将编辑器、汇编器、编译器、连接/定位器、符号转换程序做成集成软件包,用户进入该集成环境,编辑好程序后,只需点击相应菜单就可以完成上述的各步,并且还有仿真调试功能,如Wave、Keil、Proteus等。集成软件的使用方法见教材第13章。2.机器汇编:用计算机中的汇编程序对用户源程序进行汇编。用机器汇编要提供给汇编一些信息,遵循汇编程序的一些约定。这些由伪指令指定。程序设计的步骤:分析任务----确定方案算法----画出流程图----分配存储器或寄存器----编辑程序----汇编连接----仿真调试----修改程序3.2伪指令为汇编程序(翻译官)提供信息的指令,它没有机器码,不被计算机执行。常用的伪指令及功能:1.起始指令ORGnn功能:定义程序或数据块的起始地址。指示此语句后面的程序或数据块以nn为起始地址,连续存放在程序存储器中。指令地址机器码源程序ORG2000H2000H7830MAIN:MOVR0,#30H2002HE6MOVA,@R0…ORG3000H3000H23TAB:DB23H,100,‘A’3001H643002H412.字节定义标号:DB(字节常数,或字符或表达式)功能:指示在程序存储器中以标号为起始地址的单元里存放的数为字节数据(八位二进制数)。例如LN:DB32,’C’,25H,-1;LN~LN+2地址单元依次存放20H,43H,25H,FFH地址数据LN20LN+143LN+225LN+3FF3.字定义标号:DW(字常数或表达式)作用:指示在程序存储器中以标号为起始地址的单元里存放的数为字数据(即16位的二进制数)。例如:GH:DW1234H,5678H,08GH1234GH+25678GH+400085.等值指令标号EQU(数值表达式)表示EQU两边的量等值,用于为标号或标识符赋值。例如:X1EQU2000HX2EQU0FH…MAIN:MOVDPTR,#X1;DPTR=2000HADDA,#X2;A=A+0FH4.保留字节标号:DS(数值表达式)作用:指示在程序存储器中保留以标号为起始地址的若干字节单元,其单元个数由数值表达式指定。例如L1:DS32;从L1地址开始保留32个存储单元。6.位定义标号BIT[位地址]作用:同EQU指令,不过定义的是位操作地址。例如AICBITP1.1。7.汇编结束END作用:指示源程序段结束。END指令放在程序的最后。A51汇编程序还有一些其它的伪指令,列在教材表3-1中,以备查阅。后面将通过实例介绍程序设计方法。常用程序结构有顺序程序、分支程序、循环程序、子程序等。例3-1编程将外部数据存储器的000EH和000FH单元的内容相换。000EH000FH000EH000FH000EH000FH000EH000FH分析:外部数据存储器的数据操作只能用MOVX指令,且只能和A之间传送,因此必须用一个中间环节作暂存,设用20H单元。用R0、R1指示两单元的低八位地址,高八位地址由P2指示。编程过程如左图:000EH000FH000EH000FH000EH000FHA20H3.3顺序程序设计顺序程序(简单程序):程序走向只有一条路径。ORG0000HMOVP2,#0H;送地址高八位至P2口MOVR0,#0EH;R0=0EHMOVR1,#0FH;R1=OFHMOVXA,@R0;A=(000EH)MOV20H,A;(20H)=(000EH)MOVXA,@R1;A=(000FH)XCHA,20H;A=(000EH),(20H)=(000FH)MOVX@R1,AMOVA,20HMOVX@R0,A;交换后的数送各单元SJMP$END例3-2:将R4R5双字节符号数求补码程序。ORG0000HMOVA,R4JBACC.7,CPLL;判符号位SJMP$;正数的补码=原码CPLL:MOVA,R5;取低字节CPLAADDA,#1;低字节变补MOVR5,AMOVA,R4;取高字节CPLAADDCA,#0;高字节变补ORLA,#80H;恢复负号MOVR4,ASJMP$分析:先判符号,再根据不同情况处理。地址数据TAB0TAB+11TAB+24TAB+39TAB+416HTAB+525H例3-3求Y=X2(0≤X≤5)。分析:变量X放在片内RAM的20H单元,其值为00H~05H之间,Y在片内RAM的21H单元,在程序存储器安排一张平方表,通过查表求Y=X2这样比完成X*X编程简便多了。表ORG0000HMOVDPTR,#TABMOVA,20H;取XMOVCA,@A+DPTR;查表MOV21H,A;存于YSJMP$TAB:DB00H,01H,04H,09H,16H,25HEND首地址为TAB,以DPTR指向表首址,利用查表指令MOVCA,@A+DPTR,即可求得。表中数据用BCD码存放合乎人们的习惯.如果平方值为两个字节,程序应如何编。DPTRA例3-4分解压缩式BCD码,使其成为非压缩式BCD码。如把65H→06H和05H,见图ORG0000HMOVR0,#40H;设指针MOVA,@R0;取一个字节MOVR2,A;暂存ANLA,#0FH;清0高半字节INCR0MOV@R0,A;保存数据个位片内RAM42H41H40H65MOVA,R2SWAPA;十位换到低半字节ANLA,#0FHINCR0MOV@R0,A;保存数据十位SJMP$05063.4分支程序的设计由条件转移指令构成程序判断框部分,形成分支结构,通常转移条件取决标志位。常见的分支见下图:条件满足?N影响条件Y处理段条件满足?N影响条件Y处理1处理2【例3-5】在内部RAM的40H和41H地址单元中,有2个无符号数,试编程比较这两数的大小,将大数存于内部RAM的GR单元,小数存于LE单元,如两数相等,则分别送入GR和LE地址单元。分析采用CJNE指令,即可以判断相等与否,还可以通过CY标志判断大小,程序如下:ORG0000HMOVA,40HCJNEA,41H,NEQ;两数不等转NEQMOVGR,A;两数相等,GR单元和LE单元均存此数MOVLE,ASJMP$NEQ:JCLESS;A小则转LESSMOVGR,A;A大,大数存GR单元MOVLE,41H;小数存LE单元SJNE$LESS:MOVLE,A;A小,小数存LE单元MOVGR,41H;大数存GR单元SJMP$GREQU30HLEEQU31HEND[例3-6】设变量X以补码形式存放在片内RAM的30H单元,函数Y与X有如下关系式:XX0Y=20HX=0X+5X0试编制程序,根据X的取值求出Y,并放回原单元。分析取出变量后进行取值范围的判断,对符号的判断可用位操作类指令,也可用逻辑运算类指令,本例用逻辑运算指令,程序框图及程序如下:开始(30H)AA=00HA00H(30H)+05H(30H)结束20H(30H)YNYNORG0000HMOVA,30HJZNEXT;判断是否为零ANLA,#80H;判断符号位JZED;X0转EDMOVA,#05H;X0完成X+5ADDA,#30HMOV30H,ASJMPEDNEXT:MOV30H,#20H;X=0,Y=20HED:SJNE$例用单片机加重力传感器作磅秤,秤出重量后算出行李运费价格,其秤出的重量以10kg为1个计价单位G,G已存入40H单元。计价方法为50kg以内按3元,50kg以上分段计价:50kg按3元计价,超过部分按2元计价。由此列出算式:G×3+(G-5)×2;当G>5M=G×3;当G≤53G因重复使用,先暂存在R2。流程见左,程序如下:(A-5)*2+R2R2NYR2(41H)(40H)A(A=G)3GR2A=5?开始结束ORG0100HFRT:MOVA,40H;取行李重量计价单位GMOVR3,AMOVB,#03H;运费M=G×3MULABMOVR2,A;暂存3GMOVA,R3;取回GCJNEA,#05H,L1;G≤5?SJMPWETCL1:JCWETC;是,转至WETCSUBBA,#05H;否则M=3G+2(G-5)RLCAADDA,R2MOVR2,AWETC:MOV41H,R2;存运费MRET当程序中的某些指令需要反复执行多次时,采用循环程序的方式,这样会使程序缩短,节省存储单元(并不节省执行时间)。循环次数的控制,有两种控制方式:•第一种方法先判断再处理,即先判断满不满足循环条件,如不满足,就不循环,多以循环条件控制。•第二种方法先处理再判断,即循环执行一遍后,下一轮还需不需要进行,多以计循环次数控制。循环可以有单重循环和多重循环,在多重循环中,内、外循环不能交叉,也不允许外循环跳入内循环。下面通过几个实例说明循环程序的设计方法。3.5循环程序设计例3-9设计一个延时10ms的延时子程序,已知单片机使用的晶振为6MHz。分析延时时间与两个因素有关:晶振频率和循环次数。由于晶振采用6MHz,一个机器周期是2μs,用单循环可以实现1ms延时,外循环10次即可达10ms延时。内循环如何实现1ms延时呢,程序中可先以未知数MT代替,从附录A查每条指令机器周期计算程序的执行时间。ORG0020HMOVR0,#0AH;外循环10次DL2:MOVR1,#MT;内循环MT次DL1:NOPNOP;空操作指令DJNZR1,DL1DJNZR0,DL2RET111122内循环DL1到指令DJNZR1,DL1的计算:(1+1+2)×2μS×MT=1000μSMT=125=7DH将7DH代入上面程序的MT,计算总的延时时间:{1+[1+(1+1+2)×125+2]810}×2μS=10062μS=10.062mS若需要延时更长时间,可以采用多重循环。机器周期数内外MCS-51单片机有着优异的位逻辑功能,可以方便的实现各种复杂的逻辑运算.这种用软件替代硬件的方法,可以大大简化甚至完全不用硬件,但比硬件要多花运算时间。例3-14编写一程序,以实现图3-7中的逻辑运算电路.3.6位操作程序设计P1.311&&1P1.1P2.2TF0IE125H(位)26H(位)其中P1.1和P2.2分别是端口线上的信息,TF0和IE1分别是定时器定时溢出标志和外部中请求标志,25H和26H分别是两个位地址,运算结果由端口线P1.3输出。图3-7硬件逻辑运算电路程序如下:START:MOVC,

1 / 35
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功