




已阅读5页,还剩24页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
3.4 汇编语言程序设计,一、汇编语言的特点与语句格式,编程语言:机器语言、汇编语言、高级语言 1、汇编语言特点: 汇编语言程序代码生成效率高,运行速度快; 汇编语言程序的开发难度较大; 汇编语言控制的实时性好; 汇编语言的可移植性较差;,2、汇编语言的语句格式: 标号: 操作码 操作数 ;注释,二、汇编语言程序设计的特点 1、要求程序员要数据、程序空间的分配与使用作出具体的安排; 2、要求开发人员具有较好的硬件知识; 3、汇编语言程序设计的技巧较高,建立数学模型; 确定算法; 绘制流程图; 确定数据结构; 编写源程序; 调试程序。,三、汇编语言程序设计步骤:,四、评价标准:,程序执行时间; 内存占用量; 逻辑性与可读性 可扩展性 可靠性。,五、汇编语言开发过程,3、连接程序 如果汇编语言产生浮动代码(由A51汇编产生的OBJ文件) 则由连接程序形成执行代码。,1、汇编语言源程序 由编辑软件建立,是ASCII文件 符合汇编语言规范 扩展名为ASM或A51,4、调试程序 一般在开发系统下调试。 开发系统:TMSD清华大学计算机工厂。周立功单片机()、Keil软件包。 调试:代码调试,符号调试。,2、汇编程序 将汇编程序翻译成机器码 形成HEX文件,5、固化 由将目标程序转化成HEX格式或二进制映像文件 由编程器固化,嵌入到目标板中,五、汇编语言开发过程,2、语句格式的规定 指令语句(4个字段) 标号: 助记符 操作数 ;注释 伪指令语句(4个字段) 名字 定义符 参数 ;注释,1、语句的三种类型 指令语句:汇编时,一条指令产生一个目标代码; 伪指令语句:服务于汇编语言,汇编时不对应目标代码; 宏指令语句:用来代替源程序中重复使用的程序段汇编时,产生相应的目标码。,六、汇编语言伪指令,1、程序段起始说明:ORG 标号: ORG 16位地址 例: ORG 1000H START: MOV A, #12H 指定程序的起始地址(1000H),如果地址用标号: ORG BEGIN PROG : 则程序起始于浮动地址,2、汇编结束:END 标号: END 位于程序最后,表示汇编结束 子程序中可不使用标号,3、字节数据定义伪指令DB (Define Byte)和DW 例:TAB DB 0, 4, 8, 16, 32 数据存入TAB为起始地址的连 续字节存储单元中 如DB改成DW,则按字存放数据 4、等值伪指令EQU (Equale) : 例:DDR EQU 1020H(不可改),5、保留存储区说明伪指令 例:STA DS 10H 从STA开始保留10H个单元备用 6、位地址符号定义伪指令BIT QIDONG BIT P1.0 FLAG BIT 20H,3.5.1 汇编语言程序的基本结构形式 常采用以下几种基本结构: 顺序结构、分支结构和循环结构,再加上广泛使用的子程序和中断服务子程序。 1顺序结构 2分支结构 程序中含有转移指令, 无条件分支,有条件分支。 有条件分支又分为:单分支结构和多分支结构。 3循环结构 4子程序 5中断服务子程序,3.5 汇编语言实用程序设计,3.5.1 顺序程序设计,(一)数据传送程序设计 例:在代码段中,以CSTR单元开始连续存放一个以NULL (ASCII码0)为结束标志的字符串,将其传送到以STR开始的内部RAM中,试编程。,说明: 1、伪指令DB定义字符串,最后一个字节为标志NULL。 2、由DPTR寻址源串,用MOVC指令取代码段中的数据。 3、R0为目的串指针,寻址内部RAM。,思考题:如何将代码段中的字符串传递到外部RAM中?,程序: STR EQU 30H MCSTR: MOV R0,#STR MOV DPTR,#CSTR MCSTR1:CLR A MOVC A,A+DPTR JZ MCSTR2 MOV R0,A; 内部RAM,INC R0 INC DPTR SJMP MCSTR1 MCSTR2: RET CSTR: DB HELLO,0,顺序程序设计例: 单字节压缩BCD码转二进制码子程序:设两个BCD码d1d0表示的两位十进制数压缩存储在R2中,转换结果存于R2。算法:二进制码=d1*10+d0 BCD2B: ORG 4000H MOV A, R2 ANL A, #0F0H SWAP A MOV B, #0AH MUL AB MOV R3, A MOV A, R2 ANL A, #0FH ADD A, R3 MOV R2, A RET,特点是程序中含有转移指令,转移指令有分为无条件转移和有条件转移,因此分支程序也可分为无条件分支转移程序和有条件分支转移程序。有条件分支转移程序按结构类型来分,又分为单分支转移结构和多分支转移结构。,3.5.2 分支结构,29,单分支指令: JZ、JB、JC、SJMP 寻址范围(rel):-128127B 多分支指令: JMP A+DPTR (256个) DPTR转移程序首地址 CJNE A, direct, rel(共4条),A、 单分支转移结构 仅有两个出口,两者选一。,例 求单字节有符号数的二进制补码。,参考程序: CMPT: JNB Acc.7,RETURN;(A)0,不需转换 MOV C,Acc.7 ;符号位保存 CPL A ;(A)求反,加1 ADD A,#1 ; MOV Acc.7,C ;符号位存A的最高位 RETURN: RET,此外,单分支选择结构还有如图4-4、图4-5等所示的几种形式:,程序的判别部分有两个以上的出口流向,常见的有两种类型。,例:在累加器A中的存放一个07的数据,由该数据控制程序转向转向8个子程序中的一个。,程序清单: START: ANL A,#07H;屏蔽高5位 MOV B, #3 ;LJMP为3字节 MUL AB MOV DPTR,#BRNH JMP A+DPTR BRNH: LJMP PROC1 LJMP PROC2 LJMP PROC3 LJMP PROC4 LJMP PROC5 LJMP PROC6 LJMP PROC7 LJMP PROC8,说明: PROC1PROC8是8个子程序名。,(三)多分支程序设计,多分支程序设计例题: 有符号数X存于内部RAM的DATA单元,Y存于FUNC单元,按以下要求编程实现给Y赋值。绘出程序框图。程序清单: ORG 4000H MOV A, DATA ;取出X送A JZ COMP ;若X=0则转移到COMP JNB ACC.7, POSI ;若X0则转移到POSI MOV A, #0FFH ;若X0时A=1 COM: MOV FUNC, A ;存函数Y值 HERE: SJMP HERH ;结束,3.5.3 循环程序设计,特点是程序中含有可以反复执行的程序段,该程序段通常称为循环体。例如求100个数的累加和,则没有必要连续安排100条加法指令,可以只用一条加法指令并使其循环执行100次。 (1)可大大缩短程序长度(2)使程序所占的内存单元数量少(3)使程序结构紧凑和可读性变好。 一、循环程序的结构(四部分) 1循环初始化 循环初始化程序段用于完成循环前的的准备工作。例如,循环控制计数初值的设置、地址指针的起始地址的设置、为变量预置初值等。 2循环处理 循环程序结构的核心部分,完成实际的处理工作,是需反复循环执行的部分,故又称循环体。这部分程序的内容,取决于实际处理问题的本身。,一、循环程序的结构(四部分),3循环控制 在重复执行循环体的过程中,不断修改循环控制变量,直到符合结束条件,就结束循环程序的执行。循环结束控制方法分为循环计数控制法和条件控制法 4循环结束 这部分是对循环程序执行的结果进行分析、处理和存放。,二、循环结构的控制,图4-8是计数循环控制结构(until 型),图4-9是条件控制结构(do while 型),特点: 循环体至少执行一次; 初始化,设定计数初值等; 循环次数,由计数器决定; 计数器,减1计数,回0结束。,MCS-51的指令系统提供了功能极强的循环控制指令: DJNZ Rn,rel; DJNZ direct,rel;,1计数循环结构(until 型),例:软件延时子程序 DELAY: MOV R2, #data ;指令周期数=1 DELAY1: DJNZ R2, DELAY1;指令周期数=2 RET 延时时间=1(第一条指令周期)+(R2)2(周期数) 延时范围:3513个机器周期,由(R2)决定 影响CPU工作效率 注意:软件延时程序,不允许有中断,否则将严重影响定时的准确性。,计数循环结构程序设计:,嵌套循环:2重以上的循环,内外层分明,且不能交叉 例2、定时程序如下: MOV R5,#TIME1 LOOP2: MOV R4,#TIME2 LOOP1: NOP NOP DJNZ R4,LOOP1 DJNZ R5,LOOP2 RET 该定时程序的执行时间为: T=(1+1+2)*TIME2+1+2)*TIME1+1)*T0 其中 T0为单片机的机器周期,嵌套循环:2重以上的循环,内外层分明,且不能交叉 例1、 50ms延时程序(设系统为12M的晶振) DELAY: MOV R7,#200 DELAY_1 : MOV R6,#123 NOP DELAY_2: DJNZ R6,DELAY_2 DJNZ R7,DELAY_1 RET 计算:【(123*2+1+1)+2】*200=250*200us+1,例 设有一串字符,依次存放在内部RAM从30H单元开始的连续单元中,该字符串以0AH为结束标志,编写测试字符串长度的程序。(同前),2条件控制结构(do while 型),特点:当第一次条件不成立时,循环体一次也不执行,3.5.4 子程序的设计,一、子程序设计原则和应注意的问题 一种能完成某一特定任务的程序段。其资源要为所有调用程序共享。因此,子程序在结构上具有独立性和通用性,在编写子程序时应注意以下问题: 1子程序的首条指令的地址称为子程序入口地址。该指令前必须有标号。 2主程序调用子程序, 两条子程序调用指令: (1)绝对调用指令:ACALL addr11 (2)长调用指令:LCALL addr16 3注意设置堆栈指针和现场保护 4最后一条指令必须是RET指令 5子程序可以嵌套,即子程序可以调用子程序 6在子程序调用时,还要注意参数传递的问题,二、 子程序的基本结构 MAIN: ;MAIN为主程序或调用程序标号 LCALL SUB ;调用子程序SUB ,SUB: PUSH PSW ;现场保护 PUSH ACC ; 子程序处理程序段 POP ACC ;现场恢复 POP PSW ; RET ;最后一条指令必须为RET P87 例7 将HEX单元存放的两个十六进制数分别转换为ASCII码(自己阅读),3.6 程序设计举例,3.6.1 码制转换程序设计,在单片机应用程序的设计中,经常涉及到各种码制的转换问题。在单片机系统内部进行数据计算和存储时,经常采用二进制码,具有运算方便、存储量小的特点。在输入/输出中,按照人的习惯均采用代表十进制数的BCD码(用4位二进制数表示的十进制数)表示。此外,打印机要打印某数字字符,则需要将该数字的二进制码转换为该字符的ASCII码,才能送到打印机去打印。,二进制码到BCD码之间的转换 BCD码有两种形式:一种是1个字节放1位BCD码,它适用于显示或输出,一种是压缩的BCD码,即1个字节放两位BCD码,可以节省存储单元。,二(十六)进制码与ASCII码之间的转换(教材例题),程序段: HASC: ANL A,#0FH ADD A,#90H DA A ;(A)9时起作用 ADDC A,#40H DA A ;(A)=9时起作用 RET,1、十六进制转换成ASCII码 输入:(A)中存放一位十六进制; 出口:(A)返回ASCII值,2、ASCII码转换成十六进制数 输入:(A)中存放ASCII码 输出:(A)中返回十六进制 程序: ATOH: CLR C SUBB A,#30H CJNE A,#10,ATOH1 ATOH1: JC ATOH2 ;(A)9 ATOH2: RET,3.6.1 码制转换程序设计,十六进制数 ASCII BCD差值 09 30H39H 30H AF(大写) 41H46H 31H,ASCII码 十六进制数 差值 09 (039H) 09 30H AF(41H46H) AF 37H,例: 在内部RAM中,BCDU单元开始存放4位压缩BCD码(低位在前),将其化成二进制数存于BINB开始的单元中(低位在前),试编程。,MOV A,BINB;将前一次结果10 MOV B,#10 MUL AB PUSH B ;B位高8位的积 MOV BINB,A ;存低字节积 MOV A,BINB+1 MOV B,#10 MUL AB POP B ;取高8位积 ADD A,B MOV BINB+1,A;送到高位字节 POP ACC;取BCD3 ADD A,BINB MOV BINB,A;存低位字节 CLR A ADDC A,BINB+1;加低字节进位 MOV BINB+1,A;存到高二进制 RET,3、BCD码转换成二进制数,BCDU EQU 30H BINB EQU 32H DTOB: CLR A MOV BINB,A MOV BINB+1,A MOV A,BCDU+1 SWAP A;取BCD3 LCALL MLADD;分支 MOV A,BCDU+1;取BCD2 LCALL MLADD MOV A,BCDU; SWAP A;取BCD1 LCALL MLADD MOV A,BCDU;取BCD0 LCALL MLADD RET MLADD: ANL A,#0FH PUSH ACC,BTOD: CLR A MOV R3,A MOV R4,A MOV R5,A MOV R2,#16 BTOD1: MOV A,BINB ADD A,BINB MOV BINB,A MOV A,BINB+1,ADDC A,BINB+1 MOV BINB+1,A MOV A,R3 ADDC A,R3 DA A MOV R3,A MOV A,R4 ADDC A,R4 DA A MOV R4,A MOV A,R5 ADDC A,R5 DA A MOV R5,A DJNZ R2,BTOD1;R2非零循环 RET,28,4、将二进制转换成压缩BCD码,例:在内部RAM的BINB开始的单元中存放一个16位二进制无符号数,将其化成压缩BCD码,存于R5R3中,试编程。,3.6.2 查表程序设计,查表程序可以实现数据补偿、修正、计算、转换等各种功能,具有程序简单、执行速度快等优点。 查表就是根据自变量x,在表格中寻找y,使y=f(x)。 执行查表指令时,发出读程序存储器选通脉冲/PSEN。 两条查表指令: MOVC A,A+DPTR MOVC A,A+PC,例1 子程序的功能为:根据累加器A中的数x(09之间)查x的平方表y,根据x的值查出相应的平方y。x和y均为单字节数。 地 址 子程序 Y3Y2Y1Y0 ADD A,#01H Y3Y2Y1Y0+2 MOVC A,A+PC Y3Y2Y1Y0+3 RET Y3Y2Y1Y0+4 DB 00H,01H,04H,09H,10H DB 19H,24H,31H,40H,51H 第1条指令 ADD A,#01H 的作用是加上偏移量,可以根据A的内容查出X对应的平方。,例2 在一个以MCS-51为核心的温度控制器中,温度传感器输出的电压与温度为非线性关系,传感器输出的电压已由A/D转换为10位二进制数。根据测得的不同温度下的电压值数据构成一个表,表中放温度值y,x为电压值数据。设测得的电压值x放入R4R3中,根据电压值x,查找对应的温度值y,仍放入R4R3中。本例的x和y均为双字节无符号数。程序如下: (P96 例7) LTB2:MOV DPTR,#TAB2 MOV A,R3 CLR C RLC A MOV R3,A XCH A,R4 RLC A XCH R4,A ADD A,DPL ;(R4R3)+(DPTR)(DPTR),MOV DPL,A MOV A,DPH ADDC A,R4 MOV DPH,A CLR A MOVC A,A+DPTR ;查第一字节 MOV R4,A ;第一字节存入R2中 CLR A INC DPTR MOVC A,A+DPTR ;查第二字节 MOV R3,A ;第二字节存入R3中 RET TAB2:DW ;温度值表,例3 设有一个巡回检测报警装置,需对16路输入进行检测,每路有一最大允许值,为双字节数。运行时,需根据测量的路数,找出每路的最大允许值。看输入值是否大于最大允许值,如大于就报警。根据上述要求,编一个查表程序。 取路数为x(0x15),y为最大允许值,放在表格中。设进入查表程序前,路数x已放于R2中,查表后最大值y放于R3R4中。本例中的x为单字节数,y为双字节数。查表程序如下: TB3: MOV A,R2 ADD A,R2 ;(R2)*2(A) MOV R3,A ;保存指针 ADD A,#6 ;加偏移量 MOVC A,A+PC ;查第一字节 XCH A,R3 ADD A,#3 MOVC A,A+PC ;查第二字节 MOV R4,A RET TAB3: DW 1520,3721,42645,7580 ;最大值表 DW 3483,32657,883,9943 DW 10000,40511,6758,8931 DW 4468,5871,13284,27808,顺序检索和对分检索 一、顺序检索 从第1项开始逐项顺序查找,判断所取数据是否与关键字相等。 例 从50个字节的无序表中查找一个关键字”H。 ORG 4000H MOV 30H,#H;关键字H送30H单元 MOV R1,#50 ;查找次数送R1 MOV A,#14 ;修正值送A MOV DPTR,#TAB4 ;表首地址送DPTR LOOP: PUSH ACC MOVC A, A+PC ;查表结果送A CJNE A,40H,LOOP1;(40H)不等于关键字则转LOOP1 MOV R2,DPH ;已查到关键字,把该字的地址送R2,R3 MOV R3,DPL ; DONE: RET LOOP1: POP ACC ;修正值弹出 INC A ;A+1A INC DPTR ;修改数据指针DPTR DJNZ R1,LOOP ;R10,未查完,继续查找,3.6.3 关键字查找程序设计,MOV R2,#00H ;R1=0,清“0” R2 和R3 MOV R3,#00H ;表中50个数已查完 AJMP DONE ;从子程序返回 TAB4:DB , ;50个无序数据表 二、对分检索(折半查找) 前提:检索的数据表已经排好序,如何进行数据的排序,将在本节稍后介绍。 方法:取数据表中间位置的数与关键字进行比较,如相等,则查找到;如果所取的数大于关键字,则下次对分检索的范围是从数据区起点到本次取数。如果取数小于关键字,则下次对分检索的范围是从本次取数数据区起点到数据区终点。依此类推,逐渐缩小检索范围,减少次数,大大提高了查找速度。,在指定的数据区中找出最大值(或最小值)。 例 片内RAM中存放一批数据,查找出最大值并存放于首地址中。设R0中存首地址,R2中存放字节数,程序框图如图所示。,3.6.4 数据极值查找程序设计,程序如下: MOV R2,n ;n为要比较的数据字节数 MOV A,R0 ;存首地址指针 MOV R1,A DEC R2 ; MOV A,R1 LOOP: MOV R3, A DEC R1 CLR C SUBB A,R1 ;两个数比较 JNC LOOP1 ;C=0,A中的数大,跳LOOP1 MOV A,R1 ;C=1,则大数送A SJMP LOOP2 LOOP1: MOV A,R3 LOOP2: DJNZ R2, LOOP ;是否比较结束? MOV R0, A ;存最大数 RET,升序排,降序排:仅介绍无符号数据升序排。 冒泡法:相邻数互换的排序方法,类似水中气泡上浮。从前向后进行相邻两个数的比较,次序与要求的顺序不符时,就将两个数互换;顺序符合要求不互换。有7个原始数据
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 建筑智能化系统集成-洞察及研究
- 深度包检测技术优化-洞察及研究
- 水利工程节水灌溉技术方案
- 中学物理课程教学设计与实施
- 钢结构施工方案设计与风险控制
- 2026年华能陕西发电有限公司新能源分公司招聘笔试备考题库及答案解析
- 2025安徽安庆中船柴油机有限公司及下属子公司招聘23人笔试备考试题及答案解析
- 2026国家能源集团招聘直招陕西省职位查看笔试备考题库及答案解析
- 2026国家能源集团神东煤炭陕西招聘岗位表(363人)笔试参考题库附答案解析
- 抚州高新区财投集团有限公司及其子公司2025年度公开引进紧缺专业人才笔试模拟试题及答案解析
- (高清版)DB11∕T 2456-2025 消防安全管理人员能力评价规范
- 胎心监护及并发症处理
- 锁骨骨折术后护理
- 酒店餐饮部主管考试题库
- 产业策划投标方案(3篇)
- 眼科常见疾病及其用药
- 脑疝患者的急救及护理
- 2025年广西专业技术人员继续教育公需科目(一)答案
- 2024年全市首届档案职业技能竞赛考试题库(含答案)
- 家校社协同育人机制的创新构建与实践探究
- 合作建房框架协议书
评论
0/150
提交评论