《单片机原理及系统设计实用教程》课件51单片机(宏汇编)指令集5_第1页
《单片机原理及系统设计实用教程》课件51单片机(宏汇编)指令集5_第2页
《单片机原理及系统设计实用教程》课件51单片机(宏汇编)指令集5_第3页
《单片机原理及系统设计实用教程》课件51单片机(宏汇编)指令集5_第4页
《单片机原理及系统设计实用教程》课件51单片机(宏汇编)指令集5_第5页
已阅读5页,还剩44页未读, 继续免费阅读

下载本文档

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

文档简介

单片机原理及应用551单片机宏汇编和程序结构51单片机的汇编语言(宏汇编)只有指令助记符还不能编写出好程序,需要增添一些“伪指令”。伪指令用于控制汇编软件如何处理和按什么规则编译程序。伪指令不会产生“机器码”不同的汇编器(仿真器、仿真软件)具有一些不同的“伪指令”规定。下面将介绍一些常用的伪指令ASM51汇编语言格式Label:标号,冒号结尾,表示程序入口。字母开头,通常少于8个字符。指令助记符:也可以是伪指令,后面如果有操作数的话必须有“空格”或“TAB-键”将其与操作数分开【label:】指令助记符【操作数1】【,操作数2】【,操作数3】【注释】ASM51汇编语言格式操作数1:既是操作对象又是操作结果如果存在操作数2、3时,需要在前面用逗号隔开注释:前面用分号开头(半角字符),后面可以用中文注释【】表示不一定存在,不是必须的ASM51汇编保留字和特殊符号保留字常指:指令;寄存器名;伪指令,以及运算符号如:+-×/等,这些字符串不能用于作为标号、变量等,运算符不能用于标号、变量当中。运算符可以用于操作数中,起到运算作用。例如:MOVMEM+3,A,意义为:将A的内容送到MEM之后的第三个存储单元。

符号“$”在转移指令中当作label使用时,表示转到$符号所在行的前面,例如:SJMP$表示在本行作“死循环”。等效于:ABC:SJMPABC判断下列标号和变量定义是否正确

LAB+3:MOVA,30HLABUSB:MOVA,30HSUBB:MOVA,30HLAB:MOVA,MEN+3R7:MOVA,30HMOVR7,A+3SJMP$常量及其表示

常量,就是在汇编时已经确定的值。在汇编语言中,常量主要用作指令性语句中的直接操作数,也可用于存储器操作的组成部分(如位移量,或者为伪指令中的变量输初值。)常量有多种表示形式:二、十、十六进制数和字符串等

常量及其表示数据形式格式取值范围示例备注

2进制********B0,110110011B0进制******0,1,2...93276816进制****H0,1...E,F0CDE3H最前面一个字符应是0--9ASCII'**'ASCII'AD'只有DB命令中使用常量及其表示常量以数值形式直接写在汇编语言的语句中称为字面常量。若预先为它定义一个符号名,然后在语句中用符号名来表示该常量称符号常量。使用符号常量的优点可改善程序的可读性,它的定义需要使用伪操作命令“EQU”或“=”。数值运算

汇编语言对常量允许进行算术运算,逻辑运算,分离运算等三种类型的运算。运算操作含义以ADD为例

+加操作ADDA,#RR1+36-减操作ADDA,#RR1-2EH*乘操作ADDA,#RR1*0E3H/除操作ADDA,#RR1/23MOD模除ADDA,#RR1MOD12

数值运算操作含义以ADD为例

SHR右移ADDA,#RR1SHR3SHL左移ADDA,#RR1SHL2AND与操作ADDA,#RR1AND10000101BOR或操作ADDA,#RR1OR00110000B数值运算操作含义以ADD为例XOR异或操作ADDA,#RR1XOR36HNOT非操作ADDA,#NOT45HHIGH高字节分离ADDA,#HIGH05E2HLOW低字节分离ADDA,#LOW77F0H

ASM51汇编器通用伪指令汇编起始命令ORG16位地址(常数或表达式)

定义程序/数据的起始地址ORG

$+5

ORG

0008H

