第4章 89S51的汇编语言程序设计_第1页
第4章 89S51的汇编语言程序设计_第2页
第4章 89S51的汇编语言程序设计_第3页
第4章 89S51的汇编语言程序设计_第4页
第4章 89S51的汇编语言程序设计_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章89S51的汇编语言程序设计程序编制的方法和技巧4.1源程序的编辑和汇编4.2基本程序结构4.3子程序及其调用4.42023/2/51

单片机应用系统由硬件系统和应用程序构成。

汇编语言高级语言(例如,C语言)

应用程序设计方法

汇编语言,生成的目标程序占内存空间少、运行速度快,具有效率高、实时性强的特点。

高级语言,对系统的描述与实现与人的思维相似,程序阅读、修改和移植方便,适合于编写复杂的程序。2023/2/524.1程序编制的方法和技巧4.1.1程序编制的步骤

明确任务:功能要求、技术指标运行环境调研

任务分析

将实际问题转化为计算机处理的程序算法。算法比较与优化(内存需求、运行速度、效率)。

算法设计2023/2/53强化模块观念使程序结构清晰。简化代码。程序模块(主程序模块、各种子程序模块)模块化优点:分块设计、层次清晰、便于接口。4.1.2程序编制的方法和技巧采用循环和子程序的优点注意:1、循环初值和结束条件,避免“死循环”现象。

2、子程序的现场保护。2023/2/544.1.3汇编语言的语句格式标号代表本行程序所在的地址。标号由1~8个ASCII码字符组成,第一个字符必须是字母。不能用已定义的关键字(指令助记符、伪指令等)。同一标号在一个程序中只能定义一次,不能重复定义。标号后跟英文冒号“:”。标号(即符号地址)[标号:]指令助记符

[操作数1,][操作数2,][操作数3,][;注释]2023/2/55数据:二进制(B)十进制(D或省略D)十六进制(H)。

注意:若十六进制操作数以字符A~F开头,需在它前面加一个“0”,以便汇编时把它和标号区分开。符号:符号名、标号或“$”。表达式:由运算符和数据构成。操作数2023/2/56注释英文分号“;”开头。汇编时,遇到“;”就停止“翻译”。因此,注释字段不会产生机器代码。2023/2/574.2.1伪指令4.2源程序的编辑4.2.2源程序的编辑2023/2/584.2.1伪指令伪指令:用于指导汇编工作。汇编后,伪指令没有与之对应的机器代码。起始地址设定伪指令ORGORG表达式表达式通常为十六进制地址,例:

ORG8000HSTART:MOVA,#30H……ORG可多次使用,但地址值的顺序要由小到大。2023/2/59结束汇编伪指令ENDEND该伪指令位于源程序的最后一行,表示汇编到此结束。整个源程序中只能有一条END命令,且位于程序的最后。对于END之后的程序,将不进行汇编处理。2023/2/510定义字节数据表伪指令DB定义字数据表伪指令DW1000H[标号:]DB字节数据表ORG1000HDB-2,-4,-6,8,10,18FEHFCHFAH08H0AH12H1001H[标号:]DW字数据表ORG1400HDATA1:DW324AH,3CH1400H32H4AH00H3CH1401H1402H1403H注意:字母按ASCII码存储。2023/2/511预留空间伪指令DS[标号:]DS预留空间字节数ORG2000HTAB1:DB12H,34HDS4HDB'5'12H34H----35H3000H3001H3002H3003H3004H3005H3006H2023/2/512定义常量值的伪指令EQU符号名EQU常值表达式

LEN

EQU10

SUM

EQU21HBLOCK

EQU22HMOVR7,#LENMOVR0,#BLOCKMOVSUM,A2023/2/513位定义命令BIT用于给字符名称赋予位地址,位地址可以是绝对位地址,也可是符号地址。例如:LED BITP1.6功能是把P1.6的位地址赋给变量LED。2023/2/5144.2.2源程序的编辑源程序的编辑

ORG0000HLJMPMAIN

ORG0040HMAIN:MOVR7,#16MOVR0,#60HMOVA,#55HLOOP:MOV@R0,AINCR0DJNZR7,LOOPSJMP$

END依据汇编语言规则用好伪指令符号不用中文汇编程序以.ASM存盘2023/2/5154.3.1顺序程序(无分支、无循环)4.3基本程序结构

ORG0040HSTART:MOVA,21H;取21H的内容ANLA,#0FH;保留低半字节SWAPA;移至高半字节MOV20H,A;存于20H单元MOVA,22H;取22H的内容ANLA,#0FH;保留低半字节ORL20H,A;合并到结果单元SJMP$;等待END2023/2/5164.3.2分支程序(双分支)【例】实现两个8位无符号数求和的子程序。SADD:MOVA,R3;取加数(在R3中)

