第4章汇编语言程序设计基础编写汇编语言程序的步骤1.确定控制流程,划分程序模块,画出程序框图;2.为程序模块分配数据存储单元,确定与其它模块交换、共享数据的存储单元;设计算法;3.逐模块编写并调试程序;4.全部模块脱机联调、修改,最后进入实际工作状态调试。4.1常用伪指令1.设置起始地址ORG(Origin)指令格式:ORGnn•nn通常为16位地址值,•也可以是已定义的标号。2.汇编结束伪指令END指令格式:END•该指令的功能是结束汇编。•汇编程序遇到END伪指令后即结束汇编。•处于END之后的程序,汇编程序将不作处理。3.字节数据定义伪指令DB(DefineByte)指令格式:[标号:]DB字节数据表•从某地址单元开始,在程序存储器中定义数据字节。•该指令将字节数据表中的数据根据从左到右的顺序依次存放在指定的存储单元中。一个数据占一个存储单元。•标号用于查表时确定表首址。•一条DB语句定义的数据字节个数没有限制,书写阅读方便即可,若字节太多,也可以分作几行。4.字数据定义伪指令DW指令格式:[标号:]DW字数据表•从某一地址单元开始,在程序存储器中定义数据字。•该伪指令将字或字表中的数据根据从左到右的顺序依次存放在指定的存储单元中。应特别注意:16位的二进制数,高8位存放在低地址单元,低8位存放在高地址单元。•和DB语句类似,标号用于查表时确定表首址,一条DW语句可以定义若干个数据字,若要定义的字太多,最好分作几条DW语句。5.赋值伪指令EQU指令格式:符号名EQU表达式•功能是将表达式的值或特定的某个汇编符号定义为一个指定的符号名。6.位地址符号定义伪指令BIT指令格式:符号名BIT位地址表达式•功能是将位地址赋给指定的符号名。•位地址表达式可以是绝对地址,也可以是符号地址。•这条伪指令的功能和作用与EQU伪指令相似,只是它针对位地址。4.2汇编语言程序基本结构1.顺序结构•顺序结构是最简单、最基本的程序结构,是指无分支、无循环结构的程序。•其执行流程是依指令在存储器中的存放顺序进行的,或者说程序完全按照指令的编排顺序执行。例:内部数据传输MOVA,2EHMOV2EH,2DHMOV2DH,2CHMOV2CH,2BHMOV2BH,2AH78H56H34H12H00H2EH2DH2CH2BH2AHACC78H56H34H12H00H2EH2DH2CH2BH2AHACC00H78H56H34H12H00H2EH2DH2CH2BH2AHACC78H56H34H12H00H2EH2DH2CH2BH2AHACC00H2.分支结构•分支程序结构可根据程序的要求,无条件或有条件地改变程序执行的顺序•根据分支的不同处理情况,又可分为单分支结构、双分支结构和多分支结构条件成立?下条指令程序段AYN条件成立?程序段AYN程序段BK=0?分支0YK=1?Y分支1K=2?Y分支2NNN条件成立?下条指令程序段AYN条件成立?程序段AYN程序段BK=0?分支0YK=1?Y分支1K=2?Y分支2NNN条件成立?下条指令程序段AYN条件成立?程序段AYN程序段BK=0?分支0YK=1?Y分支1K=2?Y分支2NNNa.单分支b.双分支c.多分支例:编程实现将DPTR内容减一DECDPLCJNEDPL,0FFH,NEXTDECDPHNEXT:┆(DPL)-1→(DPL)(DPL)=FFH?(DPH)-1→(DPH)例4-3某测温系统测得温度值存于片内数据存储器30H单元,若温度高于60℃亮红灯,否则亮绿灯。红灯由P1.0控制,绿灯由P1.1控制,高电平亮,低电平灭。(30H)-60够减?P1.0输出“1”P1.1输出“0”P1.0输出“0”P1.1输出“1”N3.循环结构•按某种控制规律重复执行的程序称为循环程序。•循环程序有先判断后执行和先执行后判断两种基本结构:第一种方法先判断是否满足循环条件,如不满足,就不循环,多以循环条件控制。第二种方法先执行一遍循环后,再判断下一轮还需不需要进行,多以循环次数控制。•循环可以有单重循环和多重循环,在多重循环中,内外循环一般不能交叉,也不能从外循环跳入内循环,否则逻辑将十分复杂。例4-5设计一个延时10ms的延时子程序,已知单片机使用的晶振为6MHz。延时时间与晶振频率和循环次数两个因素有关。由于晶振采用6MHz,一个机器周期是2μs,可以采用双重循环实现10ms延时:用内循环实现1ms延时,外循环10次即可达10ms延时。ORG1000HMOVR0,#0AH;外循环10次DEL2:MOVR1,#7DH;内循环125次DEL1:NOPNOP;空操作指令,延时2μsDJNZR1,DEL1DJNZR0,DEL2RET•内循环时间:(1+1+2)×2μs×7DH=1000μs•总的延时时间:{1+[1+(1+1+2)×125+2]×10}×2μS=10062μs=10.062ms4.子程序•对于在不同地方要多次使用相同程序段,可以将其设计成通用的子程序供主程序反复调用。•子程序节省存储单元,使程序简短、清晰。•但子程序要增加额外的调用和返回指令,多数情况下还要进行现场保护和恢复,因此程序执行的时间会略有增加。•时间和空间总是矛盾的4.3编程举例例4-7:将两个半字节数合并为一个一字节数。将内部数据存储器ADDR、ADDR+1单元中数据的低半字节合并成一个字节,合并后ADDR单元低半字节作高半字节,结果存入RESU单元。START:MOVR1,#ADDRMOVA,@R1;取第1个数ANLA,#0FH;只保留低半字节SWAPA;存入A高半字节INCR1XCHDA,@R1;第2个数与A进行低半字节交换MOVRESU,ARETEND例4-8:用片内数据存储器30H单元数据的低3位、31H单元的中间2位和32H单元的高3位组合成一个新数据,结果存于33H单元。MOV33H,30HANL33H,#00000111B;保留30H低3位MOVA,31HANLA,#00011000B;保留31H.中间2位ORL33H,AMOVA,32HANLA,#11100000B;保留32H高3位ORL33H,ARETEND例4-10:多字节无符号数加法设两个N字节的无符号数分别存放在内部数据存储器中以DATA1和DATA2开始的单元中,低位在前。相加后的结果要求存放在DATA2数据区。MOVR0,#DATA1MOVR1,#DATA2;置两加数指针MOVR7,#N;字节数CLRCLOOP:MOVA,@R0ADDCA,@R1;求和MOV@R1,A;存结果INCR0;修改指针INCR1DJNZR7,LOOPRETEND