51单片机指令系统和汇编语言程序设计.ppt_第1页
51单片机指令系统和汇编语言程序设计.ppt_第2页
51单片机指令系统和汇编语言程序设计.ppt_第3页
51单片机指令系统和汇编语言程序设计.ppt_第4页
51单片机指令系统和汇编语言程序设计.ppt_第5页
已阅读5页,还剩81页未读 继续免费阅读

下载本文档

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

文档简介

第3章 51单片机 汇编指令系统和汇编语言程序设计,指令、汇编语言、寻址等概念 51单片机指令集 数据传送指令 算术运算 逻辑运算 控制转移 位运算 汇编语言程序模块设计 顺序、条件分支、循环程序、子程序,3.1 汇编指令和汇编语言,机器指令:微型计算机和单片机真正能够执行的指令都是二进制数的机器指令。每一种或者每一系列的单片机(mcu family)都有自己专有的机器指令集(instruction set),且各不相同,不具有可移植性。 汇编指令(assembly instruction):采用英文单词助记符和机器指令一一对应起来,即是汇编指令。例如add a,b inc a 汇编指令是人们相对容易掌握的最底层指令。每种汇编指令集都是专适用于某种cpu的。,汇编指令和汇编语言最大的问题是不具有跨cpu的可移植性,更换了不同的cpu系列就必须全部更换程序代码,代价大周期长。但是汇编语言也具有速度最快,效率最高,保密性最好的有点,在大企业、高技术设备的开发上还广泛应用。 单片机c语言开发:是指在基础ansi c语言基础上添加了适用于单片机内存管理和特殊功能寄存器等的定义。利用c语言开发的单片机程序具有易于理解,容易移植,容易实现复杂的运算和控制功能,因此目前大多数单片机都有对应的c语言开发环境。但是首先学习并理解汇编语言程序思路仍然是进行c语言开发前的必备基础。,mcs-51指令系统的特点,1、执行速度快,存储效率高,mcs-51指令系统共有111条指令,按字节分,单字节指令49条,双字节指令45条,三字节指令17条,按周期分,单周期指令64条,双周期指令45条,四周期指令2条,设时钟频率为12mhz,则指令执行的时间分别为:,1s 58,2s 40,4s 2,占居空间,占居时间,51单片机寻址方式(7种), 立即寻址, 直接寻址, 寄存器寻址, 寄存器间接寻址, 基址寄存器加变址寄存器间接寻址, 相对寻址, 位寻址,3.2 寻址方式,寻址方式:汇编指令中提供(寻找)操作数的方式称为寻址方式。,(1)立即寻址 举例: add a,#28h 其中#28h就一个立即数,表示28h是一个常数,存在程序存储器里。,(2)直接寻址 举例: mov a,30h mov a,sbuf 指在汇编指令中直接给出被访问单元的地址。直接寻址的范围只能是片内00h7fh内存单元和特殊功能寄存器区。特殊功能寄存器的名字本质上就是直接内存地址。,(3)寄存器寻址 举例: mov a,r3 r0,r1,r2.r7 指被访问的单元是通用寄存器r0r7。,(4)寄存器间接寻址 举例: mov a,r0 此时r0是一个内存地址指针变量,被访问的单元是r0所指向的地址单元。例如r0=30h,则上例实际上访问的是片内ram的30h单元。而r0本身是指针变量,可以指向一片连续的地址单元,可用于连续循环赋值等。,(5)基址寄存器加变址寄存器寻址 举例: movc a,a+dptr 此时dptr是一个地址指针,指向一个程序存储器中常数数组的首地址,称为基址(base address),a中存储的是该数组中对应元素的下标(变址),a+dptr则表示把该下标对应的数组元素读取出来。,(6)相对寻址 举例: sjmp main 此时main是一个语句标号,代表的是一条指令所在地址,该指令地址和sjmp main这条语句的地址范围差值在-128+127之内,即一个字节有符号数范围。用于程序跳转中的短跳转语句。,(7)位寻址 举例: mov c,20h 位指令具有鲜明的特征,其操作单元都是位单元。最典型的例子是一个操作数是cy位,此时20h指的就是片内20h2fh内的位寻址区20h位了。这个叫做位寻址。, 数据传送(29条), 算术运算(24条), 逻辑运算(24条), 控制转移(17条), 布尔处理(17条),51单片机的汇编指令集,介绍描述指令符号的意义,当前选中寄存器区的8个工作寄存器(r0r7),rn,ri,direct,- 8位内部ram单元地址 00h7fh, 专用特殊功能寄存器sfr的地址80hffh, 立即数(8位),#data,#data16, 立即数(16位),n=07,i=0、1,addr16, 16位目的地址,用于lcall、ljmp指令 地址范围64kb rom空间,addr11, 11位目的地址,用于acall、ajmp指令 地址范围2kb rom空间,rel,dptr, 数据地址指针,可做16位间址寄存器,bit, 内ram或sfr中的直接位寻址,a, 累加器,b, 专用寄存器,用于mul和div指令,c, 位累加器 ( psw.7 ),进位/借位标志, 间址或基址寄存器前缀如 ri , a+dptr,/, 位操作的前缀,表示对该位操作数取反,(x), x中的内容,((x)), 由x寻址的单元中的内容,箭头左边的内容被箭头右边的内容所代替,dptr , a+pc,寻址方式与相应的寻址空间,利用的变量,使用的空间,方 式,一、数据传送类(29条),用到的指令助记符有5种:,片内传送 mov (mov指令只能访问片内ram),片外传送 movx (movx指令只能访问片外ram),查表传送 movc (movc只能访问程序存储器),累加器交换 xch、xchd、swap 堆栈操作 push、pop 这两类指令只能操作片内ram,1、mov类传送指令,格式: mov 目的字节,源字节,功能:把源字节内容送目的字节,源字节内容不变,以累加器a为目的字节的传送:, 立即数送累加器,mov a,#data,;立即数#data送累加器a, 寄存器内容送累加器,mov a,rn (n=07), 内ram或sfr内容送累加器,mov a,direct,;rn的内容送累加器a,;以direct为地址的单元的内容送累加器a, 内ram内容送累加器,mov a,ri (i=0、1),;以ri内容为地址单元中的数送累加器a, 立即数送寄存器,mov rn,#data (n=07),;立即数#data送累加器 rn,* 16位立即数传送指令,mov dptr,#data16,;16位立即数送dptr中,设置地址指针。,mov指令不一一详述,请参见指令集表自行理解,mov类传送指令小结,mov 片内传送指令,mov类传送指令小结,mov 片内传送指令,2、movx类传送指令,累加器a与外部ram传送数据用 movx, 外部ram送累加器a,movx a,ri (i=0、1),单字节指令,机器码相应为e2h、e3h,;以ri内容为外部ram地址的单元中的数送a, 累加器内容送外ram,movx ri ,a (i=0、1),;累加器内容送以ri内容为地址的外部ram单元,单字节指令, 外部ram送累加器a,movx a,dptr,单字节指令,机器码相应为e0h,;以dptr内容为地址的外部ram单元中的数送a, 累加器内容送外ram,movx dptr ,a,;累加器内容送以dptr内容为地址的外部ram单元,单字节指令,机器码相应为f0h,movx类传送指令小结,movx 片外传送指令,movx只能对片外扩展的数据存储器ram进行读写操作,且指令只有以上4条,切忌不要创造“指令”,准确把握何为“片内”,何为“片外”。,例:将片外ram 120h单元的内容传送到片外ram 地址为78h的单元。,mov dptr,#0120h,movx a,dptr,mov r0,#78h,movx r0,a,;外部ram送累加器a,;累加器内容送外ram,3、movc类传送指令,movc类传送指令,均为基址加变址寄存器寻址:,movc a,a+dptr, 以dptr作基址加变址寻址,长查表指令,16位,例:在外部rom中存放09的平方值。根据累加器 a中的数( 09 ),查找对应的平方值。,用dptr作基址寄存器 指向表格的首地址 用a作变址寄存器 实际上a中的值是表格中的 第几项,4、 xch、xchd、swap类传送指令, 寄存器内容与累加器内容交换,xch a,rn (n=07), 内ram或sfr内容与累加器内容交换,xch a,direct (n=07), 内ram内容与累加器内容交换,xch a,ri (i=0,1), 内ram内容低4位与累加器低4位内容交换,xchd a,ri (i=0,1), 累加器a高4位与低4位交换,swap a,交换类传送指令小结,5、 堆栈操作指令, 进栈指令,push direct,;direct地址单元的内容压入sp指向的单元,双字节指令, 出栈指令,pop direct,;sp指向的单元内容弹出到以direct为地址的单元,双字节指令,例:堆栈操作 设(a)= 55h,(b)= 3fh,建立堆栈,压入操作,弹出操作,55h,3fh,mov sp, #60h,push a,push b,pop psw,结果:psw的内容3fh,sp的内容为61h,psw,3fh,关于数据传送类指令的总结和注意,movx指令是唯一的对片外ram和i/o接口芯片的读写访问指令。 movc指令是对程序存储器rom的读访问,按地址读,没有片内外的概念。 其余全部传送类指令都是对片内ram和sfr区的访问,务必搞清楚,不要出错。 除了mov dptr,#xxxxh一条指令外,其余任何赋值指令的赋值都不能超过1字节容量,即范围只能是00hffh。 有赋值错误者(此为低级错误)会加重扣分 数据传送类指令大量应用,务必熟练运用,二、算术运算类(24条),用到的指令助记符有8种:,加法指令 add、addc、inc、da,减法指令 subb,dec,乘除指令 mul,div,算术运算类指令执行结果影响标志位:cy、ac、ov,1、不带进位加add, 累加器内容加立即数,add a,#data,双字节指令, 累加器内容加寄存器内容,add a,rn(n=07),单字节指令, 累加器内容加内ram内容,add a,ri(i=0,1),单字节指令, 累加器内容加内ram内容或sfr,add a,direct,双字节指令,add类指令小结,2、带进位加addc, 累加器内容加立即数 加进位位,addc a,#data,双字节指令, 累加器内容加寄存器内容加进位位,addc a,rn(n=07),单字节指令, 累加器内容加内ram内容加进位位,addc a,ri(i=0,1),单字节指令, 累加器内容加内ram内容或sfr加进位位,addc a,direct,双字节指令,addc类指令小结,两个单字节数相加,只需用到add指令,此时进位保存在cy位里。若要完成多字节数相加,则从第2个字节开始,必须要使用addc指令,因为此时必须要考虑进低位对高字节的进位情况了。 例如 8635h + 13dch,3、增量inc, 累加器内容加 “1”,inc a, 寄存器内容加 “1”,inc rn, 内ram或sfr内容加 “1”,inc direct, 内ram内容加 “1”,inc ri, 数据指针dptr内容加 “1”,inc dptr,4、十进制调整指令,da a,;对累加器a,作bcd码加法后进行“过9补6”调整,注意:da 指令不能对bcd码减法的结果进行调整,单字节指令,a b c d e f,01 2 3 4 5 6 7 8 9,bcd,合法,例 设(a)=37h;(r3)=36h,执行下面的程序:,0 0 1 1 0 1 1 1 (37h),0 0 1 1 0 1 1 0 (36h),(6dh),0 1 1 0 1 1 0 1,过“9”,0 0 0 0 0 1 1 0,0 1 1 1 0 0 1 1,补“6”,(73h),;(a) = 6dh,;(a) = 73h,cy,1 1 0 1,add a,r3,da a,da a 只能跟在加法指令之后,5、减法指令subb, 累加器减立即数和借位标志,subb a,#data,双字节指令, 累加器减寄存器内容和借位标志,subb a,rn(n=07),单字节指令, 累加器减ram内容和借位标志,subb a,ri(i=0,1),单字节指令, 累加器内容减内ram内容或sfr和借位标志,subb a,direct,双字节指令,subb类指令小结,6、减量 dec, 累加器内容减“1”,dec a, 寄存器内容减“1,dec rn, 内ram或sfr内容减“1”,dec direct, 内ram内容减“1,dec ri,dec 类指令小结,7、mul,mul a b,div a b,8、div,cy= 0,三、逻辑运算类(24条),用到的指令助记符有9种:,包括与、或、异或、清除、求反、移位等操作,anl、orl、xrl、 clr、cpl、 rl、rlc、rr、rrc,1、逻辑与anl(6条), 累加器内容逻辑与立即数,anl a,#data, 累加器内容逻辑与寄存器内容,anl a,rn(n=07), 累加器内容逻辑与内ram内容,anl a,ri(i=0,1), 累加器内容逻辑与内ram内容或sfr,anl a,direct, 累加器内容逻辑与内ram或sfr,anl direct,a, 立即数逻辑与ram或sfr,anl direct,#data,2、逻辑或 orl(6条), 累加器内容逻辑或立即数,orl a,#data, 累加器内容逻辑或寄存器内容,orl a,rn(n=07), 累加器内容逻辑或内ram内容,orl a,ri(i=0,1), 累加器内容逻辑或内ram内容或sfr,orl a,direct, 累加器内容逻辑或内ram或sfr,orl direct,a, 立即数逻辑或ram或sfr,orl direct,#data,orl 类传送指令小结,3、逻辑异或xrl(6条), 累加器内容逻辑异或立即数,xrl a,#data, 累加器内容逻辑异或寄存器内容,xrl a,rn(n=07), 累加器内容逻辑异或内ram内容,xrl a,ri(i=0,1), 累加器内容逻辑异或内ram内容或sfr,xrl a,direct, 累加器内容逻辑异或内ram或sfr,xrl direct,a, 立即数逻辑异或ram或sfr,xrl direct,#data,xrl类传送指令小结,4 累加器清除与求反指令(2条), 累加器a清零,clr a, 累加器a按位取反,cpl a,4 移位指令(4条), 累加器内容循环左移一位,rl a, 累加器内容连同进位标志循环左移一位,rlc a,cy,例:a = 00000001 rl a a = 00000010,例:a = 00000001 , cy=1 rlc a a = 00000011 , cy=0, 累加器内容循环右移一位,rr a, 累加器内容连同进位标志循环右移一位,rrc a,cy,例:a = 00000010 rr a a = 00000001,例:a = 00000010 , cy=1 rrc a a = 10000001 , cy=0,移位指令小结,累加器清除与求反指令小结,四、控制转移指令(17条),控制转移指令共有17条:,无条件转移指令,条件转移指令,子程序的调用返回等,* 非常重要 *,1、无条件转移指令, 长转移,ljmp addr16, 绝对转移,ajmp addr11,转移范围 2kb,转移范围 64kb,例: loop: rl a inc r0 ljmp loop,*编程中 addr16通常都是用语句标号给出*,例: loop: rl a inc r0 ajmp loop, 短转移,sjmp rel,指令 sjmp $,原地踏步,程序挂起,例: loop: rl a inc r0 sjmp loop,sjmp 的跳转范围不能超出-128+127字节范围。如果超出范围汇编会报错。,2、条件转移指令, 累加器为零则转移到rel处,否则顺序向下执行,jz rel,jnz rel, 累加器不为零则转移到rel处,否则顺序向下执行, 累加器与立即数比较不相等则转移到rel,如果相等则顺序向下执行。,cjne a,#data,rel, 寄存器与立即数不等则转移 (同上),cjne rn,#data,rel, 累加器与内ram或sfr不等则转移,cjne a,direct,rel,三字节指令, 内ram与立即数不等则转移,cjne ri,#data,rel,三字节指令,顺序,转移,转移,顺序, 寄存器减“1”不等零则转移 注:rn值先减1后判断是否=0,如果不为零则转移到rel,若=0,则顺序向下执行。,djnz rn,rel (n=07),djnz direct, rel, 内ram或sfr减“1”不为零则转移,条件转移类指令小结,3、子程序调用及返回指令, 长调用,lcall addr16,;在调用子程序之前,保护断点地址,注释:addr16通常以语句标号给出。指令执行过程是pc先+3,指向下一条指令地址,然后把下一条指令的16位地址压入堆栈(保护断点地址),然后把addr16的地址赋给pc,即跳转到addr16开始执行。, 绝对调用,acall addr11,; 在调用子程序之前,保护断点地址,执行过程基本同上, 子程序返回,ret, 中断返回,reti,注释:ret是用户子程序的返回指令,执行过程就是把堆栈中保存的原断点地址重新赋给pc,转回到原断点地址执行程序。,注释: reti是中断服务子程序专门的返回指令,不可与ret混淆。执行过程除了把程序断点地址返回外,还要把

温馨提示

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

评论

0/150

提交评论