CLRCADDA,R4;被加数(在R4中)加AJCPP1MOVR3,#00H;结果小于255时,高字节R3内容为00HSJMPPP2PP1:MOVR3,#01H;结果大于255时,高字节R3内容为01HPP2:MOVR4,A;结果的低字节在R4中

RET入口:(R3)=加数;(R4)=被加数。出口:(R3)=和的高字节;(R4)=和的低字节。2023/2/517【例】求单字节有符号数的二进制补码。

正数补码是其本身,负数补码是其反码加1。因此,应首先判被转换数的符号,负数进行转换,正数本身即为补码。设二进制数放在A中,其补码放回到A中。参考程序如下:

CMPT:JNBAcc.7,RETURN ;(A)>0,不需转换 MOV C,Acc.7 ;符号位保存 CPLA ;(A)求反,加1 ADD A,#1 MOVAcc.7,C ;符号位存在A的最高位RETURN:RET2023/2/5184.3.2分支程序(多分支)多分支结构是程序中常见的结构,在多分支结构的程序中,能够按调用号执行相应的功能,完成指定操作。若给出调用号来调用子程序,一般用查表方法,查到子程序的地址,转到相应子程序。2023/2/519指令系统提供了非常有用的两种多分支选择指令:间接转移指令

JMP@A+DPTR比较转移指令

CJNEA,direct,rel CJNEA,#data,rel CJNERn,#data,rel CJNE@Ri,#data,rel间接转移指令“JMP@A+DPTR”由数据指针DPTR决定多分支转移程序的首地址,由A的内容选择对应分支。4条比较转移指令CJNE能对两个欲比较的单元内容进行比较,当不相等时,程序实现相对转移;若两者相等,则顺序往下执行。2023/2/520【例】设变量x存放在片内RAM的30H单元,变量y与x的关系是:当x大于0时,y=x;当x=0时,y=20H;当x小于0时,y=x+5。编制程序,根据x的大小求y,并送回原单元。2023/2/521

ORG0040HSTART:MOVA,30H;取x至累加器

JZNEXT;x=0,转NEXTANLA,#80H;否,保留符号位

JZDONE;x>0,转结束

MOVA,#05H;x<0处理

ADDA,30HMOV30H,A;X+05H送YSJMPDONENEXT:MOV30H,#20H;x=0,20H送YDONE:SJMPDONEEND2023/2/522【例】求符号函数的值。符号函数定义如下:

X存放在40H单元,Y存放在41H单元。Y=1X

>0X

<0X

=00-12023/2/523程序如下:SIGNFUC:MOVA,40H CJNEA,#00H,NZEAR AJMPNEGTNZEAR:JBAcc.7,

POSI MOVA,#01H AJMPNEGTPOSI:

MOVA,#81HNEGT: MOV41H,

A END 2023/2/524【例】根据R7的内容x(转移序号)转向相应的处理程序。设R7内容为0~4,对应的处理程序入口地址分别为PP0~PP4。

2023/2/525START:MOVR7,#3;转移序号为3,欲转向PP3

ACALLJPNUM;子程序调用AJMPSTARTJPNUM:MOVDPTR,#TAB;DPTR指向分支入口的表首地址

MOVA,R7

ADDA,R7;R7乘2,调整偏移量(3x2=6)

MOVR3,A;A=R3=6MOVCA,@A+DPTR;先取PP3的高字节(PP3是DW)XCHA,R3;高字节暂存于R3INCA;增1后,A=7,指向下一个MOVCA,@A+DPTR;再取PP3的低字节

MOVDPL,A;处理程序入口地址低8位送DPLMOVDPH,R3;处理程序入口地址高8位送DPHCLRA;DPTR指向PP3地址

JMP@A+DPTR;跳转向PP3服务程序2023/2/526TAB:DWPP0;TAB是转移地址表DWPP1DWPP2

DWPP3DWPP4PP0:MOV30H,#0;转移序号为0时,置功能号“0”于30H单元

RETPP1:MOV30H,#1;转移序号为1时,置功能号“1”于30H单元

RETPP2:MOV30H,#2;转移序号为2时,置功能号“2”于30H单元

RET

PP3:MOV30H,#3;转移序号为3时,置功能号“3”于30H单元

RETPP4:MOV30H,#4;转移序号为4时,置功能号“4”于30H单元

RET 2023/2/5274.3.3查表程序【例4-3】

设计一子程序,功能是根据累加器A中的数x(0~9之间)查x的平方表y,根据x的值查出相应的平方y。本例中的x和y均为单字节数。

ADDA,#01H MOVCA,@A+PC RETDB00H,01H,04H,09H,10H DB19H,24H,31H,40H,51H

