C51汇编语言程序的设计与调试.ppt
《C51汇编语言程序的设计与调试.ppt》由会员分享,可在线阅读,更多相关《C51汇编语言程序的设计与调试.ppt(79页珍藏版)》请在三一办公上搜索。
1、第4章 汇编程序的设计与调试,一、汇编语言程序设计概述二、实用程序设计三、C51介绍,程序设计语言,1.机器语言(Machine Language)这是一种用二进制代码“0”和“1”表示指令和数据的程序设计语言。计算机只能识别二进制代码,这种语言是能被计算机直接识别和执行的机器级语言。特点:机器语言能够被计算机立即识别并加以执行,具有执行速度快、占用内存少等优点。但对于使用者来说,用机器语言编写程序具有编写难、识别难、记忆难、查错难、交流难等缺点。,2.汇编语言(Assembly Language)汇编语言是一种用助记符来表示的面向机器的程序设计语言。不同的机器所使用的汇编语言一般是不同的。但
2、计算机的CPU不能直接识别汇编语言,所以计算机不能立即执行汇编语言程序。用汇编语言编写的源程序,在由计算机执行之前,必须将它翻译成机器语言程序。特点:这种语言弥补了机器语言的不足,用汇编语言编写程序比用机器语言方便、直观、易懂、易用、易记。可以编写出结构紧凑、运行时间精确的程序。所以,这种语言非常适合于实时控制的需要。,3.高级语言(High-Level Language)高级语言是面向过程并能独立于计算机硬件结构的通用程序设计语言,是一种接近人类语言和数学表达式的计算机语言。比如:BASIC、FORTRAN、COBOL、PASCAL、C语言等。高级语言不能被计算机直接识别和执行,需要用编译程
3、序或解释程序将高级语言编写的源程序翻译为机器语言。特点:它比汇编语言易学、易懂,具有通用性强、易于移植等优点。高级语言的语句功能强,它的一条语句往往相当于许多条指令,因而用于翻译的程序要占用较多的存储空间,而且执行时间长,且不易精确掌握,故在高速实时控制中一般是不适用的。,基本概念在目前单片机的开发应用中,经常采用C51语言和汇编语言共同编写程序。要想很好地掌握和应用单片机首先要掌握汇编语言。汇编语言是面向机器的程序设计语言,对于CPU不同的单片机,其汇编语言一般是不同的。用汇编语言编写的程序称为汇编语言源程序。汇编语言源程序是由汇编语言语句构成的。汇编语言语句可分为两大类:指令性语句和指示性
4、语句。指令性语句是由指令组成的由CPU执行的语句,指示性语句是由伪指令组成的,它不被CPU执行,用来告诉汇编程序如何对程序进行汇编的指令;由于它不能生成机器语言,故又被称为伪指令语句。,一、汇编语言程序设计概述,1.指令性语句格式 标号:操作码助记符 目的操作数,源操作数;注释 每条汇编语句一般由若干部分组成,每一部分称为一个字段。每个字段之间应该严格地用分界符加以分隔。分界符包括冒号、空格符、逗号、分号等。标号段与操作码之间要加冒号“:”;操作码与操作数之间要用空格相隔;各操作数之间要用逗号“,”相隔;操作数与注释段之间要加分号“;”相隔。,标号是语句所在地址的标志符号(1)标号后边必须跟以
5、冒号“:”(2)由1-8个ASCII字符组成(3)同一标号在一个程序中只能定义一次(4)不能使用汇编语言已经定义的符号作为标号,必须以分号“;”开头,换行书写,但必须注意也要以分号“;”开头。汇编时,注释字段不会产生机器代码。,操作字段:(1)十六进制,后缀“H”例:MOV A,#23H 二进制,后缀“B”例:MOV A,#01010101B 十进制,后缀“D”,也可省略。(2)若十六进制的操作数以字符A-F中的某个开头时,则需在它前面加一 个“0”,以便在汇编时把它和字符A-F区别开来。例:MOV A,#0FCH(3)采用工作寄存器和特殊功能寄存器的代号来表示,也可用其地址来 表示。例:程序
6、状态子可用PSW表示,也可用D0H来表示(4)美元符号$的使用 用于表示该转移指令操作码所在的地址。例如,如下指令:HERE:SJMP HERE 可写为:SJMP$,2.伪指令的指示性语句格式 标号:伪操作 操作数,操作数,.;注释 伪指令不是真正的指令,是在汇编时供汇编程序识别的指令,又称为汇编指令。它不属于指令系统,也无对应的机器码,只是用来对汇编过程进行某种控制。利用伪指令告诉汇编程序如何进行汇编,为编程提供方便。,常用伪指令,定位伪指令ORG定义字节数据伪指令DB定义字数据伪指令DW定义空间伪指令DS符号定义伪指令EQU或定义标号伪指令DL数据赋值伪指令DATA数据地址赋值伪指令XDA
7、TA汇编结束伪指令END,ORG(Origin)汇编起始指令 ORG是程序汇编起始地址定位伪指令,功能:是规定对汇编语言源程序进行汇编时,目的程序在程序存储器中存放的起始地址。格式:标号:ORG 16位地址或标号注意:在一个源程序中,可多次使用ORG指令,以规定不同程序段的起始位置,地址应从小到大顺序排列,不允许重叠。例如:ORG 0000HSTART:SJMP MAIN ORG0030HMAIN:MOV SP,#30H,END(End)汇编结束指令 END是汇编语言程序结束伪指令。功能:是表示程序已结束,汇编程序对END后面的指令不再汇编。格式:标号:END注意:在一个源程序中,只能有一条E
8、ND指令,而且必须放在整个程序的末尾。,EQU(Equate)赋值指令 EQU是赋值(也称等值)伪指令。功能:把操作数段中的数据或地址赋值给标号字段中的字符名称。格式:字符名称 EQU 数值或汇编符号 注意:字符名称必须先赋值后使用,故EQU指令通常放在源程序 的开头。EQU可定义8位或16位的数据或地址,例如:ORG 8500H AA EQUR1A10 EQU10HDELAY EQU87E6HMOVR0,A10;R0(10H)MOVA,AA;A(R1)LCALL DELAY;调用起始地址为87E6H的子程序END,DATA(Data)数据地址赋值指令 DATA是数据地址赋值伪指令。功能:把操
9、作数段中的表达式的值赋给标号字段中的字符名称。格式:字符名称 DATA 表达式 注意:DATA指令功能与EQU指令类似,它们的主要区别如下:DATA定义的字符名称可以先使用后定义,DATA指令可以放在源程序的任何位置,使用灵活。DATA只能用来定义8位的数据或地址。EQU可以把汇编符号赋给字符名称,而DATA只能把数据赋给字符名称。DATA可以把表达式的值赋给字符名称,这个表达式是可以进行求值运算例:A1 DATA 345H A1 DATA A1+1,XDATA数据地址赋值指令 XDATA是数据地址赋值伪指令。功能:把操作数段中的表达式的值赋给标号字段中的字符名称。格式:字符名称 XDATA
10、表达式 注意:XDATA指令功能与DATA指令类似,它们的主要区别是XDATA可定义16位的数据或地址。,BIT(Bit)位地址赋值指令 BIT是位地址赋值伪指令。功能:把位地址赋给字符名称。格式:字符名称 BIT 位地址例如:AB BIT 30H;AB与30H等值 AC BIT P1.0;AC与P1.0等值 MOV C,AB;把位地址区30H单元中的数据送入 位累加器C中 CLR AC;把P1.0中的内容清零,DB(Define Byte)定义字节指令 DB是定义字节伪指令。功能:从程序存储器指定地址单元开始存放若干个字节的数值或ASCII码字符。格式:标号:DB 字节数据或ASCII码字符
11、 注意:多个字节数据或ASCII码字符之间要用逗号相隔,DB指令常用于定义8位的数据常数表。例如:ORG 7F00H TAB:DB 01110010B,16H,45,8,A汇编后存贮单元内容为:(7F00H)=72H、(7F01H)=16H、(7F02H)=2DH(7F03H)=38H、(7F04H)=41H,DW(Define Word)定义字指令 DW是定义字伪指令。功能:从程序存储器指定地址单元开始存放若干个字的数值。格式:标号:DW 字节数据或ASCII码字符 注意:多个字数据之间要用逗号相隔,DW指令常用于定义16位的地址表。例如:ORG 6000H TAB:DW1254H,32H,
12、161 汇编后存贮单元内容为:(6000H)=12H(6001H)=54H(6002H)=00H(6003H)=32H(6004H)=00H(6005H)=0A1H,DS(Define Space)定义存储空间指令 DS是定义存储空间伪指令。功能:从程序存储器指定地址单元开始保留表达式的值所规定的存储单元。格式:标号:DS 表达式 例如:ORG 1000H TAB:DS 06H DB 25H,35H 在上述源程序中,程序存储器从1000H单元开始保留6个单元,1006H单元存放25H,1007H单元存放35H。,注:对8051单片机,DB、DW、DS等伪指令只能用于程序存储器,而不能对数据存储
13、器使用。,3.汇编语言源程序的汇编 汇编语言源程序必须要转换为机器码(即目的程序),计算机才能执行,这个转换过程称为汇编。汇编语言源程序的汇编可分为手工汇编和机器汇编两类。手工汇编是指用人脑通过查指令编码表(见附录中的指令表)把汇编语言源程序翻译成机器码的过程,又称为人工代真。机器汇编是用机器代替人脑并由专门的程序来进行的,这种程序称为汇编程序(不同的指令系统汇编程序不同)。机器汇编由计算机自动完成,汇编程序把用汇编语言编写的源程序翻译成由机器语言表示的目的程序。用编辑软件进行源程序的编辑。编辑完成后,生成一个ASCII码文件,扩展名为“.ASM”。反汇编是在分析程序存储器已有的程序时,将机器
14、语言翻译成汇编语言的转换过程。,无论是高级语言还是汇编语言写的源程序都必须转换成目标程序,单片机才能执行。目前很多公司都将编辑器、汇编器、编译器、连接/定位器、符号转换程序做成了软件包,称为集成开发环境,如Keil uVision、Silicon Laboratories IDE等。,二、实用程序设计,程序设计方法和技巧源程序的基本格式汇编语言程序设计举例,程序设计方法和技巧,1.程序设计的一般步骤(1)分析工作任务,明确要达到的工作目的、技术指标等。(2)确定解决问题的算法。算法就是如何将实际问题转化成程序模块来处理,要对不同的算法进行分析、比较,找出最适宜的算法。(3)画程序流程图。其图形
15、的符号规定均与高级语言流程图相同,如桶形框表示程序的开始或结束,矩形框表示需要进行的工作,菱形框表示需要判断的事情,指向线表示程序的流向等。(4)分配内存工作单元,确定程序与数据的存放地址。(5)编写源程序。(6)上机调试、修改源程序。,2.程序设计的一般原则按照尽可能使程序简短和缩短运行时间两个原则编写程序。应用程序一般都由一个主程序(包括若干个功能模块)和多个子程序构成,即采用模块化的程序设计方法。每一功能模块或子程序都能完成一个明确的任务,实现某个具体功能,如检测输入信号、码制转换、输出控制信号、发送数据、接收数据、延时、显示、打印等。3.模块化程序设计方法的特点单个模块结构的程序功能单
16、一,易于编写、调试和修改。对程序的局部修改,可以使无关的部分保持不变。程序可读性好,便于功能扩展和版本升级。对于使用频繁的子程序可以建立子程序库,便于多个模块调用。可实现多人同时进行程序的编写和调试工作,缩短程序编写时间。,4.划分模块应遵循的原则高内聚性。每个模块应具有独立的功能,能产生一个明确的结果。低耦合性。模块之间的控制耦合应尽量简单,数据耦合应尽量少。控制耦合是指模块进入和退出的条件及方式,数据耦合是指模块间的信息交换(传递)方式、交换量的多少及交换的频繁程度。模块长度适中。模块语句的长度为20100条的范围较合适。模块太长时,分析和调试比较困难,失去了模块化程序结构的优越性;过短则
17、模块的连接太复杂,信息交换太频繁。,源程序的基本格式,ORG 0000HLJMP START;转向主程序ORG 0003HLJMP INTIE0;转向外部中断服务程序ORG 0050HSTART:MOV A,#00HORG 4500H INTIE0:DBLO:DB 43H,64H,;表格参量 END;结束,分支结构程序,循环结构程序,简单结构程序,查表程序,子程序,汇编语言程序设计举例,关键字查找程序设计,数据极值查找程序设计,数据排序程序设计,子程序设计,主要内容:1.主程序与子程序的关系 2.子程序嵌套 3.子程序的参数传递,子程序是指完成某一专门任务并能被其他程序反复调用的程序段。调用子
18、程序的程序称为主程序或调用程序。使用子程序的过程称为调用子程序。子程序执行完后返回主程序的过程称为子程序返回。主程序和子程序是相对的,同一程序既可以作为另一程序的子程序,也可以有自己的子程序。也就是说,子程序是允许嵌套的,嵌套深度和堆栈区的大小有关。采用子程序能使整个程序结构简单,缩短程序设计时间,减少对存储空间的占用。,主程序与子程序的关系,主程序MAIN,返回,LCALL SUB,调用子程序,子程序入口地址,RET,MAIN:;MAIN为主程序或调用程序标号 LCALL SUB;调用子程序SUB SUB:PUSH PSW;现场保护 PUSH ACC;子程序处理程序段 POP ACC;现场恢
19、复POP PSW;RET;最后一条指令必须为RET,典型的子程序的基本结构,注意:子程序的第一条指令的地址称为子程序的入口地址,该指令前应有标号。在子程序末尾用RET返回指令从子程序返回主程序。根据需要保护现场和恢复现场。在子程序的开始,使用压栈指令把需要保护的内容压入堆栈;在返回主程序前,使用弹出指令把堆栈中保护的内容送回原来的存储单元中。子程序中有可能要使用累加器A或工作寄存器,在子程序使用它们之前,把它们中可能存有的主程序的中间结果保存起来,这一过程称为保护现场。在子程序执行完并将返回主程序之前,再将这些中间结果取出,送回到累加器A或原来的工作寄存器中,这一过程称为恢复现场。子程序中应尽
20、量使用相对转移指令而不使用其他转移指令,以便子程序放在内存的任何区域都能被主程序调用。要正确地设置堆栈指针,以避免堆栈区与工作寄存器或其他存储单元发生冲突。,ORG0000H MAIN:MOVA,#0FEH;送显示初值 LP:MOVR0,#10;送闪烁次数 LP0:MOVP1,A;点亮LEDLCALLDELAY;延时MOVP1,#0FFH;熄灭灯LCALLDELAY;延时DJNZR0,LP0 RLA SJMPLP END,实例:P1口连接的8个LED依次循环闪烁10次,子程序嵌套,子程序嵌套(或称多重转子)是指在子程序执行过程中,还可以调用另一个子程序。问题:子程序调用、返回到主程序中的正确位
21、置,并接着执行主程序中的后续指令呢?为了解决这个问题,我们采用了堆栈技术。,子程序嵌套,子程序SUB1,主程序MAIN,RET,子程序SUB2,RET,2010,2013,2110,2113,2100,2200,20 13,20,13,PC,21 13,13,21,堆栈指针SP,堆栈,LCALL SUB1,LCALL SUB2,21,13,20,13,子程序嵌套范例:LED灯闪烁(二),ORG 0000H MAIN:MOV A,#0FEH;送显示初值 COUN:ACALL FLASH;调闪烁子程序 RL A;A左移,下一个灯闪烁 SJMP COUN;循环不止 FLASH:MOV R0,#10;
22、送闪烁次数 FLASH1:MOV P1,A;点亮LED LCALL DELAY;延时 MOV P1,#0FFH;熄灭灯 LCALL DELAY;延时 DJNZ R0,FLASH1;闪烁次数不够10次,继续 RET DELAY:MOV R3,#0FFH;延时子程序 DEL2:MOV R4,#0FFH DEL1:NOP DJNZ R4,DEL1 DJNZ R3,DEL2 RET END,子程序的参数传递范例:计算平方和c=a2+b2,a存放在31H,b存放在32H,结果c存放在33HORG0000H;主程序MOVSP,#3FH;设置栈底MOVA,31H;取数a存放到累加器A中作为入口参数LCALL
23、 SQR;计算a2MOVR1,A;出口参数平方值存放在A中MOVA,32H;取数b存放到累加器A中作为出口参数LCALL SQR;计算b2ADDA,R1;求和MOV33H,A;存放结果SJMP$,;子程序:SQR;功能:通过查表求出平方值y=x2;入口参数:x存放在累加器A中;出口参数:求得的平方值y存放在A中;占用资源:累加器A,数据指针DPTRSQR:PUSH DPH;保护现场,将主程序中DPTR的高八位放入堆栈 PUSH DPL;保护现场,将主程序中DPTR的低八位放入堆栈 MOV DPTR,#TABLE;在子程序中重新使用DPTR,表首地址DPTR MOVC A,A+DPTR;查表 P
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C51 汇编语言 程序 设计 调试
链接地址:https://www.31ppt.com/p-5417018.html