《0102单片机原理与应用技术汇编语言程序的基本结构》由会员分享,可在线阅读,更多相关《0102单片机原理与应用技术汇编语言程序的基本结构(46页珍藏版)》请在金锄头文库上搜索。
1、3.5 汇编语言程序的基本结构v汇编语言源程序设计通常采用结构化设计方法,任何复杂的程序都可分解为:顺序结构部分分支结构部分循环结构部分子程序部分3.5.1 顺序程序设计 【例】【功能】求变量X()的平方。 【入口参数】X值存放在片内RAM的30H单元 【出口参数】X2值存放在片内RAM的31H单元程序框图如图3.10所示。ORG1000H START:MOV DPTR,#2000HMOV A,30HMOVC A,A+DPTR MOV 31H,ASJMP$ORG2000H TABLE:DB00,01,04,09,16,25END 特点:从第一条指令开始顺序执行,直到最后一条指 令 图3.10
2、顺序程序流程图3.5.2 分支程序设计v分支:根据某种标志改变程序执行的顺序。v一般分为单分支、多分支。v分支流程图如图3.11所示。(a) 单分支 (b)多分支 图3.11 分支程序流程图3.5.2 分支程序设计v1. 单分支v【例】v【功能】某装置有自动/手动控制按键,按键状态由P1.0口输 入;高电平为自动控制,低电平为手动控制v【入口参数】P1.0vCY:v JB P1.0,AUTOvHC:v v LJMP CYvAUTO:v v LJMP CY3.5.2 分支程序设计v2. 多分支包括一般多分支和散转多分支。1) 一般多分支【例】【功能】x、y均为8位二进制数,求解:【入口参数】(R
3、0)=x。【出口参数】(R1)=y。3.5.2 分支程序设计START: CJNE R0, #00H, SUL1;判断R0是否为0,为0转SUL1MOV R1, #00HSJMP SUL2SUL1:JC NEG ;小于0转NEGMOV R1, #01HSJMP SUL2NEG :MOV R1, #0FFHSUL2:RET 3.5.2 分支程序设计2) 散转多分支程序根据某种输入或运算的结果转向各个处理程序称 为散转多分支,即散转程序。 (1) 利用转移指令表实现转移将转移到不同程序的转移指令列成表格,判断条件后 查表,执行表中的转移指令。 【例】 【功能】某菜单有9项。根据输入数码转去执行相应
4、的 子程序。即输入“1”,执行子程序1;输入“2”,执行 子程序2;依次类推。3.5.2 分支程序设计【分析】用直接转移指令组成一个转移表,然后把菜单 号读入累加器(A),转移表首地址放入DPTR中,利用 JMP A+DPTR实现散转。 【入口参数】(R3)=存输入键盘码19。 【出口参数】转移到相应的子程序入口。ORG 0030H KEY_JMP:MOV DPTR, #TAB1;子程序入口首地址送DPTRMOV A, R3;把键盘输入缓冲区内容送累加器 (A)DEC A;由于输入数码为19,因此需减1MOV B, #03H3.5.2 分支程序设计MUL AB ;由于长跳转指令LJMP占 用3
5、B, ;各子程序入口地址相距3BJMP A+DPTR ;根据输入码,执行相应的子程 序ORG 2000H ;程序入口地址表 TAB1: LJMP NO1LJMP NO2LJMP NO3LJMP NO4LJMP NO5LJMP NO6LJMP NO7LJMP NO8LJMP NO9END3.5.2 分支程序设计(2) 利用转向地址表实现转移这种方法将转移地址列成表格,将表格的内容作为转移的目 标地址。 【例】 【功能】根据R3(0n)的内容转向对应的程序;处理程序的入 口符号地址分别为PR0PRn(n256) 【分析】v将PR0 PRn入口地址列在表格中,每一项占两个单元;vPRn在表中的偏移量
6、为2n,因此将R3的内容乘“2”即得PRn在 表中的偏移地址;v从偏移地址2n和2n+1两个单元分别取出PRn的高8位地址和 低8位地址送DPTR寄存器,用JMP A+DPTR指令(A先清零 )即转移到PRn入口执行。3.5.2 分支程序设计【入口参数】(R3)=0n 转移。 【出口参数】转移到相应的子程序入口。 PR0EQU0110H PR1EQU0220H PR2EQU0330H ORG0030H KEY_JMP:MOVDPTR, #TAB MOVA,R3 ADDA,R3;(A)(R3)*2 JNCNADD INCDPH;(R3*2)2563.5.2 分支程序设计NADD: MOV R3,
7、AMOVC A, A+DPTRXCH A, R3 ;转移地址高8位INCAMOVCA, A+DPTRMOV DPL,A;转移地址低8位MOV DPH, R3CLR AJMP A+DPTRTAB: DW PR0,PR1,PR2, PRnPR0:处理程序0PR1:处理程序1PRn:处理程序nEND3.5.2 分支程序设计(3) 利用地址偏移量表实现散转这种方法将转移目标地址与表首地址差列表,作为 转移目标地址。 【例】 【功能】有5个按键 0,1,2,3,4,根据按下的 键转向不同的处理程序,分别为PR0,PR1,PR2 ,PR3,PR4。 【分析】汇编时,利用了伪指令的数学计算功能,标 首地址加
8、上处理程序与标首地址差转到处理程序。 【入口参数】(B)=转向程序号(键盘编码)。 【出口参数】转移到相应的子程序入口。3.5.2 分支程序设计ORG0030H KEY_JMP:MOVA, B MOVDPTR, #TAB MOVC A,A+DPTR JMPA+DPTRTAB:DBPR0-TAB DBPR1-TAB DBPR2-TAB DBPR3-TAB DBPR4-TABPR0:处理程序0PR1:处理程序1PR2:处理程序2PR3:处理程序3PR4:处理程序4 END3.5.3 循环程序设计u需要重复执行某一程序时可使用循环程序结构。u循环程序分为先循环后判断和先判断后循环两种循 环体方式。u
9、循环程序一般包含以下4部分。(1) 设置循环初值:设置用于循环过程工作寄存器单 元的初值。(2) 循环体:循环程序功能部分。(3) 循环记录:记录循环过程,监控循环完成情况, 为循环判断准备。(4) 循环控制:判断循环完成情况,满足条件作相应 的处理。不满足继续执行。3.5.3 循环程序设计图3.12 循环程序流程图3.5.3 循环程序设计【例】 【功能】n个单字节数相加,和为双字节,存放在(R3、R4)中。 【入口参数】单字节数Xi存放在从40H开始的RAM单元中,n放 在R2中。(R2作为控制变量,R0作为变址单元 ) 【出口参数】和存放在(R3、R4)中。ADD1: MOV R3, #0
10、0HMOV R4, #00HMOV R2, #nMOV R0, #40HLOOP: MOV A, R4;取部分和低位ADD A, R0 ;与Xi相加MOV R4, AINC R0;地址加1CLR AADDC A, R3;低位字节向高位字节进位MOV R3, ADJNZ R2, LOOP;未加完继续重复 3.5.3 循环程序设计【例】 【功能】设计一个延时10ms的程序。 【分析】延时程序的延时主要与所用晶振和延时程序中的循环次 数 有关。已知AT89C51单片机使用的晶振为12MHz, 则可知一个机器周期为1。 【入口参数】(R0)=毫秒数,(R1)=1ms延时预定值。 【出口参数】定时到,退
11、出程序。ORG 2000H 指令机器周期数 1MOV R0 , #0AH ;毫秒数R0 1 2DL2:MOV R1 , #MT ;1ms延时值R1 1 3DL1:NOP 1 4NOP 1 5DJNZ R1 , DL1 ;1ms延时循环 2 6DJNZ R0 , DL2 ;10ms延时循环 23.5.3 循环程序设计该延时程序是一个双重循环程序,内循环1ms延时的 预定值MT需计算:(1+1+2)1MT=1000()MT=250=0FAH用0FAH代替程序中的MT,则该程序执行后,能实 现10ms的延时。若考虑第1、2、6行延时参数配置指令的时间因素 ,则该段延时程序的精确延时时间计算式为:11
12、+(1+2)110+(1+1+2)125010=10.031ms3.5.4 子程序设计v按功能分为中断子程序和功能子程序。v调用子程序时要注意:(1)中断子程序调用由单片机自身产生,执行RETI指令返回;功能子程序调用由主程序执行LCALL或 ACALL指令产生,执行RET指令返回。(2)在子程序中,应包含有现场保护和现场恢复两部分 。 (3)主程序和子程序约定好交换数据的地址单元或存储器,其为主、子程序共有部分。(4)子程序可以对另外的子程序调用,称为子程序嵌套 。 3.5.4 子程序设计v1. 运算类子程序 【例】 【功能】多字节无符号数的加法。 【分析】多字节运算一般是按从低字节到高字节
13、的顺序 依次执行的。 【入口参数】DATA1=被加数的低位地址。DATA2=加数的低位地址。N字节相加。 【出口参数】DATA2=和数低位地址。3.5.4 子程序设计MADD: MOV R0,#DATA1;置被加数MOV R1, #DATA2;置加数MOV R7,#N;置字节数CLR C;清进位位 LOOP: MOV A,R0 ADDC A,R1 ;求和MOV R1,A ;存结果INC R0 ;修改指针INC R1 DJNZ R7,LOOP;循环判断RET3.5.4 子程序设计【例】 【功能】多字节无符号数的减法。 【入口参数】DATA1=被减数的低位地址, DATA2=减数的低位地址,N字节
14、相减。 【出口参数】DATA2=差数低位地址。 3.5.4 子程序设计MSUB:MOV R0,#DATA1;置被减数MOV R1,#DATA2;置减数MOV R7,#N;置字节数CLR C ;清进位位 LOOP:MOV A,R0 SUBB A,R1;求差MOV R1,A ;存结果INC R0 ;修改指针INC R1 DJNZ R7,LOOP;循环判断RET3.5.4 子程序设计【例】 【功能】双字节无符号数的乘法。 【分析】8051指令系统中只有单字节乘法指令,因此 ,双字节相乘需分解为4次单字节相乘。设双字节的 无符号被乘数存放在R3、R2中,乘数存放在R5、 R4中,R0指向积的高位。 【入口参数】R3(高)R2(低),被乘数; R5(高)R4(低) ,乘数。 【出口参数】(R0)积的高位字节地址指针。3.5.4 子程序设计图3.13 双字节无符号乘法算法与流程图3.5.4 子程序设计MULTB: MOV R7, #