汇编语言程序的基本结构

上传人:卡****v 文档编号:179004986 上传时间:2021-04-06 格式:PPTX 页数:47 大小:379.64KB
返回 下载 相关 举报
汇编语言程序的基本结构_第1页
第1页 / 共47页
汇编语言程序的基本结构_第2页
第2页 / 共47页
汇编语言程序的基本结构_第3页
第3页 / 共47页
汇编语言程序的基本结构_第4页
第4页 / 共47页
汇编语言程序的基本结构_第5页
第5页 / 共47页
点击查看更多>>
资源描述

《汇编语言程序的基本结构》由会员分享,可在线阅读,更多相关《汇编语言程序的基本结构(47页珍藏版)》请在金锄头文库上搜索。

1、汇编语言程序的基本结构,汇编语言源程序设计通常采用结构化设计方法, 任何复杂的程序都可分解为: 顺序结构部分 分支结构部分 循环结构部分 子程序部分,3.5.1 顺序程序设计,例】【功能】求变量X()的平方。 【入口参数】X值存放在片内RAM的30H单元 【出口参数】X2值存放在片内RAM的31H单元 程序框图如图3.10所示。 ORG1000H START:MOVDPTR,#2000H MOV A,30H MOVC A,A+DPTR MOV 31H,A SJMP$ ORG2000H TABLE:DB00,01,04,09,16,25 END 特点:从第一条指令开始顺序执行,直到最后一条指令,

2、图3.10 顺序程序流程图,3.5.2 分支程序设计,分支:根据某种标志改变程序执行的顺序。 一般分为单分支、多分支。 分支流程图如图3.11所示,a) 单分支(b)多分支 图3.11 分支程序流程图,3.5.2 分支程序设计,1. 单分支 【例】 【功能】某装置有自动/手动控制按键,按键状态由P1.0口输入;高电平为自动控制,低电平为手动控制 【入口参数】P1.0 CY: JB P1.0,AUTO HC: LJMP CY AUTO: LJMP CY,3.5.2 分支程序设计,2. 多分支 包括一般多分支和散转多分支。 1) 一般多分支 【例】 【功能】x、y均为8位二进制数,求解: 【入口参

3、数】(R0)=x。 【出口参数】(R1)=y,3.5.2 分支程序设计,START: CJNER0, #00H, SUL1 ;判断R0是否为0,为0转SUL1 MOV R1,#00H SJMPSUL2 SUL1:JC NEG ;小于0转NEG MOVR1, #01H SJMPSUL2 NEG :MOV R1, #0FFH SUL2: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;子程序入口首地址送DPTR MOV A, R3;把键盘输入缓冲区内容送累加器(A) DEC A;由于输入数码为19,因此需减1 MOV B, #03H,3.5.2 分支程序设计,MUL AB ;由于长跳

5、转指令LJMP占用3B, ;各子程序入口地址相距3B JMP A+DPTR ;根据输入码,执行相应的子程序 ORG 2000H ;程序入口地址表 TAB1: LJMP NO1 LJMP NO2 LJMP NO3 LJMP NO4 LJMP NO5 LJMP NO6 LJMP NO7 LJMP NO8 LJMP NO9 END,3.5.2 分支程序设计,2) 利用转向地址表实现转移 这种方法将转移地址列成表格,将表格的内容作为转移的目标地址。 【例】 【功能】根据R3(0n)的内容转向对应的程序;处理程序的入口符号地址分别为PR0PRn(n256) 【分析】 将PR0 PRn入口地址列在表格中,

6、每一项占两个单元; PRn在表中的偏移量为2n,因此将R3的内容乘“2”即得PRn在表中的偏移地址; 从偏移地址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)256,3.5.2 分

7、支程序设计,NADD: MOV R3,A MOVC A, A+DPTR XCHA, R3 ;转移地址高8位 INCA MOVCA, A+DPTR MOVDPL,A;转移地址低8位 MOVDPH, R3 CLRA JMPA+DPTR TAB: DW PR0,PR1,PR2, PRn PR0:处理程序0 PR1:处理程序1 PRn:处理程序n END,3.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 MOVCA,A+DPTR JMPA+DPTR TAB:DBPR0-TAB DBPR1-TAB DBPR2-TAB DBPR3-TAB DBPR4-TAB PR0:处理程序0 PR1:处理程序1 PR2:处理程序2 PR3:处理程序3 PR4:处理程序4 END,3.5.3 循环程序设计,需要重复执行某一程序时可使用循环程序结

