第8讲单片机指令系统_第1页
第8讲单片机指令系统_第2页
第8讲单片机指令系统_第3页
第8讲单片机指令系统_第4页
第8讲单片机指令系统_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

汽车单片机第8讲(2010-09-27)10-11第1学期第5周11.指令系统简介;2.寻址方式;3.指令系统;4.汇编语言程序设计;5.程序设计实例;第3章MCS-51指令系统及汇编语言2复习

控制转移指令1、无条件转移指令;LJMP,STMP,AJMP,JMP,功能相同,只是转移范围不同。2、条件转移指令;JZrel;若(A)=0,转移。JNZrel;若(A)≠0,转移。CJNEA,direct,rel;

DJNZRn,rel

31)位传送指令;MOVC2)位置位1、复位0指令;SETB,CLR3)位逻辑指令;ANL,ORL,CPL非4)位条件转移指令;JC,JNC,JB,JNB,JBC复习位控制转移类指令43.4汇编语言程序设计1.伪指令;2.汇编的功能定义;3.汇编程序设计步骤;5单片机指令有两种基本类型:指令语句和伪指令语句(1)指令语句已在前面介绍。每一条指令语句在汇编时都产生一个指令代码——机器代码。(2)伪指令语句

是为汇编服务的。如指定目标程序或数据存放的地址、给一些指定的标号赋值、表示源程序结束等指令,并不产生目标程序(机器码),也不影响程序的执行,仅仅产生供汇编用的某些命令,用来对汇编过程进行某种控制或操作,这类指令称为伪指令。

3.4.1伪指令61.定义起始地址伪指令格式:ORGaddr16功能:规定程序块或数据块存放的起始地址。addr16表示一个16位的程序存储器的空间地址,一般为一个确定的地址,也可以是事先定义的标号。例如:

ORG 2000HSTART:MOV A,30H…规定标号START代表地址为2000H开始。在一个源程序中,可多次使用ORG指令,来规定不同的程序段的起始地址。但是,地址必须由小到大排列,地址不能交叉、重叠。ORG2000H┇ORG2500H ┇ ORG3000H

3.4.1伪指令72.定义汇编结束伪指令格式:END功能:表示汇编结束.用于终止源程序的汇编工作。在整个源程序中只能有一条END命令,且位于程序的最后。3.标号赋值伪指令格式:标号EQU[表达式]功能:将表达式的值赋给本语句中的标号。又称为等值指令。用于给标号赋值。赋值以后,其标号值在整个程序有效。例如:TESTEQU2000H

表示标号TEST=2000H,在汇编时,凡是遇到标号TEST时,均以2000H来代替。

8说明:1)赋值后的字符即可做为地址使用,也可

以做为立即数使用;2)一经使用EQU赋值,整个程序有效;3)所赋值可是8位(字节)或16位(字);4)该伪指令一般放在程序的开始段;例如程序段:

ORG8000H AA EQU10H

;AA=10H ABC EQUAA+10H;ABC=20H MOV A,ABC;A←20HBS: ADDA,#AA;A←(A)+10H

说明:程序中,AA、ABC是字符名称,BS是标号。94.定义字节伪指令(8位)格式:标号: DB[字节表]功能:从标号指定的地址单元开始,在程序存储器的连续单元中定义字节数据。10进制数自然转换成16进制数,字母按ASCII码存储。

ORG2000HDB30H,40H,24,“C”,“B”汇编后: (2000H)=30H

(2001H)=40H

(2002H)=18H(10进制数24) (2003H)=43H(字符“C”的ASCII码) (2004H)=42H(字符“B”的ASCII码)105.定义字伪指令(16位)格式:标号: DW[字表]功能:从标号指定的地址单元开始,在程序存储器的连续单元中定义16位的数据字。例如:

ORG2000H DW1246H,7BH,10汇编后:(2000H)=12H ;第1个字(2001H)=46H(2002H)=00H ;第2个字(2003H)=7BH(2004H)=00H ;第3个字(2005H)=0AH(2005H)=0AH116.预留存储区伪指令格式:标号: DS表达式功能:从标号指定的地址单元开始,定义一个存储区,以备源程序存储数据使用。存储区内预留的存储单元数由表达式的值决定。例如:

ORG 3030HTIMER: DS 10H┇从3030H单元开始保留10个存储单元,下一条指令从3040H开始汇编。注意:MCS-51系列单片机,DB、DW、DS伪指令只能用于程序存贮器ROM,不能对数据存贮器RAM使用。12

格式:<字符名称>BIT<位地址>功能:把位地址赋给指定的字符名称。例:

A1BITP1.0A2BIT20H

说明:赋值命令和位定义命令仅为方便编程和阅读理解程序使用,使用时,字符名称或位名称一般取有意义且便于记忆的字母数字。7.位定义伪指令133.4.2汇编功能定义用汇编语言编写的源程序汇编程序目标程序将源程序翻译成目标代码(机器语言)用户编写机器语言,可执行的代码汇编过程:将源程序翻译成机器语言的目标代码,此代码按照伪指令的安排存入ROM中;执行过程:CPU从ROM中逐条读取目标代码并逐条执行;141.分析问题——针对现有条件,明确在程序设计时应该“做什么”2.确定算法——解决“怎样做”的问题3.绘制程序流程图——用图形的方法描绘解决问题的思路4.分配内存单元——确定程序和数据区的起始地址5.编写源程序——用指令的形式将程序流程图实现出来6.汇编——用开发机或仿真器将源程序转换成机器码,便于单片机识别7.在线仿真调试——查错、改错,对程序进行优化。3.4.3

