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

下载本文档

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

文档简介

1、第5章 汇编语言程序设计教学目的:教学目的:熟悉80C51系列单片机的汇编语言,能够熟练编写汇编语言源程序。教学重点:教学重点:常用汇编语言程序设计方法。教学难点:教学难点: 分支程序、散转程序与子程序的设计 5. 1 概述概述5.1.1 程序设计语言 1. 机器语言 2. 汇编语言3. 高级语言图51 源程序、汇编程序、目的程序之间关系示意图 5.1.2 5.1.2 汇编语言规范汇编语言规范1. 1. 汇编语句格式汇编语句格式 标号:标号:指令助记符指令助记符 操作数操作数;注释;注释 不同仿真器提供的汇编环境对标号有不同的要求。不同仿真器提供的汇编环境对标号有不同的要求。一般均应符合如下要

2、求:一般均应符合如下要求:n指令助记符、寄存器名、伪指令记忆符等不能作标号;指令助记符、寄存器名、伪指令记忆符等不能作标号;n同一标号在一个独立程序中只能定义一次;同一标号在一个独立程序中只能定义一次;n标号由标号由1-81-8个个ASCIIASCII字符组成,第一个字符必须是字母。字符组成,第一个字符必须是字母。2. 80C512. 80C51汇编程序设计中常用的伪指令汇编程序设计中常用的伪指令(1 1)ORG ORG 汇编起始指令汇编起始指令 规定目标程序的起始地址,格式如下:规定目标程序的起始地址,格式如下: 标号标号 操作码操作码 操作数操作数 ORG ORG 表达式(表达式(expe

3、xp)(2 2) EQU EQU 赋值指令赋值指令把操作数段中的地址或数据赋值给标号,格式如下:把操作数段中的地址或数据赋值给标号,格式如下: 标号标号 操作码操作码 操作数操作数 字符名称字符名称 EQU EQU 数或汇编符号数或汇编符号 例例1 AA 1 AA EQU R1 EQU R1 ;R1R1与与AAAA等值等值 则则 MOV AMOV A,AA AA 指令与指令与 MOV AMOV A,R1R1指令结果相同。指令结果相同。(3) DB定义字节指令 定义程序存储器中存放的8位常数表,格式如下: 操作码 操作数 DB 字节常数或ASCII字符 例 ORG 1000H DB 76H,73

4、,C,B ;括号 表示ASCII字符 DB OACH (1000H)76H (1001H)49H(1002H)43H(1003H)42H(1004H)0ACH(4) DW 定义字指令 定义程序存储器中存放的16位常数表格式 DW 例3 ORG 2200H DW 1246H,7BH,10 则 (2200H)12H (2201H)46H (2202H)00 (2203H)7BH (2204H)00 (2205H)0AH(5) BIT 定义位地址指令 格式 BIT 例4 ABC BIT P1.0 Q4 BIT P2.2 则汇编后,位地址P1.0,P1.2分别赋给变量ABC和Q4。(6 6) END

5、END 汇编结束指令汇编结束指令 5 52 2 顺序与循环程序设计顺序与循环程序设计5.2.1 顺序程序设计 例1:将20H单元的两个BCD码拆开并变成ASCII码,存入21H、22H单元。注意ASCII码09为30H39H。 解:采用先把20H中低4位BCD码交换出来加以转换、存放,然后再把高4位BCD码交换至低4位加以转换、存放。 地址 机器码 周期数 源程序 ORG 0000H 0000H 02 02 00 3 LJMP MAIN MAIN: 200H 78 22 1 MOV R0,22H ;(R0)=22202H 76 00 1 MOV R0,0H ;(22)=0204H E5 20

6、1 MOV A,20H ;(A)=20206H D6 1 XCHD A, R0 ;A与(22)低 四位交换207H 43 22 30 2 ORL 22H,#30H 20AH C4 1 SWAP A20BH 44 30 1 ORL A,30H20DH F5 21 1 MOV 21H,A20FH 80 FE 2 SJMP $ END 5.2.2 循环程序设计 例3 已知:80C51单片机使用的晶振为6MHz,要求设计一个软件延时程序,延时时间为10ms。 解:延时程序的延时时间主要与两个因素有关,一个是所用晶振,一个是延时程序中的循环次数。一旦晶振确定之后,则主要是如何设计与计算需给定的延时循环次

7、数。在本题中已知晶振为6MHz,则可知一个机器周期为2s,可预计采用单重循环是有可能实现1ms的延时的。现根据题意编写源程序如下:周期数 1 MOV R0,0AH ;毫秒数R0 1 DL2:MOV R1,MT ;1ms延时的预 定值MTR1 1 DL1:NOP 1 NOP 2 DJNZ R1,DL1 ;lms延时循环 2 DJNZ R0,DL2 ;毫秒数减1,不等 于0,继续循环,等于0结束例4 从22H单元开始有一个无符号数据块,其长度在20H单元。求出数据块中最大值,并存入21H单元 ORG 200H CLR A ;清A作为初始最大值 MOV R2,20H ;数据个数初值 MOV R1,2

8、2H ;数据块首地址初值LP:CLR C ;清进位 SUBB A,R1 ;最大值减队列中数 JNC NEXT ;小于最大值继续 MOV A, R1 ;大于最大值,则用此值代换 SJMP NEXT1NEXT:ADD A,R1 ;小于最大值,则恢复NEXT1:INC R1 ;修改地址指针 DJNZ R2,LP ;依次重复比较,直至R20 MOV 21H ,A ;最大值存入21H单元5 53 3 分支程序设计分支程序设计5.3.1 分支程序设计综述分支程序应用要点是正确使用转移指令,通常有如下3种指令。 1. 无条件转移 2. 条件转移 3. 散转 例3 设5AH单元中有一变量X,请编写计算下述函数

9、式的程序,结果存入5BH单元Y= 3X , X 10Y= 2X +10 , 10= X 155.3.2 5.3.2 无条件无条件/ /条件转移程序条件转移程序 ORG 200H MOV A,5AH ADD A,5AH ;2XA MOV R1,A MOV A,5AH ;重新把X装入A CJNE A,#10,L1 ;与10比较,不同转L1L1:JC L2 ;X15 CJNE A,#10H,L3 ;与16比L3:JNC L4 ;X15转L4 MOV A,R1 ;2X送入A ADD A,#10 ;10X15,Y2X10 MOV R0,A SJMP L4L2: MOV A,R1 ADD A,5AH ;X

10、10,Y=3X MOV R0,AL4 : MOV 5BH,R0 ;存结果 SJMP $ END5.3.3 散转程序设计 例2 根据R3的内容,转向各个操作程序。 R30, 转入OPR0 R31, 转入OPR1. R3n, 转入OPRn 解:程序清单如下。 MOV DPTR,TAB1 ;跳转表首地址送数据指针 MOV A,R3 ;R32 A(修正变址值) ADD A,R3 JNC NOAD ;判有否进位 INC DPH ;有进位则加到高字节地址NOAD: JMP ADPTR ;转向形成的散转地址入口TAB1: AJMP OPR0 ;转移到OPR0 AJMP OPR1. AJMP OPRn5 54

11、 4 查表程序设计查表程序设计5.4.1 查表程序综述 为了实现查表功能,在80C51汇编语言中专门设置了两条查表指令:MOVC A,A+DPTRMOVC A,A+PC 这2条指令特点不同,在应用时要注意区别。为了便于查表,要求表中的数或符号按照便于查找的次序排列,并将它存放在从指定的首地址(或称基地址)开始的存储单元。 例1 设计一个将16进制数转换成ASCII码的子程序,设16进制数存放在R0的低4位,要求将转换后的ASCII码送回R0。ORG 30HMOV A,R0ANL A,0FH ; 保留低4位ADD A,2 ;变址调整MOVC A,APC;查表获取ASCII码值MOV R0,ARE

12、TTAB:DB 30H,31H,32H,33H,34H,35HDB 36H,37H,38H,39H,41H,42H,43H,44H,45H,46H 55 子程序设计 5.5.1 5.5.1 子程序结构与设计注意事项子程序结构与设计注意事项 一种能完成某一特定任务的程序段一种能完成某一特定任务的程序段。其资源要为所有调用程序共。其资源要为所有调用程序共享。因此,子程序在结构上应具有独立性和通用性,享。因此,子程序在结构上应具有独立性和通用性,在编写子程在编写子程序时应注意以下问题:序时应注意以下问题: 1 1子程序的第一条指令的地址称为子程序的入口地址。该指令前子程序的第一条指令的地址称为子程序

13、的入口地址。该指令前必必须有标号须有标号。 2 2主程序调用子程序两条子程序调用指令:主程序调用子程序两条子程序调用指令: (1 1)绝对调用指令:)绝对调用指令:ACALL addr11ACALL addr11 (2 2)长调用指令:)长调用指令:LCALL addr16LCALL addr163 3注意设置堆栈指针和现场保护注意设置堆栈指针和现场保护4 4最后一条指令必须是最后一条指令必须是RETRET指令指令5 5子程序可以嵌套,即子程序可以调用子程序子程序可以嵌套,即子程序可以调用子程序6 6在子程序调用时,还要注意参数传递的问题在子程序调用时,还要注意参数传递的问题 二、二、 子程序