汇编结束命令END汇编到此结束,其后面的内容将被忽略。同时也是程序结束的标志。ASM51汇编伪指令ORG举例ORG0000HAJMPMAINNOPORG0003HLJMPINT0SAV ;跳转到INT0服务程序ORG000BHLJMPT0SAV ;跳转到T0服务程序ORG0030HMAIN:主程序ASM51汇编伪指令ORG举例意义:主程序从地址0000开始,实际又跳转到0030H开始的主程序。INT0发生中断时,程序从0003H开始执行,并跳转到INT0SAV程序执行。T0发生溢出中断时,从000BH开始执行。这几个地址值是51单片机规定的固定地址,在“中断系统”中再详细讨论赋值命令EQU赋值命令。定义变量地址或者常数名称。格式:字符名称EQU(数或汇编符号)赋值后的符号名称可做:数据地址\代码地址\代码地址\立即数\寄存器名例如:ABCEQU30H

ABCEQUR7不能重名定义赋值命令DATA数据地址赋值命令格式:字符名称DATA表达式注意:表达式可求值(数据)

可以后定义先使用ABCDATA30HABCDATA30+20不能重名定义下面定义是否正确?ABCEQU30H

ABCEQUR7ABCEQU3023H

ABCEQUDPTRABCDATA30HABCDATA30+20ABCDATAR7ABCDATASP+20

位变量地址定义BIT定义位变量地址,用法与EQU相同。有时可以用EQU代替。格式:字符名称BIT位地址例如:firebitp1.0

或者:fireequp1.0ASM51汇编伪指令EQU/BITTEMPEQU30H ;定义变量TEMP地址为30HT_MODEQU40H ;定义定时器模式控制字常量=40HEQU之前的字符串可以理解为变量名,也可以理解为常量名,只要应用时前面加上“#”就是常量了!例如:MOVTEMP,#TEMP这条指令使30H地址内存入30H常数ASM51汇编伪指令EQU/BITSFLAGBITP1.0 ;定义SFLAG变量为P1.0引脚SIGN EQU00H ;定义SIGN变量为位地址00HMOVC,SIGN有些编译器可以用EQU完全代替BIT来定义“位”ASM51汇编伪指令DB/DWDB定义8位数据段(表格类常数)格式:DB项或表项或表:字节/字节串/字符串ASM51汇编伪指令DB/DWORG2000HTAB1: DB0C0H,0F9H,0A4H,0B0H,099H DB‘ABC’(2000H)=C0H(2001H)=F9H(2002H)=A4H(2003H)=B0H(2004H)=99H(2005H)=41H(2006H)=42H(2007H)=43HASM51汇编伪指令DB/DWDW定义16位数据段(表格类常数)格式:DW16位项或表16位项或表:字节/字节串/字符串ASM51汇编伪指令DB/DWORG2000HTAB2: DW0C0F9H,0A4B0H,10H,8AH DW……(2000H)=C0H(2001H)=F9H(2002H)=A4H(2003H)=B0H(2004H)=00H(2005H)=10H(2006H)=00H(2007H)=8AHDS预留空间命令DS预留一个数据段(单片机中不常用,因为只能在程序段中定义,而程序ROM是不能修改的)格式:DS表达式例ORG1000HDS08HDB30H,8AH(1008H)=30H(1009H)=8AH注意,定义的都是程序寄存器汇编语言程序的一般结构程序的一般结构按照下面顺序组成:用EQU/BIT定义变量、常量、端口用ORG指令和LJMP/AJMP定义中断向量表主程序:初始化堆栈、内存、端口、中断系统、允许中断,然后进入一个扫描循环体。汇编语言程序的一般结构4独立模块区:子程序、中断服务程序等程序模块区。5用END作为程序结束。常见线性程序的结构主程序入口初始化允许中断循环体中断程序1中断程序n中断返回中断返回其他子程序、中断服务等循环体常为显示和键盘管理中断过程往往发生在循环体的某两条指令之间,不可预测。一般程序的一般结构(局部)程序的局部可以设计成如下结构之一顺序结构循环结构分支结构子程序调用结构:模块化结构顺序结构按顺序一条条执行的程序.也称为直线程序例如:已知RED;GRE和YEL为连续3个存储单元,将其依次右移1位MOVA,YELMOVC,ACC.0