汇编语言程序的设计步骤15MCS-51单片机的应用程序的完成,应经过三个步骤;(1)在微计算机上,运行编辑程序进行源程序的输入和编辑;(2)对源程序进行交叉汇编得到机器代码;(3)通过微计算机的串行口(或并行口)把机器代码传送到用户样机(或在线仿真器)进行程序的调试和运行。第(1)步,只需在微计算机上使用通用的编辑软件即可完成。第(2)步的交叉汇编所用的汇编程序可在购买单片机的仿真开发工具时,由厂商提供。第(3)步骤的实现要借助于单片机仿真开发工具进行。16汇编语言编程方法P75经验总结

尽量采用模块化程序设计方法;

这种设计方法是把一个完整的程序分成若干个功能相对独立的、较小的程序模块,对各个程序模块分别进行设计、编制程序和调试,最后把各个调试好的程序模块装配起来进行联调,最终成为一个有实用价值的程序。尽量采用循环结构和子程序结构;

采用循环结构和子程序结构,可以使程序的总容量减小,提高程序的效率,节省内存。17尽量少用无条件转移指令

少用无条件转移指令,可以保证程序的条理更加清晰,从而减少错误发生。充分利用累加器;

累加器是主程序和子程序之间信息传递的桥梁,利用累加器传递入口参数或返回参数比较方便。一般不要把累加器内容压入堆栈。18对于通用子程序要保护现场;

由于子程序的通用性,除了保护子程序入口参数的寄存器内容外,还要对子程序中用到的其它寄存器内容一并入栈保护。

对于中断处理,还要保护程序状态字

在中断处理程序中,既要保护处理程序中用到的寄存器内容,还要保护程序状态字PSW。否则,当中断服务程序执行结束返回主程序时,整个程序的执行可能会被打乱。19源程序的编制202122233.5汇编程序设计实例24常采用以下几种基本结构:顺序结构、分支结构和循环结构,再加上广泛使用的子程序和中断服务子程序。

1.顺序结构

2.分支结构程序中含有转移指令,无条件分支,有条件分支。有条件分支又分为:单分支结构和多分支结构。

3.循环结构

4.子程序

5.中断服务子程序253.5.1顺序程序例

已知X、Y、Z分别为片内RAM30H、31H、32H单元的内容,设X>Y,试编程完成下式的算术运算:S=(X-Y)*Z,并将计算结果S存入片内RAM34H(高字节)、35H(低字节)单元中。由于X>Y,所以X-Y>0,不需要借位;(X-Y)*Z的结果最多占用两个字节。实现该要求的程序流程图如图所示。26程序清单如下:

ORG 0030HSTART:MOV A,30H ;(A)←X SUBB A,31H ;(A)←(A)-X MOV B,32H ;(B)←Z MUL AB MOV 34H,B ;(34H)←A*B的高字节

MOV 35H,A ;(35H)←A*B的低字节

SJMP $27例

在内部RAM单元的30H和31H中各有一无符号数,试比较其大小,大数存入40H单元,小数存入41H单元,若相等则存入42H单元。程序流程框图如图所示。3.5.2分支程序28程序如下:MOVA,30HCJNEA,31H,K1;比较不相等MOV42H,AAJMP WAITK1:JNC K2;若Cy=0,(30H)>(31H),转K2MOV 41H,AMOV 40H,31HAJMP WAITK2:MOV 40H,AMOV 41H,31HWAIT:AJMP $293.5.3循环程序①置循环初值。用来设置变量、计数器数据指针的初值等,为循环作准备。②循环体。指要求重复执行的程序段,通过它完成对数据进行实际处理的任务。③修改控制变量。一般用一个工作寄存器Rn作为对循环次数的计数,每循环一次计数器减1,即修改循环控制变量。④循环控制部分。控制循环次数,当循环一定的次数后,满足循环结束条件时,停止循环。30例2在内部RAM30H开始的连续单元中,存放着20个无符号数,编写一段程序,使这20个数按照由大到小的顺序依次排列。

MOV R0,#30H MOV R7,#19 ;设置外循环计数器OUTSIDE: MOV R6,00H ;设置内循环计数器

PUSH 00H ;0组R0进栈

MOV A,@R0 ;取内循环的第一个数INSIDE: INC R0 ;修改内循环间址指针

MOV B,@R0 CJNE A,B,$+3 ;比较A与@R0的大小

JNC NEXTCH ;大于等于不交换

XCH A,R0 ;小于交换NEXTCH: DJNZ R6,INSIDE ;判内循环是否结束

POP 00H ;内循环结束,R0出栈

MOV @R0,A ;存内循环的最大值

INC R0 ;修改外循环指针

DJNZ R7,OUTSIDE ;判外循环是否结束

SJMP $同类例题3-4431升序排,降序排。仅介绍无符号数据升序排。冒泡法:相邻数互换排序方法,类似水中气泡上浮。时从前向后进

温馨提示

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

评论

0/150

提交评论