2007-10-17第3章M C S -51单片机指令系统和汇编语言程序实例林耀荣目的介绍M C S -51的指令系统和汇编语言编程,了解处理器的软件资源重点掌握寻址方式指令分类内容3.1 M C S -51单片机指令系统概述3.2 寻址方式3.3 数据传送类指令3.4 算术运算类指令3.5 逻辑运算及移位指令3.6 控制转移类指令3.7 子程序调用与返回指令3.8 位操作类指令3.9 汇编程序格式与伪指令3.10 汇编程序设计示例53.1 M C S -51单片机指令系统概述指令(I n s t r u c t i o n )指令是使处理器内部执行的一种操作,提供给用户编程使用的一种命令指令系统(I n s t r u c t i o n S e t )处理器能够执行的全部操作所对应的指令集合从用户使用角度,提供给用户使用计算机功能的软件资源决定C P U 性能程序(P r o g r a m )按一定要求组合起来的指令序列就构成程序 电子发烧友 电子技术论坛63.1.1 指令、指令系统的概念使用指令-编程-从指令系统中挑选指令子集掌握指令的功能掌握指令的使用格式了解指令的工作原理-加深对硬件组成原理的理解指令的属性功能:指令对应的特定的操作功能时间:指令执行所用的时间(机器周期)-执行时间空间:程序存储器中占用的字节数-转移指令的偏移量计算查表 电子发烧友 电子技术论坛指令的描述形式机器语言以二进制代码来描述指令功能的语言计算机只能识别二进制代码不便被人们识别、记忆、理解和使用由计算机的硬件特性决定汇编语言给每条机器语言指令赋予助记符号来表示的语言便于人们识别、记忆、理解和使用的一种指令形式和机器语言指令一一对应,由计算机的硬件特性决定汇编:汇编语言-> 机器语言高级语言汇编把汇编语言翻译成机器语言汇编的两种方式机器汇编手工汇编3.1.2 M C S -51指令系统及其指令格式111条指令功能数据传送算术操作逻辑操作程序转移位操作1指令长度单字节指令(49条)双字节指令(46条)三字节指令(16条)指令周期单机器周期指令(64条)双机器周期指令(45条)4机器周期指令(2条):乘、除法11指令组成操作码:执行何种操作操作数:参加操作的数或者操作数所在地址无操作数单操作数双操作数汇编语言指令格式[标号:] 操作码助记符[目的操作数][,源操作数] [;注释]F u n 1:M O V A , R 1;A <-R 1必须 电子发烧友 电子技术论坛12符号R i 和R n :表示当前工作寄存器区中的工作寄存器,i 取0或1,表示R 0或R 1。
n 取0~7,表示R 0~R 7#d a t a :表示包含在指令中的8位立即数#d a t a 16:表示包含在指令中的16位立即数r e l :以补码形式表示的8位相对偏移量,范围为-128~127,主要用在相对寻址的指令中a d d r 16和a d d r 11:分别表示16位直接地址和11位直接地址 电子发烧友 电子技术论坛1符号d i re c t :表示直接寻址的地址b i t :表示可位寻址的直接位地址(X ):表示X 单元中的内容((X )):表示以X 单元的内容为地址的存储器单元内容,即(X )作地址,该地址单元的内容用((X ))表示/ 和→符号:“/”表示对该位操作数取反,但不影响该位的原值。
“→”表示操作流程,将箭尾一方的内容送入箭头所指另一方的单元中去13.2 寻址方式寻址方式执行指令时找到所要求的操作数的方式操作数总是存放在某一存储单元,寻找操作数所在的存储单元地址七种寻址方式1立即寻址寄存器寻址R 0~R 7A ,B ,D P T R ,A B直接寻址内部R A M 的低128字节S F R寄存器间接寻址内部R A M (@R 0,@R 1)外部数据存储器(@R 0,@R 1,@D P T R )基址寄存器加变址寄存器间接寻址程序存储器(@A +D P T R ,@A +P C )相对寻址:相对转移指令位寻址C ,可寻址位13.2.1 立即寻址操作数直接出现在指令中,与操作码一起存放在程序存储器中以“#”符号作前缀格式:#d a t a#d a t a 16M O V A ,#40HM O V D P T R ,#2100H立即寻址示意图立即寻址示意图M O V D P T R ,# 2100H操作码P CP C P C 立即数的高8位立即数的低8位D P H D P L P C21H 00H90H 21H R O M 00H ××3.2.2 寄存器寻址指令选定的寄存器作为操作数M O V A ,R 0寄存器寻址示意图23.2.3 寄存器间接寻址由指令指出某一寄存器的内容作为操作数地址的寻址方法寄存器起地址指针的作用可用作寄存器间接寻址的寄存器@R 0,@R 1,@D P T RR 0,R 1作为地址指针可寻址片内R A M 的256个单元访问片外R A M 的低256个地址单元D P T R 作为地址指针访问片外R A M 的64K B 范围2寄存器间接寻址示意图M O V A , @R 123.2.3 直接寻址指令中直接给出操作数的存储器地址M O V A ,40H直接寻址可访问片内R A M 的低128个单元(00H ~7F H )不能访问片内R A M 的高128个单元(80H ~F F H )可以访问特殊功能寄存器S F R访问S F R 的唯一方法访问S F R 可在指令中直接使用寄存器名字访问程序存储器的转移、调用指令中直接给出程序存储器的地址2直接寻址示意图23.2.5 变址寻址基址寄存器加变址寄存器间接寻址基址寄存器加变址寄存器的和作为程序存储器地址,寻址该单元基址寄存器:D P T R 或P C变址寄存器:A常用于访问程序存储器中的常数表M O V C A , @A +D P T RM O V C A , @A +P C2变址寻址示意图M O V C A ,@A +D P T R例:操作码P CP CD P T R 1234HAA 4H93H R O M ……3F12D 8H设(A )= A 4H (D P T R )= 1234H3 F A L UP S E N “读”M O V C A ,@A +D P T R273.2.6 相对寻址以当前程序计数器P C 值加上指令中给出的偏移量r e l ,而构成实际操作数地址的寻址方法用于访问程序存储器,常出现在相对转移指令中当前P C 值是指相对转移指令的存储地址加上该指令的字节数偏移量r e l 是有符号的单字节数,以补码表示,其值的范围是-128~+127(00H ~F F H )J Z r e l ,双字节指令,若该指令的存储地址为2050H ,则执行该指令时的当前P C 值即为2052H目的地址=当前P C 值+r e l = 指令存储地址+指令字节数+r e l 电子发烧友 电子技术论坛23.2.7 位寻址位寻址是在位操作指令中直接给出位操作数的地址位地址空间可以对片内R A M 中的128位和特殊功能寄存器S F R 中的93位进行寻址M O V C , 40H址寻位3.3 数据传送类指令35类指令助记符片内传送M O V片外传送M O V X查表M O V C数据交换X C H 、X C H D 、S W A P堆栈操作P U S H 、P O P33.3.1 访问片内数据存储器的一般数据传送指令实现数的传送 格式:M O V <目的操作数>,<源操作数>;目的操作数单元←源操作数(或单元)3图3.3 访问片内R A M 的一般传送指令操作关系图34例1 设内部R A M (30H )=40H ,(40H )=10H ,(10H )=00H ,(P 1)=C A H ,分析以下程序执行后各单元及寄存器、P 2口的内容。
M O V R 0,#30H;(R 0)←30HM O V A ,@R 0;(A )←((R 0))M O V R 1,A;(R 1)←(A )M O V B ,@R 1;(B )←((R 1))M O V @R 1,P 1;((R 1))←(P 1)M O V P 2,P 1;(P 2)←(P 1)M O V 10H ,#20H;(10H )←20H执行上述指令后的结果为:(R 0)=30H ,(R 1)=(A )=40H ,(B )=10H ,(40H )=(P 1)=(P 2)=C A H ,(10H )=20H 。
电子发烧友 电子技术论坛353.3.2 片内特殊传送指令堆栈操作指令进栈P U S H出栈P O P用途:保存或恢复现场双字节指令(S P )←(S P )-1 修改指针,指向新栈顶(d i r e c t )←(S P ) 把栈顶的数据弹出到直接寻址单元中去P U S H d i r e c t ;P O P d i r e c t ;((S P ))←(d i r e c t ) 把直接寻址单元的内容压入S P 所指单元内(S P )←(S P )+ 1 修改指针,使其指向栈顶上的一个存数单元 电子发烧友 电子技术论坛36S PS P例:堆栈操作设(A )= 5A H ,(B )= 3F H’建立堆栈’压入操作’弹出操作60H61H62H63H64H5A H3F H S P M O V S P , #60HP U S H A P U S H BP O P AS P 结果:A 的内容3F H ,S P 的内容为61HA 3F H 电子发烧友 电子技术论坛37例2 若在外部程序存储器中2000H 单元开始依次存放0~9的平方值,数据指针(D P T R )=3A 00H ,用查表指令取得2003H 单元的数据后,要求保持D P T R 中的内容不变。
完成上述功能的程序如下:M O V A ,#03H;(A )←03HP U S H D P H;保护D P T R 高8位入栈P U S H D P L;保护D P T R 低8位入栈M O V D P T R ,#2000H;(D P T R )←2000HM O V C A ,@A +D P T R;(A )←(2000H +03H )P O P D P L;弹出D P T R 低8位P O P D P H;弹出D P T R 高8位执行结果:(A )=09H ,(D P T R )=3A 00H 。
电子发烧友 电子技术论坛2 数据交换指令数据双向传送字节交换指令X C H A , d i r e c tX C H A , @R iX C H A , R n半字节交换指令X C H D A ,@R iS W A P A4⑴累加器A 内容与寄存器内容交换X C H A ,R n (n =0~7)C 8H ~C F H机器码;(A )(R n )单字节指令⑵累加器A 内容与内R A M 或S F R 内容交换X C H A ,d i r e c t (n =0~7);(A ) (d i r e c t )双字节指令C 5H 直接地址机器码 电子发烧友 电子技术论坛4⑶累加器A 内容与内R A M 内容交换X C H A ,@R i (i =0,1);(A )((R i )) 单字节指令C 6H ~C 7H机器码⑷累加器A 低4位内容与内R A M 内容低4位交换X C H D A ,@R i (i =0,1);(A 3~0)((R i )3~0) 单字节指令D 6H ~D 7H机器码A(R i )4⑸累加器A 高4位与低4位交换S W A P A;(A 3~0)(A 7~4) 单字节指令C 4H机器码A43数据交换指令小结指令助记符说明字节12111X C H A ,R nX C H A ,d i r e c t 寄存器内容与累加器内容交换直接地址内容与累加器内容交换X C H A ,@R iX C H D A ,@R i 内R A M 内容与累加器内容交换内R A M 内容低4位与累加器低4位交换S W A P A累加器A 高4位与低4位交换 电子发烧友 电子技术论坛43.3.3 片外数据存储器数据传送指令对片外扩展的数据存储器R A M 或I /O 进行数据传送 寄存器间接寻址,通过累加器A 完成 A <-> @R i , @D P T R 指令助记符操作功能注释机器码(H )M O V X A ,@D P T R ;(A )←((D P T R )) E 6M O V X A ,@R i ;(A )←((R i )) E 2、E 3M O V X @D P T R ,A ;((D P T R ))←(A ) F 0M O V X @R i ,A ;((R i ))←(A ) F 2、F 343.3.4 访问程序存储器的数据传送指令查表指令把程序存储器中存放的表格数据读出,传送到累加器A基址寄存器加变址寄存器间接寻址方式 单字节指令指令助记符操作功能注释机器码(H )M O V C A ,@A +D P T R ;(A )←((A )+(D P T R )) 93M O V C A ,@A +P C ;(P C )←(P C )+1,(A )←((A )+(P C )) 83 M O V C A ,@A +P C 指令的偏移量偏移量= 表首地址-(M O V C 指令所在地址+1)46M O V D P T R ,#2000H M O V C A ,@A +D P T R2004H2003H2002H2001H2000H2008H2009H2005H2006H2007H存储器00H 01H 04H 09H 10H 19H 24H 31H 40H 51H例:在外部R O M 中存放0~9的平方值。