收藏 分享(赏)

第4章 80c51汇编语言程序设计.ppt

上传人:天天快乐 文档编号:1358627 上传时间:2018-07-02 格式:PPT 页数:105 大小:1.52MB
下载 相关 举报
第4章  80c51汇编语言程序设计.ppt_第1页
第1页 / 共105页
第4章  80c51汇编语言程序设计.ppt_第2页
第2页 / 共105页
第4章  80c51汇编语言程序设计.ppt_第3页
第3页 / 共105页
第4章  80c51汇编语言程序设计.ppt_第4页
第4页 / 共105页
第4章  80c51汇编语言程序设计.ppt_第5页
第5页 / 共105页
点击查看更多>>
资源描述

1、,第4章 80C51汇编语言程序设计,4.1 汇编语言程序设计的概述1汇编语言的特点:助记符指令和机器指令一一对应,代码率高,执行速度快,占用程序存储器少。能直接管理和控制硬件。编程难。汇编语言是面向计算机的,编程员必须掌握硬件缺乏通用性,2. 高级语言面向过程的语言。 (非面向机器的语言) 优点:可移置性强。 缺点:需经过解释(BASIC)或编译 目标程序 , 执行速度慢。,3. 汇编语言程序设计 用汇编指令来编写计算机程序 与高级语言的不同: (1)对RAM。ROM的使用,由程序设计者 自行安排,而高级程序由计算机软件自动安 排; (2)对硬件需特别了解,如各类寄存器,端 口,定时/计数器

2、,中断等需特别了解。 (3)可以灵活操作硬件,软件灵活性很高。,4. 汇编语言的语句格式 : ;(1)标号: 语句地址的标志符号,用来指明指令的地址。其它指令可以引用该符号,作为地址或数据。 标号规定: 由18个ASCII字符组成,开头必须是字母 不能使用已经定义了的符号,如指令助记 符,伪指令记忆符,寄存器符号名 标号后面必须有冒号 一个标号是唯一的,即不能重复定义 可以有标号,也可以没有。,ORG 0000H LJUMP MAIN;上电,转向主程序 ORG 000BH ;T0中断地址入口 AJMP SERVE; 转向中断服务程序主程序: ORG 0030HMAIN: MOV SP, #60

3、H;设堆栈指针 MOV B,#0AH;设循环次数 MOV TMOD, #01H;设置T0工作于模式1 MOV TL0,#0B0H;装入计数值低8位 MOV TH0,#3CH;装入计数值高8位 SETB TR0;启动定时器T0 SETB ET0;允许T0中断 SETB EA; 允许CPU中断 SJMP $; 等待中断,(2)操作码指令助记符。它是汇编指令中唯 一不能省略的部分。(3)操作数指令对应的操作对象,可能是数 据,地址,主要取决于指令中的 寻址方式。可能一项,两项,三项。(4)注释 开头用“;”对指令进行注释,便于程序阅读。(5)分界符:标号:操作码U 操作数1,操作数2,。;注释,5关

4、于伪指令,汇编语言的指令有两类: 汇编指令:编译后产生机器码 伪指令:汇编程序使用编译后不产生机器码,只是对汇编过程进行某种控制。,伪指令,(1)ORG汇编起始命令格式:ORG 16位地址功能:是规定该伪指令后面程序的汇编地址,即汇编后生成目标程序存放的起始地址。 ORG 2000HSTART:MOV A, #64H; ORG可以出现在程序的任何地方,当它出现时下一条指令的地址就可以由此从新定义,ORG 0000H LJUMP MAIN;上电,转向主程序 ORG 000BH ;T0中断地址入口 AJMP SERVE; 转向中断服务程序主程序: ORG 0030HMAIN: MOV SP, #6

5、0H;设堆栈指针 MOV B,#0AH;设循环次数 MOV TMOD, #01H;设置T0工作于模式1 MOV TL0,#0B0H;装入计数值低8位 MOV TH0,#3CH;装入计数值高8位 SETB TR0;启动定时器T0 SETB ET0;允许T0中断 SETB EA; 允许CPU中断 SJMP $; 等待中断,(2)定义字节DB格式:DB 项或项表功能:它通知汇编程序从当前ROM地址开始,保留一字节或字节串(用逗号隔开或在单引号中的ASCII字符串)的存储单元,并存入DB后面的数据。 ORG 2000H DB 0A3HLIST:DB 26H,03H STR:DB ABC 经汇编后,则有