MOVA,REDRRCAMOVRED,AMOVA,GRERRCAMOVGRE,AMOVA,YELRRCAMOVYEL,AREDGREYEL循环结构需要重复执行的程序,结构一般包括:设置循环初值循环体修改控制变量修改控制

MOVA,YEL MOVC,ACC.0

MOVR0,#RED MOVR7,#3;循环3次LOOP: MOVA,@R0 RRCA MOV@R0,A INCR0 DJNZR7,LOOP

RET分支结构“分支”通常都是有条件的按“功能号”分支,就是“散转”按条件分支,可以是标志位,可以是运算结果,相当于“如果满足条件就……否则就……”查表举例指令MOVA,@A+DPTR和

MOVA,@A+PCSERCH1: MOVA,BUFF MOVDPTR,#TAB1 MOVCA,@A+DPTR LJMPDISPLAY ……TAB1:TAB1: DB0C0H,0F9H,DB0A4H,0B0H,DB099H,092H,082HDB,0F8H,080H,090H表格中依次定义了从“0~9”的共阳LED数码管显示“7段码”

使用MOVCA,@A+PC时

注意“地址调整参数”当前PC值到数据表之间,间隔多少字节,就是的“地址调整参数”。这个参数必须加到A中再查表。这个参数需要认真计算,没有公式可用。方法就是:计算查表指令之后的每条指令的字节数,直到数据表之前,把这些字节数加在一起就是需要的“地址调整参数”。SERCH2: MOVA,BUFF

ADDA,#03H;**** MOVCA,@A+PC

LJMPDISPLAYTAB1:DB0C0H,0F9H,DB0A4H,0B0H,DB099H,092H,082HDB,0F8H,080H,090H上例中:LJMPDISPLAY是3字节,因此前面有:ADDA,#03H

子程序能被其他程序调用,在实现某种功能后能自动返回到调用程序去的程序。其最后一条指令一定是返回指令,故能保证重新返回到调用它的程序中去。也可调用其他子程序,甚至可自身调用(如递归)。

MAINLOOP:LCALLKEYSCANGCJNEA,#80H,KEYPROLCALLDISPLAYAJMPMAINLOOPKEYPRO: CJNEA,#0FH,KEY_NOF

LCALLF_PROC AJMPMAINLOOPKEY_NOF: CJNEA,#0EH,KEYNE

LCALLE_PROC AJMPMAINLOOP …… AJMPMAINLOOP软件陷阱:所谓软件陷阱,就是一条引导指令,强行将乱飞的程序引向一个指定的地址,在那里有一段专门对程序出错进行处理的程序。如果我们把这段程序的入口标号称为ERR的话,软件陷阱即为一条LJMPERR指令。为加强其捕捉效果,一般还在它前面加2条NOP指令。或其它如02H(LJMP#02H),这样利用外部中断0入口,实现软件陷阱

NOP

NOP

LJMPERR习题9.有两个16位无符号数分别存放在内部RAM的40H、41H和50H、51H(低位数在低地址单元),请写出:(1)两个16位数的加法程序,和存于R3、R1中。(R3中存放高位数)(2)两个16位数的减法程序,差存于R5、R7中。(R5中存放高位数)10.编写程序,将内部RAM40H、50H单元的两个8位无符号数相乘,结果存放在R7、R3中(R7中存放高位数)。11.编写程序,将累加器A的低4位数送到P1口的低4位,保持P1口高4位不变。12.基本程序结构有哪几种?循环程序有哪几种基本结构?13.从内部RAMTAB单元开始存有30个不带符号的数据,要求找出其中的最大数存入R0中。14.在内部RAM40H单元开始的区域内存有10个单字节十进制数(压缩型BCD码),试求其累加和,并将结果存放在内部RAM20H~23H单元中。15.已知从外部ROM1000H开始存放有40个字节的无符号数,试编制程序,将该数据块搬移到从1060H开始的存储区域内。16.把累加器A中的二进制数变换成3位BCD码,并将百、十个位数分别存放在内部RAM单元的50H、51H、52H单元中。17.设内部RAM40H单元存放有8位无符号的被除数,42H单元存

温馨提示

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

评论

0/150

提交评论