《电子第7章汇编语言.ppt》由会员分享,可在线阅读,更多相关《电子第7章汇编语言.ppt(33页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第7章 汇编语言程序设计教教学学目目的的:熟悉80C51系列单片机的汇编语言,能够熟练编写汇编语言源程序。教学重点:教学重点:常用汇编语言程序设计方法。教学难点:教学难点:分支程序、散转程序与子程序的设计 7.1 概述7.1.1 汇编语言源程序的格式 1.汇编语句格式标号:操作码 操作数 ;注释这4部份只有操作码段是必须具有的,其余部分为可选项,但对于包含操作数的指令,则操作数段也是必须具有的。l例如:lSU:MOVA,0CDH;CDHA7.1.2 汇编语言伪指令 l(1)ORG 汇编起始指令 l规定目标程序的起始地址,格式如下:标号 操作码 操作数l ORG 表达式(exp)l(2)EQU
2、赋值指令l把操作数段中的地址或数据赋值给标号,格式如下:l标号 操作码 操作数l字符名称 EQU 数或汇编符号 l例1 AA EQU R1 ;R1与AA等值l 则 MOV A,AA 指令与 MOV A,R1指令结果相同。(3 3)DB DB定义字节指令定义字节指令 定义程序存储器中存放的定义程序存储器中存放的8 8位常数表,位常数表,格式如下:格式如下:l (标号)操作码 操作数l DB 字节常数或ASCII字符l 例2 ORG 1000H DB 76H,73,C,B;在表示ASCII字 符时要用 括号 l DB OACHl 则 (1000H)76H (1001H)49H (1002H)43H
3、 (1003H)42H (1004H)0ACHl (4 4)DW DW 定义字指令定义字指令 定义程序存储器中存放的定义程序存储器中存放的1616位常数表位常数表格式格式 DW16 DW。l例3 ORG 2200Hl DW 1246H,7BH,10l 则 (2200H)12H (2201H)46Hl (2202H)00 (2203H)7BHl (2204H)00 (2205H)0AHl(5)BIT 定义位地址指令 l 格式 BITl 例4 ABC BIT P1.0l Q4 BIT P2.2l 则汇编后,位地址P1.0,P1.2分别赋给变量ABC和Q4。l(6)END 汇编结束指令l7DATA定
4、义标号数值伪指令l它的功能是给标号段中的数据地址标号赋以数值,也称为数据地址赋值指令。它的格式如下:l字符名称DATA表达式l例6M5DATA1A00Hl汇编后M5的值为1A00H。l8DS定义存储空间指令l它的功能是从指定地址开始,定义一个存储区,保留由表达式指定的若干字节空间作为备用空间,这个存储区预留的存储单元数由DS表达式的值决定。l它的格式如下:DS表达式l表达式通常是一个常数。l例7ORG500HlDS10HlDB4BH,5AH 72 顺序与循环程序设计 l7.2.1 顺序程序设计l 例1将R5中的两个BCD码拆开并变成ASCII码,存入61H、62H单元。l解:在此采用把BCD数
5、除以10H的方法,除后相当于把此数右移了4位,刚好把两个BCD码分别移到A、B的低4位。由于ASCII码的09为30H39H。然后再各自与30H相或即变为ASCII码。l源程序如下:lORG0000HlLJMPMAINlORG30H;主程序起始地址lMAIN:MOVA,R5lMOVB,10H;用10H作除数lDIVABlORLB,30H;低4位BCD码变为ASCII码lMOV62H,BlORLA,30H;高4位BCD码变为ASCII码lMOV61H,AlSJMP$;循环等待lEND7.2.2 循环程序设计l 1.循环初态(或称初始条件)l 循环初态是设置循环过程中工作单元的初始值。l 2.循环
6、体l 重复执行的程序段部分。l 3.循环控制部分。l 用于控制循环的执行和结束。l例2 已知:80C51单片机使用的晶振为12MHz,要求设计一个软件延时程序,延时时间为20ms。l 解:延时程序的延时时间主要与两个因素有关,一个是所用晶振,一个是延时程序中的循环次数。一旦晶振确定之后,则主要是如何设计与计算需给定的延时循环次数。在本题中已知晶振为12MHz,则可知一个机器周期为1s,可预计采用单重循环是有可能实现1ms的延时的。现根据题意编写源程序如下:l周期数 1 MOV R0,14H ;毫秒数R0l 1 DL2:MOV R1,MT;1ms延时的预定值MTR1l 1 DL1:NOPl 1
7、NOPl 2 DJNZ R1,DL1;lms延时循环l 2 DJNZ R0,DL2;毫秒数减1,不等于0,继续循环,等于0结束例例3 3 从从22H22H单元开始有一个无符号数据块,其长单元开始有一个无符号数据块,其长度在度在20H20H单元。求出数据块中最大值,并存入单元。求出数据块中最大值,并存入21H21H单元单元lORG 200HlCLR A ;清A作为初始最大值lMOV R2,20H ;数据个数初值lMOV R1,22H ;数据块首地址初值lLP:CLR C ;清进位lSUBB A,R1 ;最大值减队列中数lJNC NEXT ;小于最大值继续lSJMP NEXT1lSUBB A,R1
8、 ;最大值减队列中数lJNC NEXT ;小于最大值继续lSJMP NEXT1lMOV A,R1 ;大于最大值,则用此值代换lNEXT:ADD A,R1;小于最大值,则恢复lNEXT1:INC R1 ;修改地址指针lDJNZ R2,LP ;依次重复比较,直至R20 lMOV 21H,A ;最大值存入21H单元73 分支程序设计l7.3.1 分支程序设计综述l分支程序应用要点是正确使用转移指令,通常有如下3种指令。l1.无条件转移 l2.条件转移 l3.散转 例例1 1 设设5AH5AH单元中有一变量单元中有一变量X X,请编写计算下,请编写计算下述函数式的程序,结果存入述函数式的程序,结果存入
9、5BH5BH单元单元l7.3.2 无条件/条件转移程序 lMOVA,5AHlMOV B,AlMUL AB;X2BAlMOV R1,AlMOV A,5AH;重新把X装入AlCJNEA,#5,L1lLl:JCL2;X10lCJNEA,#11,L3;与11比lL3:JNC L4;X 10转L4lMOV A,R1l ADDA,#08;10X5,Y=X2+8lMOVR0,AlSJMPL4lL2:MOVA,R1lCLR ClSUBBA,#01;X10,Y=X21lMOVR0,AlL4:MOV5BH,R0lSJMP7.3.3 散转程序设计 l散转程序的设计可采用下面两种方法:l(1)数据指针DPTR固定,根
10、据累加器A的内容,程序转入相应的分支程序中去。l(2)累加器A清零,根据数据指针DPTR的值,决定程序转向的目的地址,DPTR的值可用查表或其他方法获得。l下面介绍两种不同方法的散转程序。l1采用转移指令表l例1设有n个分支程序,n小于256,将n存放在R4中,设计散转程序。l解:程序清单如下。lMOVDPTR,TAB1;跳转表首地址送数据指针lMOVA,R4lADDA,R4;R42A(修正变址值)lJNCNOAD;判有否进位lINCDPH;有进位则加到高字节地址lNOAD:JMPADPTR;转向形成的散转地址入口lTAB1:AJMPOPR0;转移到分支程序OPR0lAJMPOPR1l.lAJ
11、MPOPRn2 2采用转向地址表采用转向地址表l例7.13根据R2的内容转入各对应的分支程序中去。l解设转移入口地址为OPR0、OPR1、OPRn,散转程序及转移表如下:lMOV DPTR,#TAB1lMOV A,R2lADD A,R2;(R2)2AlJNC NADDlINCDPH;(R2)2的进位加至DPHlNADD:MOV R3,A;暂存lMOVCA,A+DPTR;取地址高8位lXCH A,R3;转移地址高8位暂存到R3lINCAlMOVCA,A+DPTR;取地址低8位lMOV DPL,A;置转移地址低8位lMOV DPH,R3;置转移地址高8位lCLR AlJMP A+DPTR;转向分支
12、程序lTAB1:DWOPR0;16位转移地址表的首地址lDWOPR1lDWOPRn74 子程序设计 l7.4.1 子程序结构与设计注意事项 l子程序结构l编写子程序时的注意事项l在编写子程序时要注意以下几点:l(1)要给每个子程序赋一个名字,实际上是一个入口地址的代号。l(2)要能正确地传递参数。即首先要有入口条件,说明进入子程序时,它所要处理的数据如何得到。另外,要有出口条件,即处理的结果是如何存放的。l(3)注意保护现场和恢复现场。7.4.2 7.4.2 子程序的调用与返回子程序的调用与返回l主程序调用子程序是通过子程序调用指令LCALLaddl6和ACALLadd11实现的。子程序的返回
13、是通过返回指令RET实现的。l主程序在调用子程序时要注意以下问题:l(l)在需要保护现场的程序中,在主程序初始化时要正确地设置堆栈指针。l(2)在主程序中,要安排相应指令,满足子程序的入口条件。l(3)在主程序中,安排相应的指令,在子程序返回后,处理子程序提供的出口参数。7.4.3 子程序设计举例 l例1有两个ASCII码值表示的字符串,2个字符串的首地址分别为50H和70H,每个字符串的第一个字节都存放字符串长度。求出这2个字符串中字符A的个数,并将其和存入4FH单元。l解:本例采用分别求出两个字符串字符A的个数,然后求和的方法,求字符A个数的过程可采用子程序。子程序的入口条件是字符串首地址
14、,返回参数即为个数值,放在A中。l下面分别列出主程序和子程序:主程序 MOV R1,50H ;置入口条件参数 ACALL ZF ;调求字符A个数子程序 MOV 40H,R0 ;第一个数据块的A个数暂存40H MOV R1,70H ;置入口条件参数 ACALL ZF ;调求字符A个数子程序 MOV A,,R0 ADD A,40H ;两个字符A个数相加 MOV 4FH,A ;把和送入4FH SJMP l子程序;子程序入口参数:R1为字符串首地址l;子程序出口参数:R0为字符串中A的个数lZF:MOVR0,#0;清R0作为初始值lMOVA,R1;取字符个数初值lMOVR2,A;字符个数初值送R2lL
15、P:MOVA,R1;取字符lCJNEA,#41H,LP1;与字符A比较lINCR0;等于加1后继续lLP1:INCR1;修改地址指针lDJNZR2,LP;依次重复比较,直至R20lRET;返回例例2 2 编制一个循环闪烁灯的程序。有编制一个循环闪烁灯的程序。有8 8个发光个发光二极管,每次其中一个灯闪烁点亮二极管,每次其中一个灯闪烁点亮1010次后,转移次后,转移到下一个灯闪烁点亮到下一个灯闪烁点亮1010次,循环不止。次,循环不止。lMOVSP,#3FH;设堆栈指针lMOVA,#01;初值lSHIFT:LCALLFLASH;调闪亮10次子程序lRRA;右移lSJMPSHIFT;循环lFLAS
16、H:MOVR2,#0AH;闪烁次数送R2(第0组)lFLASH1:MOVPl,A;点亮lLCALLDELAY;延时lMOVP1,#00H;熄灭lLCALLDELAY;延时lDJNZR2,FLASH1;循环lRETlDELAY:PUSH02H;保存R2(第0组R2地址为2)lMOVR2,#0F0H;赋延时初值,可以按延时要求选择lLP:DJNZR2,LPlPOP 02H;恢复第0组R2lRET7 75 5 查表程序设计查表程序设计l7.5.1 查表程序综述 l为了实现查表功能,在80C51汇编语言中专门设置了两条查表指令:lMOVC A,A+DPTRlMOVC A,A+PC l这2条指令特点不同
17、,在应用时要注意区别。l为了便于查表,要求表中的数或符号按照便于查找的次序排列,并将它存放在从指定的首地址(或称基地址)开始的存储单元。7.5.2 查表程序设计举例查表程序设计举例ll例例1 1 设计一个将设计一个将1616进制数转换成进制数转换成ASCIIASCII码的子程码的子程序,设序,设1616进制数存放在进制数存放在R0R0的低的低4 4位,要求将转换位,要求将转换后的后的ASCIIASCII码送回码送回R0R0。lORG 60HlMOV A,R0lANL A,0FH;保留低4位lADD A,2 ;变址调整lMOVC A,APC;查表获取ASCII码值lMOV R0,AlRETlTA
18、B:DB 30H,31H,32H,33H,34H,35HlDB 36H,37H,38H,39H,41H,42H,43H,44H,45H,46Hl例2某仪器的键盘程序中,根据命令的键值(0,1,2,9)转换成相应的双字节16位程序入口地址,其键值与对应入口地址关系如下:l键值0123 89l入口地址009801860234031608180929l解设键值存放在40H单元中,出口地址值存放在42H、43H单元中。l按题意编写子程序如下:lORG 200HlMOV DPTR,#TAB;表格的首地址送DPTRMOV A,40H;取键值lRLA;键值乘2作查表偏移量lMOV 40H,A;暂存偏移量 lMOVCA,A+DPTR;取高8位地址lMOV 42H,A;暂存高8位地址lINCDPTR;指向表首地址低8位lMOV A,40H;取偏移量lMOV 43H,A;暂存低8位地址lRETlTAB:DB00,98H;“0”键入口地址lDB01,86H;“1”键入口地址lDB02,34H;“2”键入口地址l.lDB08,18H;“8”键入口地址lDB09,29H;“9”键入口地址l