;数0~9的平方表

2023/2/528指令“ADDA,#01H”的作用是A中的内容加上“01H”,“01H”即为查表指令与平方表之间的“RET”指令所占的字节数。加上“01H”后,可保证PC指向表首,累加器A中原来的内容仅是从表首开始向下查找多少个单元。在进入程序前,A的内容在00~09H之间,如A中的内容为02H,它的平方为04H,可根据A的内容查出x的平方。指令“MOVCA,@A+DPTR”应用范围较广,使用该指令时不必计算偏移量,优点是表格可以设在64KB程序存储器空间内的任何地方,而不像“MOVCA,@A+PC”那样只设在PC下面的256个单元中,所以使用较方便。2023/2/529如果DPTR已被使用,则在查表前必须保护DPTR,且结束后恢复DPTR,例4-3可改成如下形式:

PUSHDPH ;保存DPH PUSHDPL ;保存DPL

MOVDPTR,#TAB1 MOVC A,@A+DPTR POPDPL ;恢复DPL POPDPH ;恢复DPH RETTAB1:

DB 00H,01H,04H,09H,10H;平方表

DB 19H,24H,31H,40H,51H2023/2/530【例4-4】有一巡回检测报警装置,需对16路(x)输入进行检测,每路有一个最大允许值(y),为双字节数。需根据测量的路数(x),查表找出对应该路的最大允许值(y),看输入值是否大于最大允许值,如果大于就报警。取路数为x(0≤x≤15),y为最大允许值,放在表格中。设进入查表程序前,假设路数x已放于R2中,查表后该路的最大允许值y放于R3R4中。查表的程序如下:理解:根据路数x,查最大允许值y。2023/2/531

TB3:

MOVA,R2 ADD A,R2 ;(R2)*2→(A) MOVR3,A ;保存指针

ADD A,#6 ;加偏移量

MOVCA,@A+PC ;查第一字节

XCH A,R3 ADD A,#3

MOVCA,@A+PC ;查第二字节

MOV R4,A RETTAB3:

DW 1520,3721,42645,7580;最大值表 DW 3483,32657,883,9943 DW 10000,40511,6758,8931 DW 4468,5871,13284,278082023/2/532表格长度不能超过256B,且表格只能存放于“MOVCA,@A+PC”指令以下的256个单元中,如需把表格放在程序存储器空间的任何地方,应使用指令“MOVCA,@A+DPTR”。【例4-5】

以AT89S51为核心的温度控制器,温度传感器输出的电压与温度为非线性关系,传感器输出的电压已由A/D转换为10位二进制数。测得的不同温度下的电压值数据构成一个表,表中温度值为y(双字节无符号数),x(双字节无符号数)为电压值数据。设测得电压值x放入R2R3中,根据电压值x,查找对应的温度值y,仍放入R2R3中。参考程序:理解:根据电压值x,查温度值y。2023/2/533

LTB2:MOV DPTR,#TAB2 MOV A,R3 CLR C RLC A MOV R3,A XCH A,R2 RLC A XCH R2,A ADD A,DPL;(R2R3)+(DPTR)→(DPTR) MOV DPL,A MOV A,DPH ADDCA,R2 MOV DPH,A CLR A2023/2/534

MOVCA,@A+DPTR;查第一字节 MOV R2,A;第一字节存入R2中 CLR A INC DPTR MOVCA,@A+DPTR;查第二字节 MOV R3,A ;第二字节存入R3中 RETTAB2:

DW …,…,…

;温度值表由于使用了指令“MOVCA,@A+DPTR”,表TAB2可放入64KB程序存储器空间任何位置,表格的长度可大于256B。2023/2/5354.3.4查找关键字在表中查找关键字的操作,也称为数据检索。【例4-6】

从50个字节的表中查找一个关键字“xxH”。ORG 1000HMOV 30H,#xxH

;关键字xxH送30H单元MOV R1,#50 ;查找次数送R1MOV A,#14 ;修正值送AMOVDPTR,#TAB4 ;表首地址送DPTR2023/2/536LOOP: PUSHAcc MOVCA,@A+PC ;查表结果送A CJNEA,40H,LOOP1;(40H)不等于关键字则转LOOP1 MOVR2,DPH ;查到关键字,把地址送R2,R3 MOVR3,DPL DONE:

RETLOOP1:POP Acc ;修正值弹出 INC A ;A+1→A INC DPTR ;修改数据指针DPTR DJNZR1,LOOP ;R1≠0,未查完,继续查找 MOV R2,#00H ;R1=0,R2和R3清0 MOV R3,#00H ;表中50个数已查完 AJMP DONE ;从子程序返回

