您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 述职报告 > 第四章 51系列单片机汇编语言程序设计
2020/2/161第四章汇编语言程序设计通过前面的学习,我们已经了解了单片机内部的结构,MCS-51指令系统的寻址方式、各类指令的格式及功能。下面我们就是要如何利用MCS-51的指令系统,来编写高效、充分利用其特点的程序。2020/2/162§4.1汇编语言的语句格式补充知识1:程序设计语言1.机器语言2.汇编语言3.高级语言2020/2/163补充知识2:编制程序的步骤1.任务分析(硬件、软件系统分析)2.确定算法和工作步骤;3.程序总体设计和流程图绘制关于流程图符号:开始、结束----圆角矩形工作任务----矩形判断分支----菱形程序流向----程序连接----开始结束2020/2/1644.分配内存,确定程序与数据区存放地址;5.编写源程序;6.调试、修改,最终确定程序。2020/2/165补充知识3:方法技巧1.模块化设计(按功能分:显示、打印、输入、发送等)2.尽量采用循环及子程序结构(节省内存)2020/2/166补充知识4.汇编语言程序设计中的数计算机只能识别二进制数——机器指令,它原本是不认识常用的十六进制数和十进制数的。机器指令/目标代码:由0/1代码组成的操作码与操作数。十六进制数:便于读写记忆的二进制数的简写形式。(0~9,A~F后缀:H/h)BCD码:用二进制数表达的十进制数。(0~9表示为:0000~1001B后缀:B/b,H/h)二进制数:由0/1组成、“逢2进1”的数制。如:01011110B(0~1后缀:B/b)2020/2/1671.汇编语言的语句格式标号:操作码目的操作数,源操作数;注释标号与操作码之间“:”隔开操作码与操作数之间用“空格”隔开目的操作数和源源操作数之间有“,”分隔操作数与注释之间用“;”隔开2020/2/168标号是由用户定义的符号组成,必须用英文大写字母开始。标号可有可无,若一条指令中有标号,标号代表该指令所存放的第一个字节存储单元的地址,故标号又称为符号地址,在汇编时,把该地址赋值给标号。1.标号有关标号的规定如下:a.标号是由1~8个ASCII字符组成,但第一个字符必须是字母,其余字符可以是字母、数字或其它特定字符。b.不能使用本汇编语言已经定义了的符号作为标号,如指令助记字符、伪指令记忆符以及寄存器的符号名等。c.标号后面必须跟以(:)号。d.同一个标号在一个程序中只能定义一次,不能重复定义。e.一条语句可以有标号,也可以无标号,标号的有无取决于本程序中的其它语句是否要访问这条语句。2020/2/1692.操作码操作码用以规定语句执行的操作内容,操作码是以指令助记符表示的,操作码是汇编指令格式中唯一不能空缺的部分操作数用以给指令的操作提供数据或地址。在一条语句中,操作数可以是空白,也可能只包括一项,还可能包括两项、三项,各操作数之间以逗号分隔。注释不属于语句的功能部分,它只是对语句的解释说明,只要以“;”开头,即表明以下为注释。使用注释可以帮助程序员阅读程序,简化程序的维护。注释的长度不限,一行不够时可以换行接着书写,但换行时必须在开头使用“;”号。3.操作数4.注释2020/2/16105.分界符分界符用以把语句格式中的各部分隔开,以便于区分,包括空格、冒号、分号或逗号等。这些分界符在MCS-51中的使用情况如下示:冒号(:)用于标号之后。空格()用于操作码和操作数之间。逗号(,)用于操作数之间。分号(;)用于注释之前。2020/2/16114.2汇编语言的伪指令2020/2/1612汇编语言程序的机器汇编是由机器自动完成的,为此在源程序中应有向汇编程序发出指示的信息,告诉它应如何完成汇编工作。这一任务是通过伪指令来实现的。伪指令具有控制汇编程序的输入/输出、定义数据和符号、条件汇编、分配存贮空间等功能。只有在汇编前的源程序才有伪指令,汇编得到的目标程序后,伪指令已无存在的必要。伪指令没有相应的机器代码。汇编语言源程序由以下两种指令构成:汇编语句(指令语句)伪指令(指示性语句)2020/2/1613MCS-51汇编语言程序中常用的伪指令:1.ORG---定位伪指令格式:[标号:]ORG地址表达式功能:规定程序块或数据块存放的起始位置。说明:其中“[标号:]”是选择项,根据需要选择;“地址表达式”项,通常为16位绝对地址,但也可以使用标号或表达式表示。在汇编语言程序的开始,通常使用一条ORG伪指令来规定程序的起始地址。若不使用ORG伪指令,则汇编得到的目标程序将从0000H开始。例如:ORG8000HSTART:MOVA,#00H┇即规定标号START代表地址8000H,目标程序的第一条指令从8000H开始存放。2020/2/16142.END----汇编结束伪指令格式:[标号:]END[表达式]功能:汇编语言源程序结束标志,用于整个汇编语言程序的末尾处。说明:整个源程序中只能有一条END命令,且位于源程序的最后。如果END命令出现在源程序的中间,则其后面的源程序汇编程序将不予处理。只有主程序才有条件表达式项,且表达式的值等于该程序模块的入口地址。2020/2/16153.EQU---赋值伪指令格式:字符名EQU数值或汇编符号表达式功能:用于给标号赋值,只能赋值一次,且遵循先定义后使用的原则。赋值以后其标号值在整个程序中有效。说明:其中赋值项是常数、地址、标号或表达式。其值为8位或者16位二进制数。赋值后的字符名即可作地址使用,又可以作立即数使用。例:AAEQU30HK1EQU40HMOVA,AA;(30H)→AMOVA,K1;(40H)→A2020/2/16164.DATA---数据赋值伪指令格式:符号名DATA表达式功能:将表达式的值或某个特定汇编符号定义为一个指定的符号名,只能定义单字节数据,但可以先使用后定义,因此用它定义数据可以放在程序末尾进行数据定义。例如:…MOVA,#LEN…LENDATA10尽管LEN的引用在定义之前,但汇编语言系统仍可以知道A的值是0AH。2020/2/16175.DB---定义字节伪指令格式:[标号:]DB8位数表功能:用于从指定的地址开始,在存储器的连续单元中定义字节数据。说明:字节数据可以是一个字节常数或字符,或用逗号分开的字节串,或用引号括起来的字符串ASC。例如:ORG1000HTAB:DB2BH,0A0H,‘A’,2*4;表示从1000H;单元开始的地方存放数据2BH,0A0H,;41H(字母A的ASCII码),08H2020/2/16186.DW---定义字数据伪指令格式:[标号:]DW16位数表功能:从指定的地址开始,在程序存储器的连续单元中定义16位的数据字。存放时,数据字的高8位在前(低地址),低8位在后(高地址)。例如:DW“AA”;存入41H,41HDW“A”;存入00H,41HDW100H,1ACH,-804;存入01H,00H,;01H,0ACH,0FCH,0DCH说明:DB和DW定义的数表不得超过80个。在MCS-51程序设计中常以DB来定义数据,DW来定义地址。2020/2/16197.DS---定义空间伪指令格式:[标号:]DS表达式功能:从指定地址开始,保留指定数目的字节单元作为备用的空间。汇编时,这些单元不赋值。例如:ORG8100HDS08H;从8100H地址开始,保留8;个连续的地址单元。说明:以上DB、DW和DS只能用于程序寄存器,而不能用于数据寄存器。2020/2/16208.BIT---位定义伪指令格式:字符名称BIT位地址功能:给字符名称赋以位地址。说明:其中“位地址”可以是绝对地址,也可以是符号地址。例如:AQBITP1.0;将P1.0的位地址赋给变量;AQ,在以后的程序中AQ就可;当作位地址来使用。2020/2/16219.$——“当前PC值”也叫位置计数器代表正在执行的指令所在位置。2020/2/1622§4.3单片机汇编语言程序设计2020/2/16231.编辑(源程序,以.ASM扩展名存盘);2.汇编(手工或机器汇编);如:教材p50习题9(MOVA,#88H;机器码74,88H)又如:地址目标码源程序ORG1000H1000H747FMOVA,#7FH1002H7944MOVR1,#44HEND由汇编语言编写的程序主要结构:顺序结构分支结构循环结构2020/2/16244.3.1顺序结构程序顺序结构是最简单的程序结构,在顺序结构中即无分支、循环,也无子程序调用,程序执行时是一条条地按顺序执行指令,直到全部指令执行完毕为止。2020/2/1625ORG1000HSTART:MOVDPTR,#TABLEMOVA,20HMOVCA,@A+DPTRMOV21H,ASJMP$ORG2000HTABLE:DB0,1,4,9,16,25END例:变量存在内部RAM的20H单元中,其取值范围:0~5,编成,查表法求其平方值开始表格首地址送DPTR变量送A(20H)A查平方表(A+DPTR)A结束结果送21H单元:A21H2020/2/1626例2:将20H单元的压缩(Packed)BCD码拆成两个ACSII码存入21H、22H单元。内部RAM22H21H20H693639BCD012...9ASCII30H31H32H...39H2020/2/1627方法1(20H)A10HBA/B,A中为高4位BCD码,B中为低4位BCD码B+30HBB(21H)A+30HAA(22H)开始结束2020/2/1628周期数源程序ORG2000HMOVA,20HMOVB,#10HDIVABORLB,#30HMOV21H,BORLA,#30HMOV22H,AEND124221113;除以10H;高4位BCD码转换位ASCII码;低4位BCD码转换位ASCII码2020/2/16290(21H)(20H)AA与(21H)的低4位交换(21H)+30H(21H)A的高低半字节交换A+30HAA(22H)开始结束方法2:2020/2/1630ORG2000HMOVR0,#21HMOV@R0,#0MOVA,20HXCHDA,@R0ORL21H,#30HSWAPAORLA,#30HMOV22H,AEND;清21H单元;低4位BCD码送21H单元,;低4位BCD码转换位ASCII码;高4位BCD码转换位ASCII码111121119周期数源程序21H的访问采用寄存器间接的方式,是为了适应SWAPA,@R0命令的源操作数不能直接寻址。2020/2/16314.3.2分支程序分支程序可根据要求无条件或条件地改变程序执行流向。编写分支程序主要在于正确使用转移指令。分支程序有:单分支结构、双分支结构、多分支结构(散转)条件成立?下条指令程序段A单分支结构YN条件成立?程序段AYN程序段A双分支结构2020/2/16324.3.2分支程序分支程序可根据要求无条件或条件地改变程序执行流向。编写分支程序主要在于正确使用转移指令。分支程序有:单分支结构、双分支结构、多分支结构(散转)K=?程序段nn0程序段1多分支结构程序段012020/2/16331.单分支结构程序单分支程序使用条件转移指令实现,即根据条件对程序的执行进行判断,满足条件则进行程序转移,否则程序顺序执行。可实现单分支程序转移的指令有JZ、JNZ、CJNE和DJNZ等。此外还有以位状态作为条件进行程序分支转移的指令有JC、JNC、JB、JNB、JBC等。使用这些指令可以完成为“0”、为“1”、、为正、为负及相等、不相等等各种条件判断。2020/2/1634[例4.3]两个无符号数比较。内部RAM的20H单元和30H单元各存放了一个8位无符号数,请比较这两个数的大小,比较结果显示在实验板上:(给高电平实验板上发光二极管亮)若(20H)≥(30H),则P1.0管脚连接的LED发光;若(20H)(30H),则P1.1管脚连接的LED发光。(1)题意分析本题是典型的分支程序,根据两个无符号数的比较结果(判断条件),程序可以选择两个流向之中的某一个,分别点亮相应的LED。比较两个无符号数常用的方法是将两个数相减,然后判断有否借位C
本文标题:第四章 51系列单片机汇编语言程序设计
链接地址:https://www.777doc.com/doc-3793640 .html