6、:(2000H)=A3H(2001H)=26H(2002H)=03H(2003H)=41H(2004H)=42H(2005H)=43H,(3)DW定义字命令,格式:DW 16位数据项或项表功能:把DW后的16位数据项或项表从当前地址连续存放。每项数值为16位二进制数,高8位先存放低8位后存放。常用于定义一个地址表ORG 1500TABLE:DW 7234H,8AH,10H汇编后,则有:(1500H)=72H (1501H)=34H(1502H)=00H (1503H)=8AH(1504H)=00H (1505H)=10H DW ABC;不合法,因超过2个字节,注意:,DW和DB定义的数据表,数

7、的个数不得超过80,若数据的数目较多,可使用多个定义命令。常以DB定义数据,用DW定义地址。还有一些伪指令参见教材p93-96,4.2 汇编语言程序设计的步骤,1拟制设计任务书2确定方案和计算方法3建立系统数学模型,确定控制算法和操作步骤。4 画程序流程图:表示程序的结构和功能。美国国家标准化协会ANSI(American National Standard Institute)设定了一些常用的流程图符号如图所示:,处理框,流程线,5编制汇编语言源程序6上机调试,4.3编程的方法和技巧,1模块化的程序设计方法 程序功能模块化的优点单个模块结构的程序功能单一,易于编写,调试和修改。便于分工程序可

8、读性好对程序的修改可局部进行,其他部分不变使用频繁的子程序可以建立子程序库便于模块调用,划分模块的原则每个模块应具有独立的功能。能产生一个明确的结果模块之间的控制耦合应尽量简单,数据耦合尽量少。模块长度适中,2编程技巧尽量采用循环程序和子程序:可以减少程序的总容量,提高程序的效率。尽量少用无条件转移指令,这样可以使条理更清晰中断请求是随机发生的,在中断处理程序中,除了要保护处理程序中用到的寄存器外,还要保护标志寄存器。累加器是信息传递的枢纽:用累加器传递入口参数或返回参数比较方便。一般不必把累加器内容压入堆栈。,举例:,Y=5sinx+x3+10y1=sinx,y2=x3Y=5*y1+y2+1

9、0,4.4 汇编语言程序的基本结构形式 顺序结构程序 分支结构程序 循环结构程序 子程序结构程序,顺序程序:直线程序又称简单程序,程序执行时一条接一条地按顺序执行指令。 举例1:三字节无符号数相加,其中被加数在内部RAM的50H,51H和52H单元中,加数在内部RAM的53H,54H和55H单元中,要求把相加之和存放在50H,51H和52H单元中,进位存放在位寻址区的00H位中。-多字节数加法-用ADDC指令,加数1。和 结果“进位”放在位寻 址区“0011”位中 加数2 程序:,5.3.2 算数运算类指令,ADD类指令:共4条(1)ADD A,Rn ;AA+(Rn)(2)ADDA,direc

10、t;AA+(direct)(3)ADD A, Ri ;AA+(Ri)(4)ADD A,#data ;AA+ data,1加法指令,ADD:不带进位的加法运算指令ADDC:带进位的加法运算指令,与A相加,结果仍放A中。参加运算的两个操作数必须是8位二进制的数。可以根据编程需要,把参加运算的两个操作数看作无符号数(0-255),也可以把它看作带符号的数。通常采用补码的形式(-128-+127)计算机总是按照有符号的数法则运算,并产生PSW中的标志位若参加运算的两个操作数看作无符号的数,应根据Cy判断结果操作数是否溢出;若参加运算的两个操作数看作有符号的数,则应根据OV判断运算结果是否溢出。,加数1

11、。和 结果“进位”放在位寻 址区“0011”位中 加数2 程序:,MOV R0, #52H; 第一个加数.低字节地址低字 MOV R1, #55H; 第二个加数.低字节地址节相加 MOV A, R0 ADD A, R1; 低字节相加 MOV R0, A; 存放低字节相加结果 指向中 DEC R0 ; 第一个加数. 地址减1,进入51H间字节 DEC R1;第二个加数. 地址减1,进入54H,中间字 MOV A, R0;节相加 ADDC A, R1; 中间字节.带进位相加 MOV R0, A; 中间字节相加结果.指向高 DEC R0 ;高字节(第一个加数)字节 DEC R1 ;高字节(第二个被加