TAB4: DB …,…,…

;50个数据表2023/2/5374.3.5查找最值

【例4-7】片内RAM中存放一批数据,查找出最大值并存放于首地址中。设R0中存放首地址,R2中存放字节数。程序如下: MOVR2,n ;n为要比较的数据字节数 MOVA,R0 ;存首地址指针 MOVR1,A DECR2 MOVA,@R12023/2/538LOOP: MOV R3,

A DEC R1 CLR C SUBBA,@R1;两个数比较 JNC LOOP1;C=0,A中数大,跳LOOP1 MOVA,@R1;C=1,则大数送A SJMPLOOP2LOOP1:MOVA,R3LOOP2:DJNZR2,

LOOP ;是否比较结束? MOV @R0,

A ;存最大数

RET2023/2/539【例】将内部RAM的30H至3FH单元初始化为00H。MOV30H,#00H;MOV31H,#00H;…………MOV3EH,#00H;MOV3FH,#00H;2023/2/5404.3.6循环程序1.循环程序的结构:主要由以下四部分组成。(1)循环初始化完成循环前的准备工作。例如,设置循环控制计数初值、起始地址、变量初值等。(2)循环体完成实际的处理工作,反复执行循环体。(3)循环控制在重复执行循环体的过程中,不断修改循环控制变量,直到符合结束条件,就结束循环体的执行。循环结束的控制方法有计数控制法和条件控制法。(4)循环结束对循环程序执行的结果进行分析、处理和存放。2023/2/541(1)计数控制法

依据计数器的值来决定循环次数,一般为减1计数器,计数器减到“0”时,结束循环。计数器初值在初始化设定。MCS-51指令系统提供了功能极强的循环控制指令:DJNZRn,rel

;以工作寄存器作控制计数器DJNZdirect,rel

;以直接寻址单元作控制计数器

2023/2/542【例】将内部RAM的30H至3FH单元初始化为00H。MAIN:MOVR0,#30H;R0用作地址指针,置地址初值MOVR7,#16;计数值,16个单元MOVA,#00H;LOOP:MOV@R0,A;循环处理

INCR0;指向下一个单元DJNZR7,LOOP;循环

SJMP$;等待2023/2/543例:对RAM中22H开始的10个单元的数据求和,并将求和的结果放在21H单元中。CLRAMOVR7,#10;计数初值MOVR0,#22H;R0作为数据单元指针LOOP:ADDA,@R0INCR0DJNZR7,LOOPMOV21H,A2023/2/544(2)条件控制法

计数控制法只有在循环次数已知的情况下才适用。循环次数未知,不能用循环次数来控制,往往需要根据某种条件来判断是否应该结束循环。条件控制法:设置一个条件,判断是否满足该条件。如满足,则循环结束;如不满足该条件,则循环继续。

2023/2/545【例】将内部RAM起始地址为60H的数据串传送到外部RAM中起始地址为1000H的存储区域,直到发现‘$’字符停止传送。MAIN:MOVR0,#60H;置初值

MOVDPTR,#1000HLOOP0:MOVA,@R0;取数据CJNEA,#24H,LOOP1;循环结束?SJMPDONE;是LOOP1:MOVX@DPTR,A;把A的内容传到片外

INCR0;片内:指向下一个单元

INCDPTR;片外:指向下一个单元SJMPLOOP0;继续循环DONE:SJMPDONE;等待2023/2/546【例4-13】

一串字符,依次存放在内部RAM从30H单元开始的单元中,字符串以0AH为结束标志,测试字符串的长度。采用逐个字符依次与“0AH”比较(设置的条件)的方法。设置一个累计字符串长度的计数器和一个指向字符串的指针。如果字符与“0AH”不等,则长度计数器和字符串指针都加1;如果比较相等,则表示该字符为“0AH”,字符串结束,计数器值就是字符串的长度。程序如下:2023/2/547

MOV R4,#0FFH ;长度计数器初值送R4 MOVR1,#2FH ;字符串指针初值送R1NEXT:

INC R4 INC R1 CJNE@R1,#0AH,NEXT;比较,不等则进行下一;字符比较 END上面两例都是在一个循环程序中不再包含其他循环程序,则称该循环程序为单重循环。如果一个循环程序中包含了其他循环程序,则称为多重循环。常见的多重循环是由DJNZ指令构成的软件延时程序,是常用程序之一。2023/2/548【例4-14】

50ms的延时程序。

在使用12MHz晶振时,一个机器周期为1µs,执行一条DJNZ指令的时间为2µs。可用多重循环的方法的延时50ms程序:

DEL:MOVR7,#200 ;本指令执行时间1µs

DEL1:MOVR6,#125 ;本指令执行时间1µ

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论