9、构。 循环程序分为先循环后判断和先判断后循环两种循环体方式。 循环程序一般包含以下4部分。 (1) 设置循环初值:设置用于循环过程工作寄存器单元的初值。 (2) 循环体:循环程序功能部分。 (3) 循环记录:记录循环过程,监控循环完成情况,为循环判断准备。 (4) 循环控制:判断循环完成情况,满足条件作相应的处理。不满足继续执行,3.5.3 循环程序设计,图3.12 循环程序流程图,3.5.3 循环程序设计,例】 【功能】n个单字节数相加,和为双字节,存放在(R3、R4)中。 【入口参数】单字节数Xi存放在从40H开始的RAM单元中,n放在R2中。(R2作为控制变量,R0作为变址单元 ) 【出

10、口参数】和存放在(R3、R4)中。 ADD1: MOV R3, #00H MOV R4, #00H MOV R2, #n MOV R0, #40H LOOP: MOV A, R4;取部分和低位 ADD A, R0;与Xi相加 MOV R4, A INC R0;地址加1 CLR A ADDC A, R3;低位字节向高位字节进位 MOV R3, A DJNZ R2, LOOP;未加完继续重复,3.5.3 循环程序设计,例】 【功能】设计一个延时10ms的程序。 【分析】延时程序的延时主要与所用晶振和延时程序中的循环次数 有关。已知AT89C51单片机使用的晶振为12MHz,则可知一个机器周期为1。

11、 【入口参数】(R0)=毫秒数,(R1)=1ms延时预定值。 【出口参数】定时到,退出程序。 ORG2000H 指令机器周期数 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延时循环 2,3.5.3 循环程序设计,该延时程序是一个双重循环程序,内循环1ms延时的预定值MT需计算: (1+1+2)1MT=1000() MT=250=0FAH 用0FAH代替程序中的MT,则该程序执行后,能实现10ms的延时。

12、若考虑第1、2、6行延时参数配置指令的时间因素,则该段延时程序的精确延时时间计算式为: 11+(1+2)110+(1+1+2)125010=10.031ms,3.5.4 子程序设计,按功能分为中断子程序和功能子程序。 调用子程序时要注意: (1)中断子程序调用由单片机自身产生,执行RETI指令 返回;功能子程序调用由主程序执行LCALL或ACALL 指令产生,执行RET指令返回。 (2)在子程序中,应包含有现场保护和现场恢复两部分。 (3)主程序和子程序约定好交换数据的地址单元或存储 器,其为主、子程序共有部分。 (4)子程序可以对另外的子程序调用,称为子程序嵌套,3.5.4 子程序设计,1.

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;循环判断 RET,3.5.4 子程序设计

14、,例】 【功能】多字节无符号数的减法。 【入口参数】DATA1=被减数的低位地址, DATA2=减数的低位地址,N字节相减。 【出口参数】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;循环判断 RET,3.5.4 子程序设计,例】 【功能】双字节无符号数的乘法。 【分析】8051指令系统中只有单字节乘法指令,

15、因此,双字节相乘需分解为4次单字节相乘。设双字节的无符号被乘数存放在R3、R2中,乘数存放在R5、R4中,R0指向积的高位。 【入口参数】R3(高)R2(低),被乘数; R5(高)R4(低),乘数。 【出口参数】(R0)积的高位字节地址指针,3.5.4 子程序设计,图3.13 双字节无符号乘法算法与流程图,3.5.4 子程序设计,MULTB: MOV R7, #04;结果单元清0 LOOP : MOV R0,#00H DJNZ R7,LOOP MOV A, R2 ;取被乘数低位字节 MOV B, R4 ;取乘数低位字节R4 MUL AB;R4R2 ACALLRADD;调用乘积相加子程序 MOV

16、 A, R2 ;取被乘数低位字节 R2 MOV B, R5 ;取乘数高位字节R5 MULAB;R5R2 DECR0 ;积字节指针减1 ACALLRADD ;调用乘积相加子程序 MOVA,R4 MOVB,R3 MULAB;R4R3 DECR0 DECR0 ACALLRADD MOV A,R5,3.5.4 子程序设计,MOVB,R3 MULAB;R5R3 DECR0 ACALLRADD DECR0 RET RADD:ADDA,R0;累加子程序 MOV R0,A MOVA,B INCR0 ADDCA,R0 MOVR0,A INCR0 MOVA,R0 ADDCA,#00H;加进位 MOVR0,A RET,3.5.4 子程序设计,2. 码型转换程序 单片机能识别和处理的是二进制码,而输入/输出设备(如LED显示器、微型打印机等)则常使用ASCII码或BCD码。为此,在单片机应用系统中经常需要通过程序进行二进制码与BCD码或ASCII码的相互转换,3.5.4 子程序设计,例】 【功能】将1位十六进制数(即4位二进制数)转换成相应的ASCII码。 【分析】由ASCII编码表可知转换方法为: 1位十六

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 教学课件 > 高中课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号