大学单片机及接口课程 第4章-汇编程序设计_第1页
大学单片机及接口课程 第4章-汇编程序设计_第2页
大学单片机及接口课程 第4章-汇编程序设计_第3页
大学单片机及接口课程 第4章-汇编程序设计_第4页
大学单片机及接口课程 第4章-汇编程序设计_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

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

文档简介

第4章:汇编语言程序设计,本章基本要求:汇编语言的构成源程序的设计与汇编*应用程序设计*,4.1汇编语言的构成,4.1.1程序设计语言用户要使计算机能完成各式各样的任务,就要设计各种相应的应用程序,而设计程序就要用到程序设计语言。程序设计语言有3种:机器语言汇编语言高级语言。,4.1汇编语言的构成,表4-1机器语言和汇编语言的形式,机器语言中二进制形式不便记忆,常采用十六进制形式记忆,4.1汇编语言的构成,在Keil调试环境下反汇编程序,1、汇编源程序:,2、反汇编程序:,地址,机器码,反汇编程序,汇编源程序,4.1汇编语言的构成,1、机器语言计算机能直接识别和执行的二进制代码形式的指令称为机器指令,而该类指令的集合称为计算机的机器语言,或称指令系统。机器语言是面向计算机系统的。由于各种计算机内部结构,线路的不同,每种计算机系统都有它自己的机器语言,即使执行同一操作,其指令也不相同。,4.1汇编语言的构成,2、汇编语言计算机所能执行的每条指令都对应一组二进制代码。为了容易理解和记忆计算机的指令,人们用一些英语的单词和字符以及数字作为助记符来描述每一条指令的功能。用助记符描述的指令系统,称为机器的汇编语言系统,简称汇编语言。汇编语言也是面向机器的,每种计算机系统也都有它自己的汇编语言,用汇编语言编写的程序,称为汇编语言源程序或汇编源程序。,4.1汇编语言的构成,3、高级语言高级语言(如:PASCAL、C、FORTRAN、BASIC等)克服了汇编语言的缺点,是一种面向问题或过程的语言。它是一种接近于自然语言和数学算法的语言,与机器的硬件无关,用户编程时不必仔细了解所用计算机的具体性能和指令系统。高级语言不但直观、易学、易懂,而且通用性强,可以在不同的计算机上运行,因此可移植性好。,4.1汇编语言的构成,4.1.2汇编语言格式MCS51系列单片机是用51系列单片机的指令系统来编程的,其汇编语言的语句格式,也就是单片机的指令格式,即:标号:操作码操作数;注释说明:1、内的部分为可选项;2、标号是一条指令在存储器存放的地址,是以字母开头的字母数字串,不可以是保留字;3、操作码和操作数必须按照指令格式书写;,4.1汇编语言的构成,举例:ORG0060HSTART:MOVA,#00H;A0MOVR2,#0AH;R210MOVR1,#03H;R13LOOP:ADDA,R1;AA+R1DJNZR2,LOOP;若R2-10,则跳到LOOPNOPSJMP$END,4.1汇编语言的构成,4、操作数可以写成以下形式(5种-128页):二进制、十进制、十六进制形式工作寄存器、特殊功能寄存器地址标号带加减算符的表达式采用符,4.1汇编语言的构成,举例:MOVA,#00110101B;A53MOVA,#20D;A20MOVA,#20;A20MOVR0,#20H;R020HMOVR1,#0BFH;R1BFHSJMP$;原地跳转MOVR7,R2;R7R2MOVA,LABLE;A标号地址MOVA,LABLE+1;A标号地址+1,4.1汇编语言的构成,4.1.3汇编语言构成汇编语言语句分为:指令性语句、指示性语句两类。1、指令性语句包括指令系统中的全部指令,每条指令有对应的机器代码,并可由CPU执行。2、指示性语句在汇编源程序的过程中,还有一些指令不要求CPU进行任何操作,也没有对应的机器码,不影响程序的执行,仅仅是能够指导汇编进行处理的一些指令,称之为伪指令。,4.1汇编语言的构成,伪指令的主要功能是:用来指定程序或数据的起始位置,给出一些连续存放数据的确定地址,或为中间运算结果保留一部分存储空间以及表示源程序结束等等。不同版本的汇编语言,伪指令的符号和含义可能有所不同,但是基本用法是相似的。下面介绍几种常用的基本伪指令。,MCS-51单片机伪指令,1、起点指令ORG,格式:,ORGH(16位地址或标号),功能:,给程序起始地址或数据块的起始地址赋值,例:,用法:,一般出现在每段源程序或数据块的开始一个源程序可多次出现ORG指令,首地址,首地址,2、结束命令END,格式:END,功能:汇编程序结束标志,附在一个源程序的结尾一个源程序只能出现一次END指令,用法:,MCS-51单片机伪指令,3、等值命令EQU,格式:,字符名称EQU数据或汇编符号,功能:,将一个数据或汇编符号赋予标号段规定的字符名称,例:,;AA与R6等值,MCS-51单片机伪指令,例:,A10EQU10DELYEQU07EBHMOVA,A10LCALLDELY,;A10=10,;DELY=07EBH,;转向入口地址07EBH,使用EQU指令,须先赋值后使用,不能反之,4、数据地址赋值等值命令DATA,格式:,字符名称DATA数据或表达式,功能:,此命令把数据/代码地址赋予标号段所规定的字符名称。定义的字符名称可先使用后定义,INDEXJDATA8096H,;INDEXJ这个字符名称的地址为8096H,例:,等价于,MCS-51单片机伪指令,EQU与DATA的区别,(1)DATA与EQU相似,但DATA定义的字符名称,可先使用后定义,EQU则不能,(2)EQU指令可把汇编符号赋给字符名称,DATA则不能,(3)DATA可把表达式的值赋给字符名称,EQU则不能,DATA常在程序中定义数据地址EQU常在程序中定义字符数据,MCS-51单片机伪指令,5、定义字节命令DB,格式:,功能:,标号:DB字节常数或字符串(8位),定义字节的内容,汇编程序把DB定义的字节依次存入标号开始的存储单元,有定义的内存单元地址,项或项表,例:,伪指令ORG定义了TAB的起始地址为8000H,伪指令DB定义了8000H8003单元的内容依次为:,(8000H)=45H,(8001H)=49H,(8002H)=35H,(8003H)=41H,(8004H)=05H,TAB,TAB1,(1)由ORG定义,(2)跟在其他源程序之后,6、定义字命令DW,格式:,功能:,标号:DW字或字表,定义若干个字(双字节),例:,ORG8000H,TAB:DW7234H,8AH,10,(8000H)=72H,(8001H)=34H,(8002H)=00H,(8003H)=8AH,(8005H)=0AH,汇编后:,(8004H)=00H,MCS-51单片机伪指令,7、定义空间命令DS,格式:,功能:,标号:DS数据或字符及表达式,例:,(8008H)=30H,(8009H)=8AH,从指定单元地址开始,由数据或字符及表达式的值来定义应保留的单元数,备用,即:8000H8007H单元保留备用,定义空间,MCS-51单片机伪指令,8、位地址符号命令BIT,格式:,字符名称BIT位地址,功能:,把位地址赋予标号段的字符名称,;P1.0,P2.0赋予位地址字符名称A1、A2,在编程时可以直接把A1、A2当成位地址使用,MCS-51单片机伪指令,4.2汇编源程序的设计与汇编,4.2.1汇编程序设计步骤1、确定方案和计算方法2、了解应用系统的硬件配置、性能指标。3、建立系统数学模型,确定控制算法和操作步骤。4、画程序流程图,表示程序结构和程序功能。5、编制源程序合理分配存储器单元和了解I/O接口地址。按功能设计程序,明确各程序之间的相互关系。用注释行说明程序,便于阅读和修改调试和修改。6、上机调试,对程序的正确性作最后的确定。,汇编程序的操作,分两次扫描(汇编),第一次扫描(汇编),检查语法结构,对源程序中的符号、表达式、标号进行定义,处理伪指令,建立符号表,显示ERROR,并提示行号,显示ERROR,并提示行号,修改!,修改!,第二次扫描(汇编),汇编成目标代码和汇编程序清单,可执行的代码(机器码),4.2汇编源程序的设计与汇编,程序设计步骤流程:,Y,N,Y,Y,Y,N,N,N,4.2汇编源程序的设计与汇编,4.2.2源程序的汇编CPU可以执行的只能是机器码程序。称:把源程序翻译成机器码的过程为汇编。汇编可:人工汇编和机器汇编两类。1、人工汇编由人工直接将汇编源程序翻译成机器码。2、机器汇编使用计算机执行“汇编程序”来代替人工实现将汇编源程序翻译成机器码。,汇编语言源程序,机器语言,汇编,反汇编,交叉汇编,例4.1设在内部RAM的BLOCK单元内有一无符号数据块的长度,无符号数据块起始地址是BLOCK+1。试编程求无符号数据块种数据的累加和(不考虑进位加法之和),并把它存入SUM单元。程序:ORG1000HSUMDATA1FHBLOCKDATA20HSTART:MOVR0,#BLOCK;数据块长度地址送R0MOVA,R0;数据块长度送ACJNEA,#00H,LOOP;若数据块长度0,则LOOPHERE:SJMP$;若数据块长度=0,则结束LOOP:CLRANEXT:INCR0;修改数据指针ADDA,R0;加一个数DJNZBLOCK,NEXT;若(BLOCK)-10,则NEXTMOVSUM,A;存累加和SJMPHEREEND,汇编程序经两次汇编得机器码第一次汇编第二次汇编,转移地址计算,LOOP=1008H-1003H-3=02H;NEXT=1009H-100BH-3=-5=0FBH$=1006H-1006H-2=-2=0FEH;HERE=1006H-1010H-2=-12=0F4H,偏移地址=指令所在地址-跳转地址-指令字节数,4.3简单程序与分支程序设计,4.3.1简单程序设计例4.2请编写能把20H单元内两个BCD数变成相应的ASCII码并放在21H(高位BCD数的ASCII码)和22H(高位BCD数的ASCII码)单元的程序。程序:ORG0500HMOVR0,#22H;R0=22HMOVR0,#00H;(22H)=0MOVA,20H;A(20H)BCD码XCHDA,R0;低位BCD码与22H半字节交换ORL22H,#30H;加30H完成ASCII码变换SWAPA;高位BCD码高低位半字节交换ORLA,#30H;加30H完成ASCII码变换MOV21H,A;存入21H单元SJMP$,例4.3已知一个补码形式的16位二进制(低8位在NUM单元,高8位在NUM+1单元),试编写能求该16位二进制数原码的绝对值得程序。程序:ORG0300HNUMDATA20HMOVR0,#NUM;R0=NUMMOVR0,A;低8位送入ACPLA;A求反ADDA,#01H;A中内容变补,保留CYMOVR0,A;存数INCR0;地址加1,指向高8位MOVR0,A;高8位送入ACPLA;取反ADDCA,#00H;加进位ANLA,#7FH;去掉符号位MOVR0,A;存数SJMP$,4.3简单程序与分支程序设计,例4.4已知20H单元中有一个8位二进制数,请编程把它转换为3位BCD数,把百位数存入FIRST单元的低4位,十位和个位BCD数放在SECOND单元,十位BCD数在SECOND单元的高4位。程序:ORG0200HFIRSTDATA30HSECONDDATA31HMOVA,20H;A=(20H)MOVB,#64H;除数100DIVAB;A/100MOVFIRST,A;低8位送入AMOVA,B;余数送AMOVB,#0AH;除数10DIVAB;A/10SWAPA;十位BCD送高4位ORLA,B;完成十位和个位装配MOVSECOND,A;存入SECOND单元SJMP$,4.3简单程序与分支程序设计,4.3.2分支程序设计可分为无条件和有条件分支程序两类。重点以条件分支举例。例4.5已知VAR单元内有一自变量,请按如下条件编出求函数值Y,并将它存入FUNC单元的程序。1X0Y=0X=0-1X0,则转POSIMOVA,#0FFH;若0,则A-1SJMPDONE;转DONEPOSI:MOVA,#01H;则A1DONE:MOVFUNC,A;存结果SJMP$END,Y,Y,N,N,例如行李计价:当重量G5公斤,价格M=G3(元);当重量G5公斤,价格M=G3+(G-5)2(元),FRT:MOVA,40H;取行李重量计价单位GMOVR3,AMOVB,#03H;M=G3MULABMOVR2,A;暂存3GMOVA,R3;取回GCJNEA,#05H,L1;G5?SJMPWETCL1:JCWETC;是,转至WETCSUBBA,#05H;否则M=3G+2(G-5)RLCAADDA,R2WETC:MOV41H,A;存结果MRET,一个判断决策框,程序有两条出路。两种分支结构:,例:求R2中补码绝对值,正数不变,负数变补。MOVA,R2JNBACC.7,NEXT;为正数?CPLA;负数变补INCAMOVR2,ANEXT:SJMPNEXT;结束,一、按分支号转移,如:当分支号=0,程序转移到ADDR0处;当分支号=1,程序转移到ADDR1处;。,(1)用地址表法。设分支号已存入A。MTJS:MOVDPTR,#TAB;取表首地址CLRC;分支号2RLCAMOVR2,AMOVCA,A+DPTR;取分支地址高位PUSHACC;入栈保存MOVA,R2INCAMOVCA,A+DPTR;取分支地址低位PUSHACC;入栈保存RET;分支地址PC,转移TAB:DWADDR0;分支地址表DWADDR1ADDR0:;程序段0,(2)转移表法。用分支转移指令JMPA+DPTR。设R7R6=分支号,MTJS:MOVDPTR,#TAB;指向表首地址MOVA,R7;分支号高字节3MOVB,#03HMULAB;乘积不超过1字节ADDA,DPHMOVDPH,AMOVA,R6;分支号低字节3MOVB,#03HMULABXCHA,BADDA,DPH;DPHDPH+(R7、R6)3)高字节MOVDPH,AXCHA,B;A(R7、R6)3)低字节JMPA+DPTR;实现多分支转移TAB:LJMPADDR0;转移表LJMPADDR1LJMPADDRNADDR0:;程序段0,4.4循环与查表程序设计,4.4.1循环程序设计循环程序一般由四部分组成:循环初始化、循环处理、循环控制、循环结束。循环程序一般使用两种结构,如下图:,循环程序的构成,各个环节任务:一初始化部分循环准备工作。如:清结果单元、设指针、设循环控制变量初值等。,二循环体循环工作部分:需多次重复处理的工作。循环控制部分:1.修改指针和循环控制变量。2.检测循环条件:满足循环条件,继续循环,否则退出循环。三.结束部分处理和保存循环结果。允许0次循环的循环结构:在循环工作之前检测循环条件。,4.4循环与查表程序设计,一、单重循环,例:求n个单字节数据的累加,设数据串已在43H起始单元,数据串长度在42H单元,累加和不超过2个字节。,SUM:MOVR0,#42H;设指针MOVA,R0MOVR2,A;循环计数器nCLRA;结果单元清0MOVR3,AADD1:INCR0;修改指针ADDA,R0;累加JNCNEXT;处理进位INCR3;有进位,高字节加1NEXT:DJNZR2,ADD1;循环控制:数据是否加完?MOV40H,A;循环结束,保存结果MOV41H,R3RET,简单循环结构:循环体中不套循环。,循环控制方法:计数控制、特征标志控制。,1、计数控制:设循环计数器,控制循环次数。正计数和倒计数两种方式。例:为一串7位ASCII码数据的D7位加上奇校验,设数据存放在片外RAM的2101H起始单元,数据长度在2100H单元。,MOVDPTR,#2100HMOVXA,DPTRMOVR2,ANEXT:INCDPTRMOVXA,DPTRORLA,#80HJNBP,PASSMOVXDPTR,APASS:DJNZR2,NEXTDONE:SJMPDONE,2、特征控制:设定循环结束标志实现循环控制。,例:找正数表最小值。正数表存在片外RAM中以LIST为起始单元,用-1作为结束标志。,START:MOVDPTR,#LIST;数表首地址MOVB,#127;预置最小值NEXT:MOVXA,DPTR;取数INCDPTR;修改指针CJNEA,#-1,NEXT1;是否为数表结尾?SJMPDONE;循环结束NEXT1:CJNEA,B,NEXT2;比较NEXT2:JNCNEXTMOVB,A;保存较小值SJMPNEXTDONE:SJMPDONE,二、多重循环,例将内存一串单字节无符号数升序排序。步骤:每次取相邻单元的两个数比较,决定是否需要交换数据位置。第一次循环,比较N-1次,取到数据表中最大值。第二次循环,比较N-2次,取到次大值。第N-1次循环:比较一次,排序结束。,循环体中套循环结构。以双重循环使用较多。,SORT:MOVA,#N-1;N个数据排序MOVR4,A;外循环次数LOOP1:MOVA,R4MOVR3,A;内循环次数MOVR0,#TAB;设数据指针LOOP2:MOVA,R0;取二数MOVB,AINCR0MOVA,R0CJNEA,B,L1;比较L1:JNCUNEX;AB,不交换DECR0;否则交换数据XCHA,R0INCR0MOVR0,AUNEX:DJNZR3,LOOP2;内循环结束?DJNZR4,LOOP1;外循环结束?RET,4.4循环与查表程序设计,4.4.2查表程序设计所谓查表是依据ROM中的数据表格的项数来查找与之对应的表中数值。有两条专门的查表指令:MOVCA,A+DPTRMOVCA,A+PC查表指令一般用于代码转换、显示、散转等应用场合。,当用DPTR作基址寄存器时,查表的步骤分三步:基址值(表格首地址)DPTR;变址值(表中要查的项与表格首地址之间的间隔字节数)A;执行MOVCA,A+DPTR。,当用PC作基址寄存器时,其表格首地址与PC值间距不能超过256字节,且编程要事先计算好偏移量,比较麻烦。因此,一般情况下用DPTR作基址寄存器。,例:在单片机应用系统中,常用LED数码管显示数码,但显示数字(9)与显示数字编码并不相同,需要将显示数字转换为显示字段码,通常是用查表的方法。现要求将30H中的显示数字转换为显示字段码并存入30H。已知共阴字段码表首址为TABD。,程序如下:CHAG:MOVDPTR,#TABD;置共阴字段码表首址MOVA,30H;读显示数字MOVCA,A+DPTR;查表,转换为显示字段码MOV30H,A;存显示字段码RET;TABD:DB3FH,06H,5BH,4FH,66H;04共阴字段码表DB6DH,7DH,07H,7FH,6FH;59共阴字段码表,程序如下:CUBE:MOVDPTR,#TAB;置立方表首址MOVA,30H;读数据ADDA,30H;数据2AMOV30H,A;暂存立方表数据序号MOVCA,A+DPTR;读立方数据高8位XCHA,30H;存立方数据高8位,立方表数据序号AINCA;指向立方数据低8位MOVCA,A+DPTR;读立方数据低8位MOV31H,A;存立方数据低8位RET;TAB:DW0,1,8,27,64,125,216,343,512,729,1000;040立方表DW1331,1728,2197,2744,3375,4096,64000;说明:数据2A原因是立方表数据为双字节,例:用查表程序求040之间整数的立方。已知该整数存在内RAM30H中,查得立方数存内RAM30H(高8位)31H。已知立方表(双字节)首地址为TAB。,4.5子程序与运算程序设计,4.5.1子程序设计回顾子程序的作用、结构、以及与主程序的关系。汇编程序设计中子程序调用方法、程序要求。设计子程序时注意:1、子程序的第一条指令的地址为入口地址。一般使用标号代替,该标号也叫做子程序名。2、子程序中必须使用RET指令。3、主程序调用子程序、子程序返回主程序时的操作。4、在子程序中注意保护CPU的状态。5、子程序入口参数的传送可以使用:指定RAM单元、R0R7寄存器、堆栈、位地址等来传送。,子程序设计一子程序入口用标号作为子程序名。二调用子程序之前设置好堆栈。三用返回指令RET结束子程序,并保证堆栈栈顶为调用程序的返回地址。四.子程序嵌套须考虑堆栈容量。五.提供足够的调用信息:如:子程序名、子程序功能、入口参数和出口参数、子程序占用的硬件资源、子程序中调用的其他子程序名。,子程序:能完成某项特定功能的独立程序段,可被反复调用。,子程序的类型:按子程序与主程序之间传递参数的方式分类。,入口参数:调用子程序之前,需要传给子程序的参数。出口参数:子程序送回调用程序的结果参数。,选用不同的参数传递方式。1.寄存器传送参数2.存储器传送参数3.堆栈传送参数,设计子程序应满足通用性的要求,不针对具体数据编程。例如:1.子程序功能为求单字节数的立方:AA3,入口参数和出口参数为A。2.子程序功能为求单字节数的n次方:(41H)(42H)(40H)A,入口参数为(40H)和A,出口参数为(42H)(41H)。,例:将R4R5R6中三个字节数据对半分解,变成6个字节,存入显示缓冲区(DISMEM0DISMEM5)。,1)子程序UFOR1的功能:将A累加器中单字节数据,对半分解成两个字节,存入R0所指向的相邻两个单元UFOR1:MOVR0,#0XCHDA,R0;保存低半字节INCR0;修改指针MOVR0,#0SWAPAXCHDA,R0;保存高半字节RET2)调用子程序UFOR1之前,将待分解的内容送A,存放地址送R0。,Org0000h;主程序起始地址,pc指针复位为0000hLjmpstart;跳过中断源Org0030h;最后中断在23hStart:movsp,#60h;设置堆栈栈底movr0,#33h;假设DISMEM0DISMEM5从内部ram的33h开始movr4,30h;假设要转换的内容在内部ram的30h开始movr5,31hmovr6,32hmova,r4;取要转换的第一个数lcalluf0r1;调用转换子程序mova,r5lcalluf0r1,mova,r6lcalluf0r1endorg2000hUFOR1:MOVR0,#0XCHDA,R0;保存低半字节INCR0;修改指针MOVR0,#0SWAPAXCHDA,R0;保存高半字节RET,例比较两个数据串是否完全相等,若完全相等,A=0;否则A=FFH。,PMT:MOVR2,A;设数串长度CHC:MOVA,R0;各取数串中的一个数MOV42H,R1CJNEA,42H,NOM;是否相等?不相等转移INCR0;相等,修改指针INCR1DJNZR2,CHC;全部比较完?MOVA,#0;完全相等SJMPPENDNOM:MOVA,#0FFH;不完全相等PEND:RET,例:查表求出数据的ASCII码,再以字符形式输出。,1)子程序HEXASC功能:取出堆栈中数据,查表将低半字节转换成ASCII码送累加器A。2)分别将待转换数据入栈,然后调用子程序HEXASC。,MOVSP,#30HPUSH40H;入口参数入栈LCALLHEXASCPOPACCHEXASC:DECSP;跳过返回地址DECSPPOPACC;取入口参数;查表求ASCII码PUSHACC;保存出口参数INCSP;指向返回地址INCSPRETDB0,1,;ASCII码表,4.5子程序与运

温馨提示

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

评论

0/150

提交评论