资源预览内容
第1页 / 共102页
第2页 / 共102页
第3页 / 共102页
第4页 / 共102页
第5页 / 共102页
第6页 / 共102页
第7页 / 共102页
第8页 / 共102页
第9页 / 共102页
第10页 / 共102页
亲,该文档总共102页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第 4 章 汇编语言程序设计简介 第第4章章 汇编言语程序设计简介汇编言语程序设计简介 4.1 汇编言语概述汇编言语概述 4.2 汇编言语程序设计汇编言语程序设计4.3 汇编程序设计实例汇编程序设计实例 第 4 章 汇编语言程序设计简介 4.1 汇编言语概述4.1.1 程序设计言语的分类及特点程序设计言语的分类及特点 可可以以完完成成一一定定功功能能的的指指令令序序列列称称为为程程序序,用用来来设设计计计计算算机机程程序序的的言言语语称称为为程程序序设设计计言言语语,按按照照言言语语的的构构造造及及功功能能程程序设计言语可分为:机器言语、汇编言语和高级言语。序设计言语可分为:机器言语、汇编言语和高级言语。第 4 章 汇编语言程序设计简介 1机器言语机器言语 是是计计算算机机所所能能识识别别的的独独一一言言语语,由由二二进进制制代代码码0和和1构构成成指令和数据。指令和数据。 其其具具有有效效率率高高、呼呼应应速速度度快快的的特特点点,但但由由于于机机器器言言语语编编写写的的程程序序依依赖赖于于计计算算机机的的构构造造,可可移移植植性性差差,繁繁琐琐且且难难于于记记忆、识别和调试,通常编程时,不采用机器言语。忆、识别和调试,通常编程时,不采用机器言语。第 4 章 汇编语言程序设计简介 2汇编言语汇编言语 是一种符号言语,指令由助记符表示。是一种符号言语,指令由助记符表示。 与与机机器器言言语语相相比比,汇汇编编言言语语具具有有指指令令容容易易记记忆忆、了了解解、识识别别和和可可读读性性好好的的优优点点,但但本本质质上上由由于于汇汇编编言言语语也也是是面面向向机机器器的的言言语语,是是机机器器言言语语程程序序的的符符号号表表示示,所所以以用用户户必必需需熟熟习习机机器器的的硬硬件件构构造造和和指指令令系系统统,掌掌握握计计算算机机的的任任务务过过程程才才干干熟熟练编程。练编程。 另另外外,汇汇编编言言语语所所编编写写的的源源程程序序与与经经过过汇汇编编所所产产生生的的机机器器代代码码程程序序之之间间有有明明显显的的一一一一对对应应关关系系,所所以以汇汇编编言言语语编编写写的程序同样也存在通用性差,程序不能移植的缺陷。的程序同样也存在通用性差,程序不能移植的缺陷。第 4 章 汇编语言程序设计简介 3高级言语高级言语 高高级级言言语语是是接接近近于于人人的的自自然然言言语语方方式式的的计计算算机机编编程程言言语语的总称,例如的总称,例如C言语、言语、BASIC言语等都是高级言语。言语等都是高级言语。 和和汇汇编编言言语语相相比比,高高级级言言语语指指令令简简单单易易学学,用用户户容容易易掌掌握握,且且高高级级言言语语程程序序不不依依赖赖于于详详细细的的硬硬件件构构造造和和指指令令系系统统,程程序序可可移移植植性性好好,但但是是高高级级言言语语编编写写的的源源程程序序必必需需经经过过编编译译或或解解释释程程序序翻翻译译成成目目的的程程序序,机机器器才才干干执执行行,而而生生成成的的目目的的程程序序需需占占用用较较多多的的存存储储单单元元,执执行行时时间间较较长长,运运转转效效率较低。率较低。第 4 章 汇编语言程序设计简介 4.1.2 单片机汇编言语源程序的编辑和汇编单片机汇编言语源程序的编辑和汇编汇编言语的指令类型汇编言语的指令类型 汇汇编编言言语语源源程程序序由由两两种种类类型型的的汇汇编编言言语语语语句句即即指指令令构构成成。语语句句按按性性质质不不同同分分为为两两类类:指指令令性性语语句句机机器器指指令令和指示性语句伪指令。和指示性语句伪指令。1机器指令机器指令 指指令令系系统统中中的的全全部部指指令令,每每条条指指令令都都有有对对应应的的机机器器代代码码,是机器真正可以执行的指令。是机器真正可以执行的指令。2 伪指令伪指令 为为汇汇编编程程序序在在汇汇编编过过程程中中提提供供控控制制或或指指示示信信息息,并并不不直直接接产活力器代码,属于机器不能执行的指令类型。产活力器代码,属于机器不能执行的指令类型。第 4 章 汇编语言程序设计简介 汇编汇编 计计算算机机不不能能直直接接识识别别和和执执行行源源程程序序。因因此此源源程程序序必必需需经经过过汇汇编编程程序序汇汇编编产产活活力力器器码码目目的的程程序序文文件件,程程序序才才干干执执行行。这种将汇编言语源程序转换成机器言语程序的过程称为汇编。这种将汇编言语源程序转换成机器言语程序的过程称为汇编。汇编言语汇编言语源程序源程序汇编程序汇编程序目的文件和源程序列表目的文件和源程序列表经过经过汇编后汇编后第 4 章 汇编语言程序设计简介 汇编言语源程序的汇编过程分为手工汇编和机器汇编。汇编言语源程序的汇编过程分为手工汇编和机器汇编。 所所谓谓手手工工汇汇编编,即即采采用用人人工工查查指指令令表表的的方方法法将将汇汇编编指指令令翻翻译成相应机器代码。译成相应机器代码。 通通常常源源程程序序的的人人工工汇汇编编需需求求两两次次才才干干完完成成,第第一一次次汇汇编编查查找每条指令的机器代码,第二次汇编完成地址偏移量的计算。找每条指令的机器代码,第二次汇编完成地址偏移量的计算。 由由于于手手工工汇汇编编需需求求计计算算和和查查找找,繁繁琐琐而而且且容容易易出出错错,而而且且程程序序修修正正时时能能够够会会引引起起指指令令的的地地址址变变化化,转转移移指指令令的的偏偏移移量量也也随随之之改改动动,需需求求重重新新计计算算,所所以以手手工工汇汇编编主主要要运运用用于于设设计计短短小小程序或调试程序的场所。程序或调试程序的场所。第 4 章 汇编语言程序设计简介 所所谓谓机机器器汇汇编编,即即采采用用汇汇编编程程序序对对源源程程序序进进展展自自动动汇汇编编,由由于于单单片片机机软软硬硬件件资资源源的的限限制制,该该过过程程通通常常借借助助于于PC系系统统机机实实现现,象象这这种种借借助助于于一一种种计计算算机机而而为为另另一一种种计计算算机机产产生生目目的的代代码的汇编方式又称为交叉汇编。码的汇编方式又称为交叉汇编。 交交叉叉汇汇编编的的原原理理类类似似于于手手工工汇汇编编,在在汇汇编编程程序序中中通通常常存存入入了了两两张张表表,即即MCS-51单单片片机机的的指指令令代代码码表表和和伪伪指指令令表表。汇汇编编程程序序通通常常经经过过两两次次扫扫描描完完成成汇汇编编,第第一一次次扫扫描描查查找找源源程程序序中中每每条条指指令令的的机机器器代代码码,第第二二次次扫扫描描完完成成地地址址偏偏移移量量的的计计算算,汇汇编后生成目的文件和列表文件。这是目前运用较广的汇编方法。编后生成目的文件和列表文件。这是目前运用较广的汇编方法。第 4 章 汇编语言程序设计简介 汇编的主要功能为:汇编的主要功能为:1确定程序中每条汇编言语指令的指令机器码。确定程序中每条汇编言语指令的指令机器码。2确定每条指令在程序存储器中的存放地址。确定每条指令在程序存储器中的存放地址。3提提供供语语法法、编编辑辑等等方方面面的的错错误误信信息息,但但不不能能提提供供程程序序的的逻辑错误。逻辑错误。4产生目的执行文件产生目的执行文件*.OBJ/*.HEX)和列表文件和列表文件*.LST。第 4 章 汇编语言程序设计简介 4.1.3 伪伪 指指 令令 一、一、 汇编起始指令汇编起始指令 ORG 指令格式为指令格式为: ORG 16位地址位地址 该该指指令令的的作作用用是是指指明明后后面面的的程程序序或或数数据据块块的的起起始始地地址址, 它总是出如今每段源程序或数据块的开场。它总是出如今每段源程序或数据块的开场。 16 位位地地址址, 确确定定了了此此语语句句后后面面第第一一条条指指令令或或第第一一个个数数据据的的地地址址,以以后后的的源源程程序序或或数数据据块块就就依依次次延延续续存存放放在在以以后后的的地地址内址内, 直到遇到另一个直到遇到另一个ORG指令为止。指令为止。 第 4 章 汇编语言程序设计简介 例例: ORG 2000H MOV SP, 60H MOV R0, 2FH MOV R2, 0FFH ORG伪伪指指令令阐阐明明其其后后面面程程序序的的目目的的代代码码在在存存储储器器中中存存放放的的起始地址是起始地址是2000H, 即即 存储器地址存储器地址 目的程序目的程序 2000H 75 81 60 2019H 78 2F 2019H 7A FF 第 4 章 汇编语言程序设计简介 二、等值指令二、等值指令EQU 指令格式指令格式: 字符称号字符称号 EQU 数字或汇编符号数字或汇编符号 功能功能: 使指令中的字符称号等价于给定的数字或汇编符号。使指令中的字符称号等价于给定的数字或汇编符号。 运运用用等等值值指指令令可可给给程程序序的的编编制制、调调试试、修修正正带带来来方方便便:假假设设在在程程序序中中要要多多次次运运用用到到某某一一地地址址,由由EQU指指令令将将其其赋赋值值给给一一个个字字符符称称号号,一一旦旦需需求求对对其其进进展展变变动动,只只需需改改动动EQU命命令令后后面面的的数数字字即即可可,而而不不需需求求对对程程序序中中涉涉及及到到该该地地址址的的一一切切指令逐句进展修正。指令逐句进展修正。第 4 章 汇编语言程序设计简介 留留意意, 由由EQU等等值值的的字字符符称称号号必必需需先先赋赋值值后后运运用用,且且在同一个源程序中,同一个标号只能赋值一次。在同一个源程序中,同一个标号只能赋值一次。 例例: PA8155 EQU 8001H即给标号即给标号PA8155赋值为赋值为8001H。 第 4 章 汇编语言程序设计简介 三、三、 定义字节指令定义字节指令DB 指令格式指令格式: 标号标号: DB 8位二进制数表位二进制数表 功功能能: 把把 8 位位二二进进制制数数表表依依次次存存入入从从标标号号开开场场的的延延续续的的存存储单元中。储单元中。 格格式式中中, 标标号号区区段段可可有有可可无无, DB指指令令之之后后的的 8 位位二二进进制制数数表表是是字字节节常常数数或或用用逗逗号号隔隔开开的的字字节节串串, 也也可可以以是是用用引引号号括括起起来的来的ASCII码字符串码字符串 (一个一个 ASCII字符相当于一个字节字符相当于一个字节)。 例例: 第 4 章 汇编语言程序设计简介 ORG 1000HBUF1: DB 38H, 7FH, 80HBUF2: DB 45H, 66H ORG伪伪指指令令指指定定了了标标号号BUF1的的地地址址为为1000H, 而而DB伪伪指指令令是是将将其其后后的的二二进进制制数数表表38H, 7FH, 80H依依次次存存放放在在1000H, 1001H, 1002H 3 个个延延续续单单元元之之中中, BUF2也也是是一一个个标标号号, 其其地地址址与与前前一一条条伪伪指指令令延延续续, 即即1003H, 1004H地址单元中依次存放地址单元中依次存放 45H, 66H。 第 4 章 汇编语言程序设计简介 四、四、 定义字指令定义字指令DW 指令格式指令格式: 标号标号: DW 16 位数据表位数据表 该该指指令令的的功功能能与与DB类类似似, 区区别别仅仅在在于于从从指指定定地地址址开开场场存存放放的的是是指指令令中中的的 16 位位数数据据, 而而不不是是字字节节串串。每每个个 16 位位数数据据要要占占两两个个存存储储单单元元, 高高8 位位先先存存, 低低 8 位位后后存存, 这这和和MCS -51指令中的指令中的16位数据存放顺序是一致的。位数据存放顺序是一致的。 第 4 章 汇编语言程序设计简介 五、五、DSDefine Store定义存储区指令定义存储区指令功功能能为为:从从指指定定的的单单元元地地址址开开场场,保保管管一一定定数数量量的的存存储储单单元元,以备运用。以备运用。指令格式:指令格式: 标号:标号: DS 表达式表达式其中,表达式指定保管的内存单元个数。其中,表达式指定保管的内存单元个数。例如,例如,ORG 1000H DS 10TAB: DB 10H 汇汇编编结结果果:从从1000H地地址址处处开开场场,保保管管10个个字字节节单单元元。100AH=10H。第 4 章 汇编语言程序设计简介 六、六、BIT位地址符号指令位地址符号指令指指令令功功能能为为:将将位位地地址址赋赋值值给给指指定定的的符符号号称称号号,通通常常用用于于位位符符号地址的定义。号地址的定义。指令如下:指令如下: 字符称号字符称号BIT 位地址位地址例如,例如,X1 BIT P1.0 汇汇编编结结果果为为将将位位地地址址P1.0赋赋给给变变量量X1,即即在在程程序序中中便便可可运用运用X1替代位地址替代位地址P1.0。第 4 章 汇编语言程序设计简介 七、七、DATA数据地址赋值指令数据地址赋值指令 指指令令功功能能:将将数数据据地地址址或或指指令令代代码码地地址址赋赋值值给给所所指指定定的标号。通常在程序中用于定义数据地址。指令格式如下:的标号。通常在程序中用于定义数据地址。指令格式如下: 标号:标号:DATA 表达式表达式例如,例如,AA:DATA 2000H汇编结果为:汇编结果为:AA=2000H。第 4 章 汇编语言程序设计简介 【留意】:【留意】:DATA与与EQU的区别在于:的区别在于:1EQU定定义义的的标标识识符符在在汇汇编编时时不不在在符符号号表表中中登登记记,因因此此必需先定义后运用;必需先定义后运用;2DATA定定义义的的标标识识符符汇汇编编时时在在符符号号表表中中登登记记,所所以以可可以先运用后定义。以先运用后定义。第 4 章 汇编语言程序设计简介 八、八、 汇编终了指令汇编终了指令END 指令格式指令格式: 标号标号: END 地址或标号地址或标号 格式中标号以及格式中标号以及END后面的地址或标号可有可无。后面的地址或标号可有可无。 功能功能: 提供汇编终了标志。提供汇编终了标志。 汇汇编编程程序序遇遇到到 END后后就就停停顿顿汇汇编编, 对对 END以以后后的的语语句不予处置句不予处置, 故故 END应放在程序的终了处。应放在程序的终了处。 第 4 章 汇编语言程序设计简介 4.2 汇编言语程序设计汇编言语程序设计 4.2.0 程序设计步骤程序设计步骤4.2.1 顺序构造顺序构造4.2.2 分支构造分支构造4.2.3 循环构造循环构造4.2.4 子程序调用子程序调用第 4 章 汇编语言程序设计简介 4.2.0 程序设计程序设计 步骤步骤 对对于于简简单单程程序序的的编编写写,程程序序设设计计者者往往往往可可以以立立刻刻完完成成软软件件的的构构思思与与编编写写,而而对对于于比比较较复复杂杂的的程程序序设设计计问问题题,那那么么需需求求科科学学合合理理的的程程序序设设计计步步骤骤。从从软软件件工工程程角角度度来来说说,开开发发一一个运用程序,普通需求经过以下几个步骤:个运用程序,普通需求经过以下几个步骤:第 4 章 汇编语言程序设计简介 第 4 章 汇编语言程序设计简介 4.2.1 顺序程序设计顺序程序设计 顺序程序是程序设计中最根本的构造,又称顺序程序是程序设计中最根本的构造,又称为简单程序。特点为顺序执行每一条指令,直到为简单程序。特点为顺序执行每一条指令,直到最后。其执行过程如图最后。其执行过程如图4-3所示。所示。 S1S2图4-3 顺序构造第 4 章 汇编语言程序设计简介 【例【例 1】 两个无符号双字节数相加。两个无符号双字节数相加。 设设被被加加数数存存放放于于内内部部RAM的的40H高高位位字字节节, 41H低低位位字字节节, 加加数数存存放放于于50H高高位位字字节节, 51H低低位位字字节节, 和数存入和数存入 40H和和41H单元中。单元中。 第 4 章 汇编语言程序设计简介 程序如下程序如下: START: CLR C ; 将将Cy清零清零 MOV R0, 41H ; 将被加数地址送数据指针将被加数地址送数据指针R0 MOV R1, 51H ; 将加数地址送数据指针将加数地址送数据指针R1 AD1: MOV A, R0 ; 被加数低字节的内容送入被加数低字节的内容送入AADD A,R1 ; 两个低字节相加两个低字节相加MOV R0, A ; 低字节的和存入被加数低字节中低字节的和存入被加数低字节中 DEC R0 ; 指向被加数高位字节指向被加数高位字节 DEC R1 ; 指向加数高位字节指向加数高位字节 MOV A, R0 ; 被加数高位字节送入被加数高位字节送入AADDC A, R1 ; 两个高位字节带两个高位字节带Cy相加相加 MOV R0, A ; 高位字节的和送被加数高位字节高位字节的和送被加数高位字节 RET 第 4 章 汇编语言程序设计简介 4.2.2 分支程序设计分支程序设计1. 分支程序构造分支程序构造2. 普通分支程序设计普通分支程序设计3. 分支表法实现多向分支程序的设计分支表法实现多向分支程序的设计第 4 章 汇编语言程序设计简介 条条件件S1S2YN条件条件S1条件条件NS2S1Sna单分支单分支 b双分支双分支 c多分支多分支1. 分支程序构造分支程序构造第 4 章 汇编语言程序设计简介 【例【例5】 x, y均为均为8位二进制数位二进制数, 设设 x存入存入R0, y存入存入R1, 求解求解: 2. 普通分支程序构造实例普通分支程序构造实例第 4 章 汇编语言程序设计简介 程序如下程序如下: START: CJNE R0,00H,SUL1 ; R0中的数与中的数与00比较不等转移比较不等转移MOV R1, 00H; 相等相等, R1 0 SJMP SUL2 SUL1: JC NEG ; 两数不等两数不等, 假设假设(R0)0, 那么那么 R101H SJMP SUL2 NEG: MOV R1, 0FFH ; R00, 那么那么 R10FFH SUL2: RET 第 4 章 汇编语言程序设计简介 【例例 6 】 比比较较两两个个无无符符号号数数的的大大小小。 设设外外部部 RAM 的的存存储储单单元元ST1和和 ST2中中存存放放两两个个不不带带符符号号的的二二进进制制数数, 找找出出其其中中的的大大数数存存入入外外部部 RAM 中中的的 ST3单元中。单元中。 第 4 章 汇编语言程序设计简介 程序如下:程序如下: ORG 1000H ST1 EQU 2000H ST2 EQU 2100H ST3 EQU 2200H START: CLR C ; 清零清零Cy MOV DPTR, ST1 ; 第一个数的指针第一个数的指针 MOVX A, DPTR ; 取第一个数取第一个数 MOV R2, A ; 保管保管 MOV DPTR, ST2 ; 第二个数的指针第二个数的指针 MOVX A, DPTR ; 取第二个数取第二个数 CLR C 第 4 章 汇编语言程序设计简介 SUBB A, R2; 两数比较两数比较JNC BIG1 ; 假设第二个数大假设第二个数大C=1, 那么转那么转XCH A, R2; 第一个数大第一个数大BIG0: MOV DPTR, ST3 MOVX DPTR, A ; 存大数存大数RETBIG1: MOVX A, DPTR; 第二个数大第二个数大SJMP BIG0RET 第 4 章 汇编语言程序设计简介 在实践运用时,通常遇到根据某变量取值不同从而转向不在实践运用时,通常遇到根据某变量取值不同从而转向不同分支的标题,这时经常采用分支表法。常用的分支表主要有同分支的标题,这时经常采用分支表法。常用的分支表主要有三种方式:转移指令表、分支地址表和地址偏移量表。三种方式:转移指令表、分支地址表和地址偏移量表。 本质上都是利用散转指令本质上都是利用散转指令JMP A+DPTR来实现的。的目的来实现的。的目的地址。地址。3. 分支表法实现多向分支程序的设计分支表法实现多向分支程序的设计间接转移指令间接转移指令 JMP A+DPTR ;PCA+DPTR实现散转的方法主要有两种:实现散转的方法主要有两种:1累加器累加器A清零,根据清零,根据DPTR的内容决议转移的目的地址。的内容决议转移的目的地址。2DPTR的值作为基址不变,根据累加器的值作为基址不变,根据累加器A的内容决议转移的内容决议转移的目的地址。的目的地址。第 4 章 汇编语言程序设计简介 【例【例7】根据】根据R2的内容,转向相应的分支程序。即:的内容,转向相应的分支程序。即:R2=0,转向,转向PROG0R2=1,转向,转向PROG1R2=n,转向,转向PROGn可采用方法:可采用方法:1运用转移指令表。运用转移指令表。 2运用分支地址表。运用分支地址表。3运用地址偏移量表。运用地址偏移量表。 第 4 章 汇编语言程序设计简介 1运用转移指令表。运用转移指令表。 所谓转移指令表即由转移指令组成的分支表,如下图。所谓转移指令表即由转移指令组成的分支表,如下图。JMPTAB:AJMP PROG0 JMPTAB:LJMP PROG0 AJMP PROG1 LJMP PROG1 AJMP PROGn LJMP PROGn a b 图图4-8转移指令表转移指令表第 4 章 汇编语言程序设计简介 设转移指令表的标号为设转移指令表的标号为JMPTAB,分支数为,分支数为5,解题思绪,解题思绪分析如下图。分析如下图。DPTRJMPTABDPTRJMPTABA+DPTRJMPTAB+R23A+DPTRJMPTAB+R23JMP A+DPTRJMP A+DPTRLJMP PROG0LJMP PROG0LJMP PROGnLJMP PROGnLJMP PROG1LJMP PROG1第 4 章 汇编语言程序设计简介 MOV DPTR,#JMPTAB;将;将JMPTABDPTRMOV A,R2MOV B,#03MUL AB ;R23BAPUSH A ;暂存乘积的低位字节;暂存乘积的低位字节AMOV A,BADD A,DPH ;将乘积的高位字节;将乘积的高位字节B+DPHDPHMOV DPH,A ;POP A ;将暂存的;将暂存的A内容恢复内容恢复JMP A+DPTR ;散转;散转;转移指令表;转移指令表JMPTAB:LJMP PROG0 LJMP PROG1 LJMP PROG5 PROG0: PROG1: PROG5: JMP A+DPTR ;PC(A)+(DPTR)第 4 章 汇编语言程序设计简介 假设转移指令表由假设转移指令表由2字节指令字节指令AJMP构成,构成,M取值应为取值应为2,且,且各分支程序的入口地址各分支程序的入口地址PROG0、PROG1必需与必需与 转移指令表转移指令表处于同一个处于同一个2KB的存储地址空间之内,而的存储地址空间之内,而LJMP指令表那么没指令表那么没有这个限制。有这个限制。 运用运用AJMP转移指令表的程序如下:转移指令表的程序如下:MOV DPTR,#JMPTAB ;将;将JMPTABDPTRCLR CMOV A,R2RLC A ;R22AJNC NOADD ;判别能否有进位;判别能否有进位INC DPH;假设有进位,将进位加到高字节;假设有进位,将进位加到高字节DPHNOADD: JMP A+DPTR;散转;散转;散转转移指令表;散转转移指令表JMPTAB:AJMP PROG0AJMP PROG1 AJMP PROG5 PROG0: PROG1: PROG5: 第 4 章 汇编语言程序设计简介 2运用分支地址表。运用分支地址表。 所谓分支地址表是指由各个分支程序的入口地址组成的线性表,所谓分支地址表是指由各个分支程序的入口地址组成的线性表,每个入口地址占两个延续字节单元。每个入口地址占两个延续字节单元。 设设PROG0PROGn为分支程序入口地址,分支地址表如下图。为分支程序入口地址,分支地址表如下图。BRANCHTAB:DW PROG0 DW PROG1 DW PROGn第 4 章 汇编语言程序设计简介 DPTRBRANCHTABDPTRBRANCHTABAR22AR22JMP A+DPTRJMP A+DPTR 分支程序分支程序PROG0PROG0 分支程序分支程序PROGnPROGn分支程序分支程序PROG1PROG1DPTRDPTR运用运用MOVC A,A+DPTRMOVC A,A+DPTR取分支地址取分支地址A0A0图图4-114-11分支地址表的运用分支地址表的运用第 4 章 汇编语言程序设计简介 根据以上解题思绪根据以上解题思绪, 程序编写如下程序编写如下: ORG 1000HMAIN:MOV DPTR,#BRANCHTAB ;取分支表入口地址;取分支表入口地址MOV A,R2 CLR C ;AR22 RLC AJNC NOADD ;没有进位转移;没有进位转移INC DPH ;进位加到;进位加到DPH中中NOADD:MOV R3,A ;R3R22MOVC A,A+DPTR ;A分支地址的高位字节分支地址的高位字节XCH A,R3 ;R3分支地址的高位字节,分支地址的高位字节,AR22INC A ;指向下一个存储单元;指向下一个存储单元MOVC A,A+DPTR ;取分支地址的低位字节;取分支地址的低位字节MOVC A,A+DPTR ;A(A+DPTR)第 4 章 汇编语言程序设计简介 MOV DPL,A MOV DPH,R3CLR A JMP A+DPTR ;分支地址;分支地址PC,转移,转移;分支地址表;分支地址表BRANCHTAB: DW PROG0 DW PROG1 ;分支程序;分支程序0 PROG0: ;分支程序;分支程序0 PROG5: ;分支程序;分支程序5JMP A+DPTR ;PC(A)+(DPTR)第 4 章 汇编语言程序设计简介 3运用地址偏移量表。运用地址偏移量表。 所谓地址偏移量表,是指由各分支程序段的入口地址与所谓地址偏移量表,是指由各分支程序段的入口地址与地址偏移量表的标号差即地址偏移量构成的线性表。其地址偏移量表的标号差即地址偏移量构成的线性表。其中地址偏移量表中每项占一个字节,如下图。中地址偏移量表中每项占一个字节,如下图。;PROG0PROGn为分支程序入口地址为分支程序入口地址TAB: DB PROG0-TAB DB PROG1-TAB DB PROGn-TAB图图4-12 地址偏移量表地址偏移量表第 4 章 汇编语言程序设计简介 DPTRTABDPTRTABAR2AR2JMP A+DPTRJMP A+DPTR 分支程序分支程序PROG0PROG0 分支程序分支程序PROGnPROGn分支程序分支程序PROG1PROG1运用运用MOVC A,A+DPTRMOVC A,A+DPTR取分支地址偏移量取分支地址偏移量图图4-134-13地址偏移量表的运用地址偏移量表的运用第 4 章 汇编语言程序设计简介 根据以上解题思绪根据以上解题思绪, 程序编写如下程序编写如下:ORG 0100HMOV DPTR,#TAB ;取偏移量表首地址;取偏移量表首地址MOV A,R2 MOVC A,A+DPTR ;将查表所得;将查表所得PROGi-TABAJMP A+DPTR ;由由A+DPTR=PROGi-TAB+TAB= ; PROGi获得分支程序地址实现跳获得分支程序地址实现跳TAB:DB PROG0-TAB ;地址偏移量表;地址偏移量表DB PROG1-TAB DB PROGn-TABPROG0:PROGn:运用地址偏移量表实现多向分支时,应留意要使地址偏移量表与各分支程序运用地址偏移量表实现多向分支时,应留意要使地址偏移量表与各分支程序的长度和在同一页的长度和在同一页256字节范围内,因此该方法适用于分支较少的情况。字节范围内,因此该方法适用于分支较少的情况。JMP A+DPTR ;PC(A)+(DPTR)第 4 章 汇编语言程序设计简介 4.2.3 循环程序设计循环程序设计 1、 循环构造循环构造2、循环构造实例、循环构造实例 1单循环单循环 2多重循环多重循环第 4 章 汇编语言程序设计简介 一、一、 循环构造循环构造 图 4.4 第 4 章 汇编语言程序设计简介 循环程序普通由四个主要部分组成循环程序普通由四个主要部分组成: (1) 初始化部分初始化部分: 为循环程序做预备为循环程序做预备, 如规定循环次数、如规定循环次数、 给各变量和地址指针预置初值。给各变量和地址指针预置初值。 (2) 处置部分处置部分: 为反复执行的程序段为反复执行的程序段, 是循环程序的实体是循环程序的实体, 也是循环程序的主体。也是循环程序的主体。 (3) 循环控制部分循环控制部分: 这部分的作用是修正循环变量和控制这部分的作用是修正循环变量和控制变量变量, 并判别循环能否终了并判别循环能否终了, 直到符合终了条件时直到符合终了条件时, 跳出循环跳出循环为止。为止。 (4) 终了部分终了部分: 这部分主要是对循环程序的结果进展分析、这部分主要是对循环程序的结果进展分析、 处置和存放。处置和存放。 第 4 章 汇编语言程序设计简介 【例【例 8】 任务单元清零。任务单元清零。 在在运运用用系系统统程程序序设设计计时时, 有有时时经经常常需需求求将将存存储储器器中中各各部部分分地地址址单单元元作作为为任任务务单单元元, 存存放放程程序序执执行行的的中中间间值值或或执执行行结结果果, 任务单元清零任务经常放在程序的初始化部分中。任务单元清零任务经常放在程序的初始化部分中。 设设有有50个个任任务务单单元元, 其其首首址址为为外外部部存存储储器器8000H单单元元, 那那么其任务单元清零程序如下么其任务单元清零程序如下: 二、二、 循环构造实例循环构造实例 1 单循环单循环第 4 章 汇编语言程序设计简介 CLEAR: CLR A MOV DPTR, 8000H ; 任任务务单单元元首首址址送送指指针针 MOV R2, 50 ; 置循环次数置循环次数CLEAR1: MOVX DPTR, A INC DPTR ; 修正指针修正指针 DJNZ R2, CLEAR1 ; 控制循环控制循环 RET 第 4 章 汇编语言程序设计简介 【例例 9】 设设在在内内部部 RAM的的BLOCK单单元元开开场场处处有有长长度度为为 LEN个个的的无无符符号号数数据据块块, 试试编编一一个个求求和和程程序序, 并并将将和和存存入内部入内部 RAM的的 SUM单元设和不超越单元设和不超越 8 位。位。 第 4 章 汇编语言程序设计简介 BLOCK EQU 20H LEN EQU 30H SUM EQU 40HSTART: CLR A ; 清累加器清累加器A MOV R2, LEN ; 数据块长度送数据块长度送R2 MOV R1, BLOCK ; 数据块首址送数据块首址送R1 LOOP: ADD A, R1 ; 循环加法循环加法 INC R1; 修正地址指针修正地址指针 DJNZ R2, LOOP ; 修正计数器并判别修正计数器并判别 MOV SUM, A; 存和存和 RET 第 4 章 汇编语言程序设计简介 【例【例10】求最小值。设内部】求最小值。设内部RAM中有一无符号数数据块,中有一无符号数数据块,其首地址为其首地址为BLOCK,长度存于,长度存于LEN单元,试求出数据块中单元,试求出数据块中的最小值,存入的最小值,存入MIN单元。单元。分析分析:求最小值时求最小值时,通常采用比较交换的方法。通常采用比较交换的方法。即首先取第一个数作为基准,然后将基准数与第二个数进即首先取第一个数作为基准,然后将基准数与第二个数进展比较,假设基准数大于第二个数,那么两数进展交换;展比较,假设基准数大于第二个数,那么两数进展交换;假设基准数小于第二个数那么不进展交换,总之保证基准假设基准数小于第二个数那么不进展交换,总之保证基准数单元中的值为最小值,再取下一个数与基准数进展比较,数单元中的值为最小值,再取下一个数与基准数进展比较,不断到一切数据比较完为止,那么基准数单元中的数那么不断到一切数据比较完为止,那么基准数单元中的数那么为最小值。依此类推,求最大值也可采用类似方法。为最小值。依此类推,求最大值也可采用类似方法。第 4 章 汇编语言程序设计简介 详细程序编写如下:详细程序编写如下:ORG 1000HMIN: DATA 20HLEN: DATA 21HBLOCK: DATA 22HMOV A, #0FFHMOV R2,LENMOV R1,#BLOCK ;取数据块首地址;取数据块首地址LOOP: CLR C ;清;清CY预备做减法预备做减法 SUBB A,R1 JC NEXT ;AR1,转,转NEXT MOV A,R1 ;AR1,那么,那么AR1 SJMP NEXT1NEXT: ADD A,R1 ;A(R1),恢复恢复ANEXT1:INC R1DJNZ R2,LOOPMOV MIN,A ;存最小值;存最小值HERE: SJMP HERE 第 4 章 汇编语言程序设计简介 【例【例11】设片内】设片内RAM中有一无符号数数据块,其首地址为中有一无符号数数据块,其首地址为BLOCK,长度未知,但数据终了标志存于,长度未知,但数据终了标志存于LEN单元,求数单元,求数据块的最小值并存于据块的最小值并存于MIN单元中。单元中。 可以看出,这是一个循环次数未知的例题,经过设定特征值可以看出,这是一个循环次数未知的例题,经过设定特征值控制循环终了条件。控制循环终了条件。第 4 章 汇编语言程序设计简介 ORG 1000HMIN: DATA 20HLEN: DATA 21HBLOCK:DATA 22HMAIN: MOV R1,#BLOCK;数表首地址;数表首地址 MOV B,R1;取第一个数作为基准;取第一个数作为基准NEXT: INCR1;修正指针;修正指针 MOV A,R1 CJNE A,LEN,NEXT1 ;能否为数表结尾?;能否为数表结尾? SJMP DONE;循环终了;循环终了NEXT1: CJNE A,B,NEXT2 ;比较;比较NEXT2: JNCNEXT ;AB,转,转NEXT继续取数继续取数 MOVB,A ;保管较小值;保管较小值 SJMP NEXTDONE: SJMP DONE第 4 章 汇编语言程序设计简介 【例例12】 在在内内部部 RAM中中从从50H单单元元开开场场的的延延续续单单元元依依次次存存放放了了一一串串字字符符, 该该字字符符串串以以回回车车符符为为终终了了标标志志, 要要求求测测试该字符串的长度。试该字符串的长度。 程序如下程序如下: START: MOV R2, 0FFH MOV R0, 4FH ; 数据指针数据指针R0置初值置初值 LOOP: INC R0 INC R2 CJNE R0, 0DH, LOOP RET 第 4 章 汇编语言程序设计简介 (2) 多重循环多重循环 【例【例 13】 10 秒延时程序。秒延时程序。 延延时时程程序序与与 MCS - 51 执执行行指指令令的的时时间间有有关关, 假假设设运运用用 6 MHz晶晶振振, 一一个个机机器器周周期期为为 2 s, 计计算算出出一一条条指指令令以以致致一一个个循循环环所所需需求求的的执执行行时时间间, 给给出出相相应应的的循循环环次次数数, 便便能能到到达达延延时时的的目的。目的。10 秒延时程序如下秒延时程序如下: DELAY: MOV R5, 100 DEL0: MOV R6, 200 DEL1: MOV R7, 248 DEL2: DJNZ R7, DEL2 DJNZ R6, DEL1 DJNZ R5, DEL0 RET 第 4 章 汇编语言程序设计简介 上上例例程程序序中中采采用用了了多多重重循循环环程程序序, 即即在在一一个个循循环环体体中中又又包包含含了了其其它它的的循循环环程程序序, 这这种种方方式式是是实实现现延延时时程程序序的的常常用用方方法法。 运用多重循环时运用多重循环时, 必需留意必需留意: (1 循循环环嵌嵌套套, 必必需需层层次次清清楚楚, 不不允允许许产产生生内内外外层层循循环环交交叉。叉。 (2 外外循循环环可可以以一一层层层层向向内内循循环环进进入入, 终终了了时时由由里里往往外外一一层层退出。层层退出。 (3 内内循循环环可可以以直直接接转转入入外外循循环环, 实实现现一一个个循循环环由由多多个个条条件控制的循环构造方式。件控制的循环构造方式。 第 4 章 汇编语言程序设计简介 【例例 14】 在在外外部部 RAM中中, BLOCK开开场场的的单单元元中中有有一一无无符符号号数数据据块块, 其其个个数数为为LEN个个字字节节。试试将将这这些些无无符符号号数数按按递递减减次序重新陈列次序重新陈列, 并存入原存储区。并存入原存储区。 略略第 4 章 汇编语言程序设计简介 图 4.5第 4 章 汇编语言程序设计简介 ORG 1000H START: MOV DPTR, BLOCK ; 置地址指针置地址指针 MOV P2, DPH ; P2作地址指针高字节作地址指针高字节 MOV R7, LEN ; 置外循环计数初值置外循环计数初值 DEC R7 ; 比较与交换比较与交换 n-1次次 第 4 章 汇编语言程序设计简介 LOOP0: CLR F0 ; 交换标志清交换标志清 0 MOV R0, DPL; MOV R1, DPL ; 置相邻两数地址指针低字节置相邻两数地址指针低字节 INC R1 MOV R6, R7 ; 置内循环计数器初值置内循环计数器初值 LOOP1: MOVX A, R0 ; 取数取数 MOV B, A ; 暂存暂存 MOVX A, R1 ; 取下一个数取下一个数 CJNE A, B, NEXT; 相邻两数比较相邻两数比较, 不等转不等转 SJMP NOCHA ; 相等不交换相等不交换 第 4 章 汇编语言程序设计简介 NEXT: JC NOCHA ; Cy=1, 那么前者大于后者那么前者大于后者, 不用交换不用交换 SETB F0 ; 否那么否那么, 置交换标志置交换标志 MOVX R0, A ; XCH A, B ; 两数交换两数交换, 大者在前大者在前, 小者在后小者在后 MOVX R1, A ; NOCHA: INC R0 INC R1 ; 修正指针修正指针 DJNZ R6, LOOP1 ; 内循环未完内循环未完, 那么继续那么继续 JNB F0, EXIT ; 假设从未交换假设从未交换, 那么终了那么终了 DJNZ R7, LOOP0 ; 外循环未完外循环未完, 那么继续那么继续 EXIT: RET 第 4 章 汇编语言程序设计简介 4.2.4 子程序和参数传送子程序和参数传送 一、一、 子程序的概念子程序的概念 通通常常把把这这些些根根本本操操作作功功能能编编制制为为程程序序段段作作为为独独立立的的子子程程序序, 以以供供不不同同程程序序或或同同一一程程序序反反复复调调用用。在在程程序序中中需需求求执执行行这这种种操操作作的的地地方方放放置置一一条条调调用用指指令令, 当当程程序序执执行行到到调调用用指指令令, 就就转转到到子子程程序序中中完完成成规规定定的的操操作作, 并并前前往往到到原原来来的的程程序序继继 续续执行下去。执行下去。 第 4 章 汇编语言程序设计简介 第 4 章 汇编语言程序设计简介 二、二、 子程序的调用子程序的调用 1子子程程序序应应命命名名。子子程程序序入入口口即即子子程程序序的的第第一一条条指指令令应应加标号作为子程序名,以便主程序调用。加标号作为子程序名,以便主程序调用。2子子程程序序中中应应留留意意堆堆栈栈的的运运用用,以以维维护护和和恢恢复复现现场场。在在有有些些情情况况下下,假假设设子子程程序序需需求求改改动动主主程程序序中中某某些些存存放放器器或或存存储储单单元元的的结结果果,而而这这些些结结果果又又不不能能被被修修正正或或在在子子程程序序调调用用之之后后依依然然需需求求那那么么应应在在子子程程序序中中首首先先将将这这些些内内容容运运用用进进栈栈指指令令维护,在子程序前往之前运用出栈指令恢复现场。维护,在子程序前往之前运用出栈指令恢复现场。3子子程程序序的的结结尾尾必必需需为为子子程程序序前前往往指指令令RET,并并保保证证堆堆栈栈顶为调用程序的前往地址。栈栈顶为调用程序的前往地址。4子程序嵌套时应思索堆栈的深度。子程序嵌套时应思索堆栈的深度。第 4 章 汇编语言程序设计简介 5可可以以正正确确传传送送参参数数。参参数数分分为为入入口口与与出出口口参参数数。所所谓谓入入口口参参数数,即即调调用用子子程程序序之之前前,需需求求传传给给子子程程序序的的参参数数。所所谓谓出出口口参参数数,即即子子程程序序前前往往时时应应送送回回调调用用程程序序的的结结果果参参数数。应应根根据据详详细细情情况况选选择择不不同同的的参参数数传传送送方方式式,通通常常运运用用存存放放器器、存存储储器器或或堆栈的方式传送参数。堆栈的方式传送参数。6子子程程序序应应具具有有一一定定的的功功能能和和通通用用性性。对对于于操操作作数数应应尽尽量量运运用以地址或存放器方式给出用以地址或存放器方式给出,普通不针对详细的数据编写子程序。普通不针对详细的数据编写子程序。 7为为了了便便于于调调用用,子子程程序序应应提提供供足足够够的的信信息息。如如:子子程程序序名名、子子程程序序功功能能、入入口口参参数数和和出出口口参参数数、子子程程序序占占用用的的硬硬件件资资源源、子程序中调用的其他子程序名。子程序中调用的其他子程序名。第 4 章 汇编语言程序设计简介 【例例15】 把把内内部部RAM某某一一单单元元中中一一个个字字节节的的十十六六进进制制数数转转换换成成两两位位ASCII码码, 结结果果存存放放在在内内部部RAM的的延延续续两两个个单单元中。元中。 假假设设一一个个字字节节的的十十六六进进制制数数在在内内部部RAM 40H单单元元, 而而结结果果存存入入 50H, 51H单单元元, 可可以以用用堆堆栈栈进进展展参参数数传传送送, 程程序序如如下下: 第 4 章 汇编语言程序设计简介 MAIN: MOV R1, 50H ; R1 为存结果的指针为存结果的指针 MOV A, 40H ; A为需转换的十六进制数为需转换的十六进制数 SWAP A ; 先转换高位半字先转换高位半字 PUSH ACC ; 压栈压栈 LCALL HEASC ; 调用将低半字节的内容转换调用将低半字节的内容转换; 成成ASCII码子程序码子程序HEASC POP ACC MOV R1, A ; 存高半字节转换结果存高半字节转换结果 INC R1 PUSH 40H LCALL HEASC POP ACC MOV R1, A ; 存低半字节转换结果存低半字节转换结果 END第 4 章 汇编语言程序设计简介 HEASC: MOV R0, SP DEC R0 DEC R0 ; R0 指向十六进制数参数地址指向十六进制数参数地址 XCH A, R0 ; 取被转换参数取被转换参数 ANL A, 0FH ; 保管低半字节保管低半字节 ADD A, 2 ; 修正修正 A值值 MOVC A, A+PC ; 查表查表 XCH A, R0; 结果送回堆栈结果送回堆栈 RET TAB: DB 30H, 31H, 32H, 第 4 章 汇编语言程序设计简介 4.3 汇编程序设计实例汇编程序设计实例 4.3.1 散转程序设计散转程序设计4.3.2 查表程序查表程序4.3.3 延时程序延时程序4.3.4 数制转换数制转换 第 4 章 汇编语言程序设计简介 4.3.1 散转程序设计散转程序设计 散散转转程程序序是是分分支支程程序序的的一一种种, 它它可可根根据据运运算算结结果果或或输输入入数数据将程序转入不同的分支。据将程序转入不同的分支。 JMPA+DPTR, 用用它它可可以以很很容容易易地地实实现现散散转转功功能能。该该指指令令把把累累加加器器的的8 位位无无符符号号数数与与 16 位位数数据据指指针针的的内内容容相相加加, 并并把把相相加加的的结结果果装装入入程程序序计计数数器器PC, 控控制制程程序序转转向向目目的的地地址址去去执执行行。此此指指令令的的特特点点在在于于, 转转移移的的目目的的地地址址不不是是在在编编程程或或汇汇编编时时预预先先确确定定的的, 而而是是在在程程序序运运转转过过程程中中动动态态地地确确定定的的。目目的的地地址址是是以以数数据据指指针针 DPTR的的内内容容为为起起始始的的 256 字字节节范范围围内内的的指指定定地地址址, 即即由由 DPTR的的内内容容决决议议分分支支转转移移程程序序的的首首地地址址, 由由累累加加器器 A的的内内容来动态选择其中的某一个分支转移程序。容来动态选择其中的某一个分支转移程序。 第 4 章 汇编语言程序设计简介 【例例16】 根根据据任任务务存存放放器器R0 内内容容的的不不同同, 使使程程序序转转入相应的分支。入相应的分支。 (R0)=0 对应的分支程序标号为对应的分支程序标号为PR0; (R0)=1 对应的分支程序标号为对应的分支程序标号为PR1; (R0)=N 对应的分支程序标号为对应的分支程序标号为PRN。 第 4 章 汇编语言程序设计简介 程序如下程序如下: LP0: MOV DPTR, TAB ; 取表头地址取表头地址 MOV A, R0 ADD A, R0 ; R0内容乘以内容乘以2 JNC LP1 ; 无进位转移无进位转移 INC DPH ; 加进位位加进位位LP1: JMP A+DPTR; 跳至散转表中相应位置跳至散转表中相应位置 TAB: AJMP PR0 AJMP PR1 AJMP PRN 第 4 章 汇编语言程序设计简介 本本例例程程序序仅仅适适用用于于散散转转表表首首地地址址 TAB和和处处置置程程序序入入口口地地址址 PR0, PR1, , PRN在在同同一一个个 2 KB范范围围的的存存储储区区内内的的情情形形。假假设设超超出出 2 KB范范围围可可在在分分支支程程序序入入口口处处安安排排一一条条长长跳跳转指令转指令, 可采用如下程序可采用如下程序: MOV DPTR, TABMOV A, R0 MOV B, 03H ; 长跳转指令占长跳转指令占 3 个字节个字节MUL ABXCH A, B 第 4 章 汇编语言程序设计简介 ADD A, DPH MOV DPH, A XCH A, B JMP A+DPTR; 跳至散转表中相应的位置跳至散转表中相应的位置 TAB: LJMP PR0; 跳至不同的分支跳至不同的分支 LJMP PR1 LJMP PRN 第 4 章 汇编语言程序设计简介 4.3.2 查表程序设计查表程序设计 查查表表程程序序是是一一种种常常用用程程序序, 它它广广泛泛运运用用于于 LED显显示示控控制制、 打打印印机机打打印印控控制制、数数据据补补偿偿、数数值值计计算算、转转换换等等功功能能程程序序中中, 这类程序具有简单、执行速度快等特点。这类程序具有简单、执行速度快等特点。 所所谓谓查查表表法法, 就就是是预预先先将将满满足足一一定定精精度度要要求求的的表表示示变变量量与与函函数数值值之之间间关关系系的的一一张张表表求求出出, 然然后后把把这这张张表表存存于于单单片片机机的的程程序序存存储储器器中中, 这这时时自自变变量量值值为为单单元元地地址址, 相相应应的的函函数数值值为为该该地地址址单单元元中中的的内内容容。查查表表, 就就是是根根据据变变量量 X在在表表格格中中查查找找对对应应的函数值的函数值 Y, 使使 Y=f(X)。 第 4 章 汇编语言程序设计简介 MCS - 51指令系统中指令系统中, 有两条查表指令有两条查表指令: MOVC A, A+PC MOVC A, A+DPTR 第 4 章 汇编语言程序设计简介 【例【例17】一个十六进制数存放在内部】一个十六进制数存放在内部 RAM 的的 HEX单元的单元的低低 4 位中位中, 将其转换成将其转换成ASCII码并送回码并送回 HEX单元。单元。 十六进制十六进制:09的的ASCII码为码为 30H39H, AF的的ASCII码为码为 41H46H, ASCII码表格的首地址为码表格的首地址为ASCTAB。编程如下编程如下: 第 4 章 汇编语言程序设计简介 ASCTAB: DB 30H, 31H, 32H, 33H, 34H DB 35H, 36H, 37H, 38H, 39H DB 41H, 42H, 43H, 44H, 45H DB 46H 在这个程序中在这个程序中, 查表指令查表指令MOVC A, A+PC到表格首地址有两到表格首地址有两条指令条指令, 占用占用 3 个字节地址空间个字节地址空间, 故修正指针应加故修正指针应加 3。 ORG 1000H HEXASC: MOV A, HEX ANL A, 0FH ADD A, 3; 修正指针修正指针 MOVC A, A+PC MOV HEX, A RET 第 4 章 汇编语言程序设计简介 【例例18】 设设有有一一个个巡巡回回检检测测报报警警安安装装, 需需对对 96 路路输输入入进进展展控控制制, 每每路路有有一一个个额额定定的的最最大大值值, 是是双双字字节节数数。当当检检丈丈量量大大于于该该路路对对应应的的最最大大值值时时, 就就越越限限报报警警。假假设设R2 为为保保管管检检测测路路数数的的存存放放器器, 其其对对应应的的最最大大额额定定值值存存放放于于 31H和和 32H单元中。单元中。 查找最大额定值的程序如下查找最大额定值的程序如下: FMAX: MOV A, R2 ADD A, R2 ; 表中一个额定值为表中一个额定值为2个字节个字节 MOV 31H, A MOV DPTR, TAB ; 表首址表首址 第 4 章 汇编语言程序设计简介 MOVC A, A+DPTR; 查表读取第一个字节查表读取第一个字节 XCH A, 31H ; 第一个字节内容存入第一个字节内容存入31H INC DPTR MOVC A, A+DPTR; 查表读取第二个字节查表读取第二个字节 MOV 32H, A ; 第二字节的内容存入第二字节的内容存入32H TAB: DW 1230H, 1450H, . DW 2230H, 2440H, . DW 3120H, 3300H, . 第 4 章 汇编语言程序设计简介 【例例19】在在一一个个温温度度检检测测系系统统中中, 温温度度模模拟拟信信号号由由 10位位A/D输入。将输入。将A/D结果转换为对应温度值结果转换为对应温度值, 可采用查表方法实现。可采用查表方法实现。 先先由由实实验验测测试试出出整整个个温温度度量量程程范范围围内内的的A/D转转换换结结果果, 把把A/D转转换换结结果果000H3FFH所所对对应应的的温温度度值值组组织织为为一一个个表表存存储储在在程程序序存存储储器器中中, 那那么么就就可可以以根根据据检检测测到到的的模模拟拟量量的的A/D转转换换值值查查找出相应的温度值。找出相应的温度值。 设设测测得得的的A/D转转换换结结果果已已存存入入20H#, 21H单单元元中中高高位位字字节节在在20H中中, 低低位位字字节节在在21H中中, 查查表表得得到到的的温温度度值值存存放放在在22H#,23H单元高位字节在单元高位字节在 22H中中, 低位字节在低位字节在23H中。中。 第 4 章 汇编语言程序设计简介 程序如下程序如下: FTMP: MOV DPTR, TAB ; DPTR表首地址表首地址 MOV A, 21H ; 20H21H2 CLR C RLC A MOV 21H, A MOV A, 20H RLC A MOV 20H, A MOV A, 21H ; 表首地址表首地址+偏移量偏移量 ADDC A, DPL MOV DPL, A双字节双字节22第 4 章 汇编语言程序设计简介 MOV A, 20HADDC A, DPHMOV DPH, ACLR AMOVC A, A+DPTR; 查表得温度值高位字节查表得温度值高位字节MOV 22H, ACLR AINC DPTRMOVC A, A+DPTR; 查表得温度值低位字节查表得温度值低位字节MOV 23H, ARETTAB: DW 第 4 章 汇编语言程序设计简介 4.3.3 延时程序延时程序 在单片机运用系统中,经常需求用到准确的延在单片机运用系统中,经常需求用到准确的延时,普通来说,延时的设计主要经过两种途径实现:时,普通来说,延时的设计主要经过两种途径实现:运用硬件定时器延时或运用软件延时。运用硬件定时器延时或运用软件延时。 这里引见软件延时。所谓软件延时,即经过程这里引见软件延时。所谓软件延时,即经过程序到达延时的目的。详细来说,即设计一循环子程序到达延时的目的。详细来说,即设计一循环子程序,子程序的功能为用循环程序将指令反复多次执序,子程序的功能为用循环程序将指令反复多次执行一些无用的操作以到达延时的目的,经过修正循行一些无用的操作以到达延时的目的,经过修正循环次数,便可获得不同的延时时间。环次数,便可获得不同的延时时间。第 4 章 汇编语言程序设计简介 【例【例20】知单片机系统的晶振频率为】知单片机系统的晶振频率为12MHZ,试设计一软,试设计一软件延时程序,延时时间为件延时程序,延时时间为50ms。程序如下:程序如下:源程序源程序 机器周期机器周期(M) (M) 指令执行次数指令执行次数DELAYDELAY: MOV R1 MOV R1,#50#50 1 1 1 1 D1D1: MOV R2 MOV R2,#M#M1 1 R1R1D2D2: NOP NOP1 1 R1R2R1R2 NOP NOP1 1 R1R2R1R2 DJNZ R2DJNZ R2,D2D22 2 R1R2R1R2DJNZ R1DJNZ R1,D1D12 2 R1 R1 RETRET2 2 1 1 外外循循环环内内循循环环第 4 章 汇编语言程序设计简介 机器周期数是执行一条指令所需的时间,由于该单片机晶振频率机器周期数是执行一条指令所需的时间,由于该单片机晶振频率fosc为为12MHZ,因此其机器周期,因此其机器周期tj为:为:其中,内循环机器周期数其中,内循环机器周期数=1+1+2,假定内循环实现延时假定内循环实现延时1ms,那么应有下式成立:,那么应有下式成立:1ms=内循环机器周期数内循环机器周期数机器周期机器周期内循环次数,内循环次数,即即1103=1+1+21M,由此得:,由此得:第 4 章 汇编语言程序设计简介 将将M M代入子程序中,可计算得出总的机器周期数为:代入子程序中,可计算得出总的机器周期数为: 1+1+21+1+2250 + 2 + 1250 + 2 + 150 + 1 + 2 =5015350 + 1 + 2 =50153 其中,其中,为内循环机器周期数为内循环机器周期数为为MOV R2,#M和和DJNZ R1,D1两条指令的机器周期数两条指令的机器周期数为外循环次数为外循环次数 为为MOV R1,#50和和RET两条指令的机器周期数两条指令的机器周期数所以延时时间所以延时时间T总总=501531s=50.153ms第 4 章 汇编语言程序设计简介 可以看出,决议延时时间的要素主要有两个:即循环次数可以看出,决议延时时间的要素主要有两个:即循环次数与晶振频率。在晶振频率一定的情况下,可以经过增大循环次与晶振频率。在晶振频率一定的情况下,可以经过增大循环次数和运用多重循环的方法增长延时时间。此外,还应留意将循数和运用多重循环的方法增长延时时间。此外,还应留意将循环以外指令所破费的时间计算在内,否那么将影响精度。环以外指令所破费的时间计算在内,否那么将影响精度。第 4 章 汇编语言程序设计简介 4.3.4 数制转换数制转换 略略 【例【例21】将一个字节二进制数转换成】将一个字节二进制数转换成 3 位非紧缩型位非紧缩型BCD码。码。 设设一一个个字字节节二二进进制制数数在在内内部部RAM 40H单单元元, 转转换换结结果果放放入入内部内部 RAM 50H#, 51H, 52H单元中高位在前单元中高位在前, 程序如下程序如下: HEXBCD: MOV A, 40H MOV B, 100 DIV AB MOV 50H, A MOV A, 10 XCH A, B DIV AB MOV 51H, A MOV 52H, B RET 第 4 章 汇编语言程序设计简介 【例例22】设设 4 位位BCD码码依依次次存存放放在在内内存存 RAM中中 40H43H单单元元的的低低4 位位, 高高 4 位位都都为为 0, 要要求求将将其其转转换换为为二二进进制制数数, 结结果存入果存入 R2R3 中。中。 一个十进制数可表示为一个十进制数可表示为: Dn10n +Dn-110n-1 + + D0100 =Dn10+Dn-110+Dn-210+D0当当n=3时时, 上式可表示为上式可表示为: D310+D210+D110+D0 第 4 章 汇编语言程序设计简介 BCDHEX: MOV R0, 40H ; R0指向最高位地址指向最高位地址MOV R1, 03 ; 计数值送计数值送R1MOV R2, 0 ; 存放结果的高位清零存放结果的高位清零MOV A, R0MOV R3, A LOOP: MOV A, R3MOV B, 10MULABMOV R3, A ; (R3)10 的低的低 8 位送位送R3MOV A, BXCHA, R2 ; (R3)10的高的高 8 位暂存位暂存R2MOVB, 10 第 4 章 汇编语言程序设计简介 MUL AB ADD A, R2 MOV R2, A ; R210+ R310高高 8 位送位送R2 INC R0 ; 取下一个取下一个 BCD数数 MOV A, R3 ADD A, R0 MOV R3, A MOV A, R2 ADD C A, 0 ; 加低字节来的进位加低字节来的进位 MOV R2, A DJNZ R1, LOOP RET 第 4 章 汇编语言程序设计简介 本章小结本章小结本章重点引见了汇编言语程序设计的方法。现小结如下:本章重点引见了汇编言语程序设计的方法。现小结如下:1汇编言语程序设计步骤:汇编言语程序设计步骤:1分析问题,建立数学模型分析问题,建立数学模型2了解系统的硬件配置和性能目的,确定方案算法了解系统的硬件配置和性能目的,确定方案算法3用流程图表示出程序算法用流程图表示出程序算法4根据流程图编写源程序根据流程图编写源程序5调试运转程序。调试运转程序。2汇编控制指令汇编控制指令伪指令伪指令 ORG DB DW DS EQU DATA BIT END第 4 章 汇编语言程序设计简介 3 3常常用用程程序序构构造造: 顺顺序序程程序序、分分支支程程序序、循循环环程程序序、子子程序程序 顺顺序序程程序序又又称称简简单单程程序序,程程序序的的走走向向只只需需顺顺序序执执行行一一条条途途径。径。 分分支支程程序序由由条条件件转转移移指指令令构构成成程程序序判判别别部部分分,根根据据条条件件能能否否成成立立转转向向不不同同的的程程序序分分支支。包包括括:单单分分支支、双双分分支支和和多多向向分支程序构造。其中,多向分支的实现方法有四种:分支程序构造。其中,多向分支的实现方法有四种:1 1多次运用条件转移指令多次运用条件转移指令2 2运用分支地址表运用分支地址表3 3运用转移指令表运用转移指令表4 4运用地址偏移量表运用地址偏移量表第 4 章 汇编语言程序设计简介 u 循循环环程程序序主主要要针针对对具具有有多多次次反反复复执执行行的的程程序序段段的的程程序序构构造造,包括:单重循环和多重循环即循环嵌套,其程序构造为:包括:单重循环和多重循环即循环嵌套,其程序构造为:u1初始化部分初始化部分u2循环体循环体u3循环控制部分循环控制部分u4终了部分终了部分 u 循循环环终终了了的的控控制制方方法法主主要要有有两两种种:对对于于知知循循环环次次数数的的情情况况采采用用计计数数控控制制如如运运用用DJNZ指指令令;对对于于循循环环次次数数未未知知的情况采用设定循环终了特征标志的方法实现。的情况采用设定循环终了特征标志的方法实现。第 4 章 汇编语言程序设计简介 u 子子程程序序是是能能完完成成某某项项特特定定功功能能的的独独立立程程序序段段,可可被被反反复复调调用用。子程序应满足通用性的要求。子程序应满足通用性的要求。u对于运用子程序应留意的事项:对于运用子程序应留意的事项:u1子子程程序序入入口口即即子子程程序序的的第第一一条条指指令令,应应运运用用标标号号作作为为子子程序名。程序名。u2调调用用子子程程序序之之前前设设置置好好堆堆栈栈,对对于于子子程程序序嵌嵌套套须须思思索索堆堆栈容量。栈容量。u3用用前前往往指指令令RET终终了了子子程程序序,并并保保证证堆堆栈栈栈栈顶顶为为调调用用程程序的前往地址。序的前往地址。u4为为了了便便于于调调用用,子子程程序序应应提提供供足足够够的的信信息息。如如:子子程程序序名、子程序功能等。名、子程序功能等。u5正正确确传传送送参参数数,可可根根据据详详细细情情况况选选用用不不同同的的参参数数传传送送方方式,如:存放器传送、存储器传送或堆栈传送。式,如:存放器传送、存储器传送或堆栈传送。
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号