14、的基本结构子程序的基本结构 MAINMAIN: ;MAINMAIN为主程序或调用程序标号为主程序或调用程序标号 LCALL SUB LCALL SUB ;调用子程序;调用子程序SUBSUB SUBSUB:PUSH PSWPUSH PSW;现场保护;现场保护 PUSH ACCPUSH ACC; 子程序处理程序段子程序处理程序段 POP ACCPOP ACC;现场恢复;现场恢复 POP PSWPOP PSW; RETRET;最后一条指令必须为;最后一条指令必须为RETRET 5.5.2 子程序设计 例1 用程序实现c a2b2。设a、b均小于10。a存在31H单元中,b存在32H单元,把c存入33

15、H单元。 解:因本题二次用到平方值,所以在程序中采用把求平方的程序段编为子程序的方法。依题意编写主程序和子程序如下: 地址 机器码 源程序 ORG 200H 200 75 81 3F MOV SP,3FH ;设堆栈指针 203 E5 31 MOV A,31H ;取a值 205 12 04 00 LCALL SQR ;求a2 208 F9 MOV R1,A ;a2值暂存R1 209 E5 32 MOV A,32H ;取b值 20B 12 04 00 LCALL SQR ;求b2 20E 29 ADD A,R1 ;求a2b2 20F F5 33 MOV 33H,A ;存入33H ; 子程序子程序

16、地址地址 机器码机器码 源程序源程序 ORG 400H 400 04 SQR: INC A 401 83 MOVC A,APC 402 22 RET 403 1 4 9 16 TAB: DB 0403 1 4 9 16 TAB: DB 0,1 1, 4 4, 9 9,16 16 408 25 36 49 DB 25408 25 36 49 DB 25,3636,494940B 64,81 DB 6440B 64,81 DB 64,81815.6 5.6 综合编程举例综合编程举例 例1 将R0所指出单元中的ASCII码转换成十六进制数,并把结果仍存于原单元中。 解:对于小于、等于 9的数,ASCII代码减去30H得一位十六进制数,对于大于9的ASCII代码减去37H,则恰好是“0AH0FH”的结果。 编程如下: HEX: MOV A,R0 ;取操作数 CLR C SUBB A,#30H ;09的转换 MOV R0,A ;暂存结果 SUBB A,#0AH ;结果是否大于9 JC SB2 ;小于、等于9,则返回 XCH A,R0 SUBB A,#07H ;大于9,则减37H MOV R0,A ;存结果 SB2: RET 例2

温馨提示

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

评论

0/150

提交评论