12、数)高字节 MOV A, R0相加 ADDC A, R1; 高字节,带进位相加 MOV R0, A; 存放高字节相加结果进位标 MOV 00H, C; 进位送00H位保存志保存,2.分支程序,特点:程序中含有转移指令(13条)。分为无条 件转移分支程序和条件分支程序。主要指令: 判断累加器A是否为零JZ.JNZ. 比较条件转移指令CJNE 减1条件转移指令DJNZ 判断进位标志是否为1,JC,JNC 位状态条件转移 JB JNB JBC;位状态为1, 转移,并清零.,条件转移指令组:为相对转移指令,指令的转移范围小,若要实现64K范围内的转移,要借助长转移指令过渡 (1)累加器判零转移指令 J

13、Z rel ;若(A)0, 则(PC) (PC)2rel 若(A)0,则顺序执行 (PC)(PC)2 JNZ rel ; 若(A)0, 则(PC)(PC)2rel 若(A)0, 则(PC) (PC)2,( 2) 比较转移指令 作为程序转移的指令 (4条) 间接的数据比较指令格式:CJNE ,rel 3字节指令 含义:若它们的值不相等,则转移;相等, 则顺序执行 CJNE A,data,rel;PCPC+rel CJNE A,direct,rel;累加器内容与内 部RAM单元比较 CJNE Rn,data,rel CJNE Ri,data,rel,程序转移(影响标志位CY)数值比较(80C51没

14、有专门的比较指 令)可利用CJNE作数值比较指令,即 (CY)0 左右 (CY)1 左右 (CY)1 左M2),(M1T55,程序转向JW降温处理, TaT55, 转降温处理程序JW CJNE A,54H,LOOP2 ;TaT54,转向LOOP2 AJMP FH ; TaT54返回LOOP2: JC SW ; CY=1,表明Ta0SGN(X)= 0 当 X=0 -1 当 X0设X存在40H中,结果Y存在41H,采用JZ,JB指令实现调转,程序:,SYMB: MOV A,40H ;取X JZ STOR ;X=0,Y=X JB ACC.7,MINUS;X0跳转 MOV A,# 1 ;X0,Y=+1

15、 SJMP STORMINUS:MOV A,#0FFH;X0,Y= -1补码STOR: MOV 41H,A ;保存Y RET,使用查表法 方法之一:首先在程序中建立一个插值表,并将各分支入口地址与该表首址的差值按序排列其中,该表的首址送DPTR,分支序号值送A中例5:有BR0,BR1,BR2,BR3共4个分支程序段,各分支程序段的功能依次是BR0:从内部RAM取数BR1:从外部RAM中低256B范围取数BR2:从外部RAM中4KB范围取数BR3:从外部RAM中64KB范围取数并假定R0中存放取数地址低8位地址R1中存放高8位地址,R3中存放分支序号值,假定以BRTAB作为差值表首地址,BR0_

16、BRTABBR0_BRTAB为差值.,程序存储器数据传送指令(向A传送指令),功能是对存放在程序存储器中的数据表格进行查找传送.只能向累加器A传送无论是内部程序存储器还是外部程序存储器,读指令为MOVC只能向A传送,采用变址寻址方式。两条读指令: MOVC A, A+DPTR;A( ( A ) ( DPTR ) ) MOVC A, APC ;A( ( A ) ( PC) ),例: 利用四分支程序,实现在内部RAM取数 在外部RAM低256B范围取数.在外部 4KB取数.在外部RAM64KB范围 取数. R0 低8位地址. R1 高8位地址 R3 分支序号0,1,2,3.,0,2,1,3,插值表

17、的建立方法:,将各分支入口地址与该表首址的差值按序排列其中。该表的首址送DPTR,:,J,B,B,B,B,:,:,SJMP BRE,参考教材P53,查表的方法之2:使用变址寻址转移指令(间接转移指令) JMP A+DPTR; (PC)(A)+(DPTR),将转移指令直接放入表中,即表示由转移指令组成指令表。该表的首址送DPTR DPTR的基地址存转移指令表的起始地址,A为表的偏移量。通过此指令实现程序的分支转移,(4)变址寻址转移指令(间接转移指令) JMP A+DPTR; (PC)(A)+(DPTR) 指令的转移地址:由数据指针DPTR的16位数和累加器A的8位数进行无符号相加形成,并直接送

18、入PC. DPTR的基地址存转移指令表的起始地址,A为表的偏移量。通过此指令实现程序的分支转移,3.循环程序,是为了重复执行一个程序段。汇编语言中没有循环语句,可使用条件转移指令通过条件转移判断来控制循环的结束和继续,(3) 减1非零转移指令.(2条) 寄存器减1条件指令. Zero DJNZ Rn, rel Decrease Jump Rn Rn-1 若(Rn)0, 则转移(PC)=(PC)+2+rel 若 (Rn)=0, 则顺序执行 (PC)=(PC)+2 直接寻址单元减1条件转移. DJNZ direct, rel 含义: (direct) (direct)-1 若(direct)0.则

19、转移,(PC)=(PC)+3+rel 若(direct)=0, 则顺序执行(PC)=(PC)+3.,例6:,已知内部RAM的BLOCK单元开始有一个无符号数据块,块长在LEN单元。请编写求数据块中各数累加和并存入SUM单元的程序。,ORG 0200HLEN DATA 20HSUM DATA 21HBLOCK DATA 22HCLR A ; A清零 MOV R2, LEN ;块长度送R2 MOV R1, #BLOCK ;数据起始地址送R1NEXT: ADD A, R1 ;A A+(R1) INCR1 ;修改数据指针 DJNZR2,NEXT ;若未完,则转NEXT MOVSUM ,A ;存累加和

20、SJMP ;结束 END,循环组织方式流程图,4. 子程序调用 指完成确定任务并能为其它程序反复调用的程序段。 ACALL LCALL功能 1. 保护现场和恢复现场 2. 参数传递参数传递用工作寄存器和累加器传递参数,即将输入参数存在工作寄存器和累加器A中。 缺点:传递参数不能很多。,编写子程序时应注意以下问题,子程序入口用标号作为子程序名。子程序的第一条指令地址称为子程序的起始地址或入口地址。该指令前必须有标号,标号应以子程序任务定名,以便一目了然。主程序调用子程序是通过安排在主程序中的调用指令实现的,子程序返回主程序必须执行安排在子程序末尾的一条RET返回指令。主程序调用子程序以及从子程序

21、返回主程序后,计算机能自动保护并恢复主程序的断点地址。但对于各种工作寄存器,特殊功能寄存器和内存单元的内容,如果需要保护和恢复,必须在子程序的开头和末尾安排保护和恢复的指令。调用子程序之前设置好堆栈。子程序嵌套须考虑堆栈容量,为了使所编子程序可以放在64K内存的任意子域,并能被主程序所调用,子程序内部必须使用相对转移指令,以汇编生成浮动代码子程序参数分为入口和出口参数:通过R0-R7,特殊功能寄存器SFR,内存单元和堆栈等传送和接受入口参数:调用子程序之前,需要传给子程序的参数。 出口参数:子程序送回调用程序的结果参数提供足够的调用信息:如:子程序名、子程序功能、入口参数和出口参数、子程序占用

22、的硬件资源、子程序中调用的其他子程序名。,例7:,设MDA和MDB内有两数a和b,编写求ca2+b2,并把c送入MDC的程序。设a,b皆为小于10的整数。分析:程序由两部分组成:主程序和子程序。 主程序通过累加器A传送子程序的入口参数a或b,子程序也通过累加器A传送出口参数a2或 b2给主程序,子程序为求平方的通用子程序,ORG 1000H MDA DATA 20H MDB DATA 21H MDC DATA 22H MOV SP, 30H ;确立堆栈区 MOV A,MDA ;入口参数a送A ACALL SQR ;求a2 MOV R1,A ;a2送R1 MOV A,MDB ;入口参数b送A A

23、CALL SQR ;求b2 ADD A,R1 ; a2+b2送A MOV MDC ,A ;存入MDC SJMP $ ;结束 SQR: ADD A, #01H ;地址调整 MOVC A, A+PC ;查平方表 RET ;返回 SQRTAB: DB 0,1,4,9.16 DB 25,36,49,64,81 END,例8:,试编程将起始地址分别在内部RAM 30H,40H单元中两组字符串,顺序取出送到外部RAM2000H,3000H单元中。字符串以“”字符结尾。 编程分析:设计一个从内部RAM取ASCII码字符串到外部RAM的子程序,然后选用指针R0分别指向内部RAM30H,40H单元,调用取ASC

24、II码字符串的子程序,传送至外部RAM中。 入口参数:R0,DPTR 出口参数:DPTR,程序设计流程图,参考主程序:,参考子程序,参考子程序(接上页),4.4 汇编语言程序的基本结构 顺序结构程序 分支结构程序 循环结构程序 子程序结构程序,4.5单片机汇编语言程序设计综合举例,1.运算程序的设计多字节减法程序例9.已知以内部RAM BLOCK1和BLOCK2为起始地址的存储区中分别有5字节无符号被减数和减数(低位在前,高位在后)。请编写减法子程序令它们相减,并把差放入以BLOCK1为起始地址的存储单元分析:算法:用减法指令从低字节开始相减即可,2带借位减法指令组(无不带借位减法)共4条:,

25、SUBB A , Rn ; (A) (A) - (Rn) - (CY) SUBB A , direct ; (A) (A) - (direct) - (CY) SUBB A , Ri ; (A) (A) - (Ri) - (CY) SUBB A , #data ; (A) (A) - data - (CY)该指令影响PSW中CY, AC, OV, P标志位。例: CLR C; MOV A , #52H SUBB A , #0B4H ; 82 1 0 1 0 1 0 0 1 0 OV=1 P=1-) -76 - 1 0 1 1 0 1 0 0 158 1 0 0 1 1 1 1 0,注:,在单片

26、机中,减法操作实际上是在控制器控制下采用补码加法来实现的。但在实际应用中,若要判断减法的操作结果,则可按二进制减法法则进行, A=-128+127。无论相减两数是无符号的数还是有符号的数,减法操作总是按带符号二进制数进行。并对PSW中各标志产生影响。没有不带Cy的减法指令,所以单字节相减时,必须清除进位标志CY。利用SUBB指令,借助进位CY标志,可以实现多字节(多精度)减法。,总结溢出规律: C7 = 0 C6 = 0 数值位、符号位均无溢出,OV = 0 C7 = 0 C6 = 1 数值位溢出侵犯符号位, OV = 1 C7 = 1 C6 = 0 符号位有溢出, OV = 1 C7 = 1

27、 C6 = 1 数值位符号位均有溢出但结果正确,OV = 0 C7和C6相同为0,相异为1,符合异或运算法则: OV = C7 C6注意:溢出OV与进位CY的区别。 CY主要用于无符号数的运算,OV主要用于有符号数的运算。,ORG 0A00H,参考程序,JC Err,乘法运算程序的设计,(1)无符号多字节乘除运算程序:了解它们的算法.乘法指令只能完成8位无符号数相乘.16位无符号数求积必须将它们分解成4个8位数相乘来实现.其方法有先乘后加和边乘边加两种.,无符号数相加算法(教材P85),参考程序:,(2)带符号多字节乘运算程序,单独处理被乘数和乘数的符号位求被乘数和乘数的绝对值并获得积的绝对值

28、对积进行处理,若积为正,则对积不作处理,若为负,则对积求补,使之变成补码形式,2.查表程序,预先把数据以表格形式存放在存储器,然后使用程序读出,这种能读出表格数据的程序称为查表程序.查表指令: MOVC A, ADPTRMOVCA,A+PC指令的特点:DPTR:能提供16位基址,可以在使用前给DPTR赋值。查表范围可达整个程序存储器64KB空间,远程查表PC虽然也能提供16位地址,但不能赋值。基址值是固定的。A的内容为8位无符号的数,只能在256个地址单元内寻址,近程查表使用MOVCA,A+PC时注意对A的修正。,MOVC A,A+PC完成查表步骤:,使用传送指令把所查数据表格的项数送入累加器

29、A使用ADD A,#data指令对累加器A进行修正,data值由下式确定 PC+data=数据表起始地址DTAB, 等于查表指令和数据表格之间的字节数采用查表指令MOVC A,A+PC完成查表,例11(教材P91),假定有4键盘,键扫描后把按键的键码放在累加器A中,键码与处理子程序入口地址的对应关系为:键码 入口地址0 RK0 RK1 RK2并假定处理子程序在ROM 64K的范围内分布,要求以查表方法,按键码转向对应的处理子程序,例11,参考程序,MOVC A,A+PC完成查表步骤:,使用传送指令把所查数据表格的项数送入累加器A使用ADD A,#data指令对累加器A进行修正,data值由下式确定 PC+data=数据表起始地址DTAB, 等于查表指令和数据表格之间的字节数采用查表指令MOVC A,A+PC完成查表,RL AMOV R2,AADD A,#0DH ;对A修正MOVC A,A+PC PUSH A MOV A,R2INC AADD A,#06HMOVC A,A+PCMOV DPH,APOP DPLCLR AJMPA+DPTR BS:DB RK0LDB RK0HDB RK1LDB RK1H DB RK2L DB RK2H,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经济财会 > 经济学

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报