版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第 4 章 汇编语言程序设计简介 第第4章章 汇编言语程序设计简介汇编言语程序设计简介 4.1 汇编言语概述汇编言语概述 4.2 汇编言语程序设计汇编言语程序设计4.3 汇编程序设计实例汇编程序设计实例 第 4 章 汇编语言程序设计简介 4.1 汇编言语概述4.1.1 程序设计言语的分类及特点程序设计言语的分类及特点 可以完成一定功能的指令序列称为程序,用来设计计算可以完成一定功能的指令序列称为程序,用来设计计算机程序的言语称为程序设计言语,按照言语的构造及功能程机程序的言语称为程序设计言语,按照言语的构造及功能程序设计言语可分为:机器言语、汇编言语和高级言语。序设计言语可分为:机器言语、汇编
2、言语和高级言语。第 4 章 汇编语言程序设计简介 1机器言语机器言语 是计算机所能识别的独一言语,由二进制代码是计算机所能识别的独一言语,由二进制代码0和和1构成构成指令和数据。指令和数据。 其具有效率高、呼应速度快的特点,但由于机器言语编其具有效率高、呼应速度快的特点,但由于机器言语编写的程序依赖于计算机的构造,可移植性差,繁琐且难于记写的程序依赖于计算机的构造,可移植性差,繁琐且难于记忆、识别和调试,通常编程时,不采用机器言语。忆、识别和调试,通常编程时,不采用机器言语。第 4 章 汇编语言程序设计简介 2汇编言语汇编言语 是一种符号言语,指令由助记符表示。是一种符号言语,指令由助记符表示
3、。 与机器言语相比,汇编言语具有指令容易记忆、了解、与机器言语相比,汇编言语具有指令容易记忆、了解、识别和可读性好的优点,但本质上由于汇编言语也是面向识别和可读性好的优点,但本质上由于汇编言语也是面向机器的言语,是机器言语程序的符号表示,所以用户必需机器的言语,是机器言语程序的符号表示,所以用户必需熟习机器的硬件构造和指令系统,掌握计算机的任务过程熟习机器的硬件构造和指令系统,掌握计算机的任务过程才干熟练编程。才干熟练编程。 另外,汇编言语所编写的源程序与经过汇编所产生的另外,汇编言语所编写的源程序与经过汇编所产生的机器代码程序之间有明显的一一对应关系,所以汇编言语机器代码程序之间有明显的一一
4、对应关系,所以汇编言语编写的程序同样也存在通用性差,程序不能移植的缺陷。编写的程序同样也存在通用性差,程序不能移植的缺陷。第 4 章 汇编语言程序设计简介 3高级言语高级言语 高级言语是接近于人的自然言语方式的计算机编程言语高级言语是接近于人的自然言语方式的计算机编程言语的总称,例如的总称,例如C言语、言语、BASIC言语等都是高级言语。言语等都是高级言语。 和汇编言语相比,高级言语指令简单易学,用户容易掌和汇编言语相比,高级言语指令简单易学,用户容易掌握,且高级言语程序不依赖于详细的硬件构造和指令系统,握,且高级言语程序不依赖于详细的硬件构造和指令系统,程序可移植性好,但是高级言语编写的源程
5、序必需经过编程序可移植性好,但是高级言语编写的源程序必需经过编译或解释程序翻译成目的程序,机器才干执行,而生成的译或解释程序翻译成目的程序,机器才干执行,而生成的目的程序需占用较多的存储单元,执行时间较长,运转效目的程序需占用较多的存储单元,执行时间较长,运转效率较低。率较低。第 4 章 汇编语言程序设计简介 4.1.2 单片机汇编言语源程序的编辑和汇编单片机汇编言语源程序的编辑和汇编汇编言语的指令类型汇编言语的指令类型 汇编言语源程序由两种类型的汇编言语语句即指令汇编言语源程序由两种类型的汇编言语语句即指令构成。语句按性质不同分为两类:指令性语句机器指令构成。语句按性质不同分为两类:指令性语
6、句机器指令和指示性语句伪指令。和指示性语句伪指令。1机器指令机器指令 指令系统中的全部指令,每条指令都有对应的机器代码,指令系统中的全部指令,每条指令都有对应的机器代码,是机器真正可以执行的指令。是机器真正可以执行的指令。2 伪指令伪指令 为汇编程序在汇编过程中提供控制或指示信息,并不直接为汇编程序在汇编过程中提供控制或指示信息,并不直接产活力器代码,属于机器不能执行的指令类型。产活力器代码,属于机器不能执行的指令类型。第 4 章 汇编语言程序设计简介 汇编汇编 计算机不能直接识别和执行源程序。因此源程序必需计算机不能直接识别和执行源程序。因此源程序必需经过汇编程序汇编产活力器码目的程序文件,
7、程序才干执经过汇编程序汇编产活力器码目的程序文件,程序才干执行。这种将汇编言语源程序转换成机器言语程序的过程称行。这种将汇编言语源程序转换成机器言语程序的过程称为汇编。为汇编。汇编言语汇编言语源程序源程序汇编程序汇编程序目的文件和源程序列表目的文件和源程序列表经过经过汇编后汇编后第 4 章 汇编语言程序设计简介 汇编言语源程序的汇编过程分为手工汇编和机器汇编。汇编言语源程序的汇编过程分为手工汇编和机器汇编。 所谓手工汇编,即采用人工查指令表的方法将汇编指令翻所谓手工汇编,即采用人工查指令表的方法将汇编指令翻译成相应机器代码。译成相应机器代码。 通常源程序的人工汇编需求两次才干完成,第一次汇编查
8、通常源程序的人工汇编需求两次才干完成,第一次汇编查找每条指令的机器代码,第二次汇编完成地址偏移量的计算。找每条指令的机器代码,第二次汇编完成地址偏移量的计算。 由于手工汇编需求计算和查找,繁琐而且容易出错,而且由于手工汇编需求计算和查找,繁琐而且容易出错,而且程序修正时能够会引起指令的地址变化,转移指令的偏移量也程序修正时能够会引起指令的地址变化,转移指令的偏移量也随之改动,需求重新计算,所以手工汇编主要运用于设计短小随之改动,需求重新计算,所以手工汇编主要运用于设计短小程序或调试程序的场所。程序或调试程序的场所。第 4 章 汇编语言程序设计简介 所谓机器汇编,即采用汇编程序对源程序进展自动汇
9、编,所谓机器汇编,即采用汇编程序对源程序进展自动汇编,由于单片机软硬件资源的限制,该过程通常借助于由于单片机软硬件资源的限制,该过程通常借助于PC系统机系统机实现,象这种借助于一种计算机而为另一种计算机产生目的实现,象这种借助于一种计算机而为另一种计算机产生目的代码的汇编方式又称为交叉汇编。代码的汇编方式又称为交叉汇编。 交叉汇编的原理类似于手工汇编,在汇编程序中通常存交叉汇编的原理类似于手工汇编,在汇编程序中通常存入了两张表,即入了两张表,即MCS-51单片机的指令代码表和伪指令表。汇单片机的指令代码表和伪指令表。汇编程序通常经过两次扫描完成汇编,第一次扫描查找源程序编程序通常经过两次扫描完
10、成汇编,第一次扫描查找源程序中每条指令的机器代码,第二次扫描完成地址偏移量的计算,中每条指令的机器代码,第二次扫描完成地址偏移量的计算,汇编后生成目的文件和列表文件。这是目前运用较广的汇编汇编后生成目的文件和列表文件。这是目前运用较广的汇编方法。方法。第 4 章 汇编语言程序设计简介 汇编的主要功能为:汇编的主要功能为:1确定程序中每条汇编言语指令的指令机器码。确定程序中每条汇编言语指令的指令机器码。2确定每条指令在程序存储器中的存放地址。确定每条指令在程序存储器中的存放地址。3提供语法、编辑等方面的错误信息,但不能提供程序的提供语法、编辑等方面的错误信息,但不能提供程序的逻辑错误。逻辑错误。
11、4产生目的执行文件产生目的执行文件*.OBJ/*.HEX)和列表文件和列表文件*.LST。第 4 章 汇编语言程序设计简介 4.1.3 伪伪 指指 令令 一、一、 汇编起始指令汇编起始指令 ORG 指令格式为指令格式为: ORG 16位地址位地址 该指令的作用是指明后面的程序或数据块的起始地址该指令的作用是指明后面的程序或数据块的起始地址, 它总是出如今每段源程序或数据块的开场。它总是出如今每段源程序或数据块的开场。 16 位地址位地址, 确定了此语句后面第一条指令或第一个数据确定了此语句后面第一条指令或第一个数据的地址的地址,以后的源程序或数据块就依次延续存放在以后的地址以后的源程序或数据块
12、就依次延续存放在以后的地址内内, 直到遇到另一个直到遇到另一个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 数字或
13、汇编符号数字或汇编符号 功能功能: 使指令中的字符称号等价于给定的数字或汇编符号。使指令中的字符称号等价于给定的数字或汇编符号。 运用等值指令可给程序的编制、调试、修正带来方便:运用等值指令可给程序的编制、调试、修正带来方便:假设在程序中要多次运用到某一地址,由假设在程序中要多次运用到某一地址,由EQU指令将其赋值指令将其赋值给一个字符称号,一旦需求对其进展变动,只需改动给一个字符称号,一旦需求对其进展变动,只需改动EQU命命令后面的数字即可,而不需求对程序中涉及到该地址的一切令后面的数字即可,而不需求对程序中涉及到该地址的一切指令逐句进展修正。指令逐句进展修正。第 4 章 汇编语言程序设计简
14、介 留意留意, 由由EQU等值的字符称号必需先赋值后运用,且等值的字符称号必需先赋值后运用,且在同一个源程序中,同一个标号只能赋值一次。在同一个源程序中,同一个标号只能赋值一次。 例例: PA8155 EQU 8001H即给标号即给标号PA8155赋值为赋值为8001H。 第 4 章 汇编语言程序设计简介 三、三、 定义字节指令定义字节指令DB 指令格式指令格式: 标号标号: DB 8位二进制数表位二进制数表 功能功能: 把把 8 位二进制数表依次存入从标号开场的延续的存位二进制数表依次存入从标号开场的延续的存储单元中。储单元中。 格式中格式中, 标号区段可有可无标号区段可有可无, DB指令之
15、后的指令之后的 8 位二进制数位二进制数表是字节常数或用逗号隔开的字节串表是字节常数或用逗号隔开的字节串, 也可以是用引号括起来也可以是用引号括起来的的ASCII码字符串码字符串 (一个一个 ASCII字符相当于一个字节字符相当于一个字节)。 例例: 第 4 章 汇编语言程序设计简介 ORG 1000HBUF1: DB 38H, 7FH, 80HBUF2: DB 45H, 66H ORG伪指令指定了标号伪指令指定了标号BUF1的地址为的地址为1000H, 而而DB伪指令是将其后的二进制数表伪指令是将其后的二进制数表38H, 7FH, 80H依依次存放在次存放在1000H, 1001H, 100
16、2H 3 个延续单元之中个延续单元之中, BUF2也是一个标号也是一个标号, 其地址与前一条伪指令延续其地址与前一条伪指令延续, 即即1003H, 1004H地址单元中依次存放地址单元中依次存放 45H, 66H。 第 4 章 汇编语言程序设计简介 四、四、 定义字指令定义字指令DW 指令格式指令格式: 标号标号: DW 16 位数据表位数据表 该指令的功能与该指令的功能与DB类似类似, 区别仅在于从指定地址开场存区别仅在于从指定地址开场存放的是指令中的放的是指令中的 16 位数据位数据, 而不是字节串。每个而不是字节串。每个 16 位数据位数据要占两个存储单元要占两个存储单元, 高高8 位先
17、存位先存, 低低 8 位后存位后存, 这和这和MCS -51指指令中的令中的16位数据存放顺序是一致的。位数据存放顺序是一致的。 第 4 章 汇编语言程序设计简介 五、五、DSDefine Store定义存储区指令定义存储区指令功能为:从指定的单元地址开场,保管一定数量的存储单元,功能为:从指定的单元地址开场,保管一定数量的存储单元,以备运用。以备运用。指令格式:指令格式: 标号:标号: DS 表达式表达式其中,表达式指定保管的内存单元个数。其中,表达式指定保管的内存单元个数。例如,例如,ORG 1000H DS 10TAB: DB 10H 汇编结果:从汇编结果:从1000H地址处开场,保管地
18、址处开场,保管10个字节单元。个字节单元。100AH=10H。第 4 章 汇编语言程序设计简介 六、六、BIT位地址符号指令位地址符号指令指令功能为:将位地址赋值给指定的符号称号,通常用于位符指令功能为:将位地址赋值给指定的符号称号,通常用于位符号地址的定义。号地址的定义。指令如下:指令如下: 字符称号字符称号BIT 位地址位地址例如,例如,X1 BIT P1.0 汇编结果为将位地址汇编结果为将位地址P1.0赋给变量赋给变量X1,即在程序中便可,即在程序中便可运用运用X1替代位地址替代位地址P1.0。第 4 章 汇编语言程序设计简介 七、七、DATA数据地址赋值指令数据地址赋值指令 指令功能:
19、将数据地址或指令代码地址赋值给所指定指令功能:将数据地址或指令代码地址赋值给所指定的标号。通常在程序中用于定义数据地址。指令格式如下:的标号。通常在程序中用于定义数据地址。指令格式如下: 标号:标号:DATA 表达式表达式例如,例如,AA:DATA 2000H汇编结果为:汇编结果为:AA=2000H。第 4 章 汇编语言程序设计简介 【留意】:【留意】:DATA与与EQU的区别在于:的区别在于:1EQU定义的标识符在汇编时不在符号表中登记,因此定义的标识符在汇编时不在符号表中登记,因此必需先定义后运用;必需先定义后运用;2DATA定义的标识符汇编时在符号表中登记,所以可定义的标识符汇编时在符号
20、表中登记,所以可以先运用后定义。以先运用后定义。第 4 章 汇编语言程序设计简介 八、八、 汇编终了指令汇编终了指令END 指令格式指令格式: 标号标号: END 地址或标号地址或标号 格式中标号以及格式中标号以及END后面的地址或标号可有可无。后面的地址或标号可有可无。 功能功能: 提供汇编终了标志。提供汇编终了标志。 汇编程序遇到汇编程序遇到 END后就停顿汇编后就停顿汇编, 对对 END以后的语句以后的语句不予处置不予处置, 故故 END应放在程序的终了处。应放在程序的终了处。 第 4 章 汇编语言程序设计简介 4.2 汇编言语程序设计汇编言语程序设计 4.2.0 程序设计步骤程序设计步
21、骤4.2.1 顺序构造顺序构造4.2.2 分支构造分支构造4.2.3 循环构造循环构造4.2.4 子程序调用子程序调用第 4 章 汇编语言程序设计简介 4.2.0 程序设计程序设计 步骤步骤 对于简单程序的编写,程序设计者往往可以立刻完成软对于简单程序的编写,程序设计者往往可以立刻完成软件的构思与编写,而对于比较复杂的程序设计问题,那么需件的构思与编写,而对于比较复杂的程序设计问题,那么需求科学合理的程序设计步骤。从软件工程角度来说,开发一求科学合理的程序设计步骤。从软件工程角度来说,开发一个运用程序,普通需求经过以下几个步骤:个运用程序,普通需求经过以下几个步骤:第 4 章 汇编语言程序设计
22、简介 第 4 章 汇编语言程序设计简介 4.2.1 顺序程序设计顺序程序设计 顺序程序是程序设计中最根本的构造,又称顺序程序是程序设计中最根本的构造,又称为简单程序。特点为顺序执行每一条指令,直到为简单程序。特点为顺序执行每一条指令,直到最后。其执行过程如图最后。其执行过程如图4-3所示。所示。 S1S2图4-3 顺序构造第 4 章 汇编语言程序设计简介 【例【例 1】 两个无符号双字节数相加。两个无符号双字节数相加。 设被加数存放于内部设被加数存放于内部RAM的的40H高位字节高位字节, 41H低低位字节位字节, 加数存放于加数存放于50H高位字节高位字节, 51H低位字节低位字节, 和数存
23、入和数存入 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 ; 指向加数高位字
24、节指向加数高位字节 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. 分支程序构造分支
25、程序构造第 4 章 汇编语言程序设计简介 【例【例5】 x, y均为均为8位二进制数位二进制数, 设设 x存入存入R0, y存入存入R1, 求解求解: 011y000 xxx2. 普通分支程序构造实例普通分支程序构造实例第 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 ; R0
26、0, 那么那么 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 ; 第一
27、个数的指针第一个数的指针 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
28、第 4 章 汇编语言程序设计简介 在实践运用时,通常遇到根据某变量取值不同从而转向不在实践运用时,通常遇到根据某变量取值不同从而转向不同分支的标题,这时经常采用分支表法。常用的分支表主要有同分支的标题,这时经常采用分支表法。常用的分支表主要有三种方式:转移指令表、分支地址表和地址偏移量表。三种方式:转移指令表、分支地址表和地址偏移量表。 本质上都是利用散转指令本质上都是利用散转指令JMP A+DPTR来实现的。的目的来实现的。的目的地址。地址。3. 分支表法实现多向分支程序的设计分支表法实现多向分支程序的设计间接转移指令间接转移指令 JMP A+DPTR ;PCA+DPTR实现散转的方法主要有
29、两种:实现散转的方法主要有两种:1累加器累加器A清零,根据清零,根据DPTR的内容决议转移的目的地址。的内容决议转移的目的地址。2DPTR的值作为基址不变,根据累加器的值作为基址不变,根据累加器A的内容决议转移的内容决议转移的目的地址。的目的地址。第 4 章 汇编语言程序设计简介 【例【例7】根据】根据R2的内容,转向相应的分支程序。即:的内容,转向相应的分支程序。即:R2=0,转向,转向PROG0R2=1,转向,转向PROG1R2=n,转向,转向PROGn可采用方法:可采用方法:1运用转移指令表。运用转移指令表。 2运用分支地址表。运用分支地址表。3运用地址偏移量表。运用地址偏移量表。 第
30、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+R2A+DPTRJMP
31、TAB+R23 3JMP 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 ;散转;散转;转移指令表;转移指
32、令表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 DP
33、TR,#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运用分支地址表。运用分支地址表。 所谓分支地址表是指由各个分支程序的入口地址组成的线性表,所谓分支地址表是指由各个分支程序的入口地址组成
34、的线性表,每个入口地址占两个延续字节单元。每个入口地址占两个延续字节单元。 设设PROG0PROGn为分支程序入口地址,分支地址表如下图。为分支程序入口地址,分支地址表如下图。BRANCHTAB:DW PROG0 DW PROG1 DW PROGn第 4 章 汇编语言程序设计简介 DPTRBRANCHTABDPTRBRANCHTABAR2AR22 2JMP A+DPTRJMP A+DPTR 分支程序分支程序PROG0PROG0 分支程序分支程序PROGnPROGn分支程序分支程序PROG1PROG1DPTRDPTR运用运用MOVC A,A+DPTRMOVC A,A+DPTR取分支地址取分支地址
35、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
36、 ;指向下一个存储单元;指向下一个存储单元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运用地址偏移量表。运用地址偏移
37、量表。 所谓地址偏移量表,是指由各分支程序段的入口地址与所谓地址偏移量表,是指由各分支程序段的入口地址与地址偏移量表的标号差即地址偏移量构成的线性表。其地址偏移量表的标号差即地址偏移量构成的线性表。其中地址偏移量表中每项占一个字节,如下图。中地址偏移量表中每项占一个字节,如下图。;PROG0PROGn为分支程序入口地址为分支程序入口地址TAB: DB PROG0-TAB DB PROG1-TAB DB PROGn-TAB图图4-12 地址偏移量表地址偏移量表第 4 章 汇编语言程序设计简介 DPTRTABDPTRTABAR2AR2JMP A+DPTRJMP A+DPTR 分支程序分支程序PRO
38、G0PROG0 分支程序分支程序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获得分支程
39、序地址实现跳获得分支程序地址实现跳TAB:DB PROG0-TAB ;地址偏移量表;地址偏移量表DB PROG1-TAB DB PROGn-TABPROG0:PROGn:运用地址偏移量表实现多向分支时,应留意要使地址偏移量表与各分支程序运用地址偏移量表实现多向分支时,应留意要使地址偏移量表与各分支程序的长度和在同一页的长度和在同一页256字节范围内,因此该方法适用于分支较少的情况。字节范围内,因此该方法适用于分支较少的情况。JMP A+DPTR ;PC(A)+(DPTR)第 4 章 汇编语言程序设计简介 4.2.3 循环程序设计循环程序设计 1、 循环构造循环构造2、循环构造实例、循环构造实例
40、 1单循环单循环 2多重循环多重循环第 4 章 汇编语言程序设计简介 一、一、 循环构造循环构造 图 4.4 第 4 章 汇编语言程序设计简介 循环程序普通由四个主要部分组成循环程序普通由四个主要部分组成: (1) 初始化部分初始化部分: 为循环程序做预备为循环程序做预备, 如规定循环次数、如规定循环次数、 给给各变量和地址指针预置初值。各变量和地址指针预置初值。 (2) 处置部分处置部分: 为反复执行的程序段为反复执行的程序段, 是循环程序的实体是循环程序的实体, 也也是循环程序的主体。是循环程序的主体。 (3) 循环控制部分循环控制部分: 这部分的作用是修正循环变量和控制变这部分的作用是修
41、正循环变量和控制变量量, 并判别循环能否终了并判别循环能否终了, 直到符合终了条件时直到符合终了条件时, 跳出循环为止。跳出循环为止。 (4) 终了部分终了部分: 这部分主要是对循环程序的结果进展分析、这部分主要是对循环程序的结果进展分析、 处置和存放。处置和存放。 第 4 章 汇编语言程序设计简介 【例【例 8】 任务单元清零。任务单元清零。 在运用系统程序设计时在运用系统程序设计时, 有时经常需求将存储器中各部有时经常需求将存储器中各部分地址单元作为任务单元分地址单元作为任务单元, 存放程序执行的中间值或执行结存放程序执行的中间值或执行结果果, 任务单元清零任务经常放在程序的初始化部分中。
42、任务单元清零任务经常放在程序的初始化部分中。 设有设有50个任务单元个任务单元, 其首址为外部存储器其首址为外部存储器8000H单元单元, 那那么其任务单元清零程序如下么其任务单元清零程序如下: 二、二、 循环构造实例循环构造实例 1 单循环单循环第 4 章 汇编语言程序设计简介 CLEAR: CLR A MOV DPTR, 8000H ; 任务单元首址送指针任务单元首址送指针 MOV R2, 50 ; 置循环次数置循环次数CLEAR1: MOVX DPTR, A INC DPTR ; 修正指针修正指针 DJNZ R2, CLEAR1 ; 控制循环控制循环 RET 第 4 章 汇编语言程序设计
43、简介 【例【例 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 ; 循环加法循环加法
44、INC R1; 修正地址指针修正地址指针 DJNZ R2, LOOP ; 修正计数器并判别修正计数器并判别 MOV SUM, A; 存和存和 RET 第 4 章 汇编语言程序设计简介 【例【例10】求最小值。设内部】求最小值。设内部RAM中有一无符号数数据块,中有一无符号数数据块,其首地址为其首地址为BLOCK,长度存于,长度存于LEN单元,试求出数据块中单元,试求出数据块中的最小值,存入的最小值,存入MIN单元。单元。分析分析:求最小值时求最小值时,通常采用比较交换的方法。通常采用比较交换的方法。即首先取第一个数作为基准,然后将基准数与第二个数进即首先取第一个数作为基准,然后将基准数与第二个
45、数进展比较,假设基准数大于第二个数,那么两数进展交换;展比较,假设基准数大于第二个数,那么两数进展交换;假设基准数小于第二个数那么不进展交换,总之保证基准假设基准数小于第二个数那么不进展交换,总之保证基准数单元中的值为最小值,再取下一个数与基准数进展比较,数单元中的值为最小值,再取下一个数与基准数进展比较,不断到一切数据比较完为止,那么基准数单元中的数那么不断到一切数据比较完为止,那么基准数单元中的数那么为最小值。依此类推,求最大值也可采用类似方法。为最小值。依此类推,求最大值也可采用类似方法。第 4 章 汇编语言程序设计简介 详细程序编写如下:详细程序编写如下:ORG 1000HMIN: D
46、ATA 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】设片内】设片内RA
47、M中有一无符号数数据块,其首地址为中有一无符号数数据块,其首地址为BLOCK,长度未知,但数据终了标志存于,长度未知,但数据终了标志存于LEN单元,求数单元,求数据块的最小值并存于据块的最小值并存于MIN单元中。单元中。 可以看出,这是一个循环次数未知的例题,经过设定特征可以看出,这是一个循环次数未知的例题,经过设定特征值控制循环终了条件。值控制循环终了条件。第 4 章 汇编语言程序设计简介 ORG 1000HMIN: DATA 20HLEN: DATA 21HBLOCK:DATA 22HMAIN: MOV R1,#BLOCK;数表首地址;数表首地址 MOV B,R1;取第一个数作为基准;取第
48、一个数作为基准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单元开场的延续单元依单元开场的延续单元依次存放了一串字符次存放了一串字符, 该字符串以回车符为终了标志该字符串以回车
49、符为终了标志, 要求测试要求测试该字符串的长度。该字符串的长度。 程序如下程序如下: 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, 计算出一条指令以致一个循计算出一条指令以致一个循环所需求
50、的执行时间环所需求的执行时间, 给出相应的循环次数给出相应的循环次数, 便能到达延时的便能到达延时的目的。目的。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 章 汇编语言程序设计简介 上例程序中采用了多重循环程序上例程序中采用了多重循环程序, 即在一个循环体中又包即在一个循环体中又包含了其它的循环程序含了其它的循环程序, 这种方式是实现延时程序的常用方法。这种方式是实现延时程序的常用
51、方法。 运用多重循环时运用多重循环时, 必需留意必需留意: (1 循环嵌套循环嵌套, 必需层次清楚必需层次清楚, 不允许产生内外层循环交叉。不允许产生内外层循环交叉。 (2 外循环可以一层层向内循环进入外循环可以一层层向内循环进入, 终了时由里往外一终了时由里往外一层层退出。层层退出。 (3 内循环可以直接转入外循环内循环可以直接转入外循环, 实现一个循环由多个条实现一个循环由多个条件控制的循环构造方式。件控制的循环构造方式。 第 4 章 汇编语言程序设计简介 【例【例 14】 在外部在外部 RAM中中, BLOCK开场的单元中有一无开场的单元中有一无符号数据块符号数据块, 其个数为其个数为L
52、EN个字节。试将这些无符号数按递减个字节。试将这些无符号数按递减次序重新陈列次序重新陈列, 并存入原存储区。并存入原存储区。 略略第 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; M
53、OV 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 ; 否那么否那么, 置交换标志置交换标志
54、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 子程序和参数传送子程序和参数传送 一、一、 子程序的概念子程序的概念 通常把这些根本操作功能编制为程序段作为独
55、立的子程通常把这些根本操作功能编制为程序段作为独立的子程序序, 以供不同程序或同一程序反复调用。在程序中需求执行这以供不同程序或同一程序反复调用。在程序中需求执行这种操作的地方放置一条调用指令种操作的地方放置一条调用指令, 当程序执行到调用指令当程序执行到调用指令, 就就转到子程序中完成规定的操作转到子程序中完成规定的操作, 并前往到原来的程序继并前往到原来的程序继 续执续执行下去。行下去。 第 4 章 汇编语言程序设计简介 第 4 章 汇编语言程序设计简介 二、二、 子程序的调用子程序的调用 1子程序应命名。子程序入口即子程序的第一条指令应子程序应命名。子程序入口即子程序的第一条指令应加标号
56、作为子程序名,以便主程序调用。加标号作为子程序名,以便主程序调用。2子程序中应留意堆栈的运用,以维护和恢复现场。在子程序中应留意堆栈的运用,以维护和恢复现场。在有些情况下,假设子程序需求改动主程序中某些存放器或有些情况下,假设子程序需求改动主程序中某些存放器或存储单元的结果,而这些结果又不能被修正或在子程序调存储单元的结果,而这些结果又不能被修正或在子程序调用之后依然需求那么应在子程序中首先将这些内容运用进用之后依然需求那么应在子程序中首先将这些内容运用进栈指令维护,在子程序前往之前运用出栈指令恢复现场。栈指令维护,在子程序前往之前运用出栈指令恢复现场。3子程序的结尾必需为子程序前往指令子程序
57、的结尾必需为子程序前往指令RET,并保证堆,并保证堆栈栈顶为调用程序的前往地址。栈栈顶为调用程序的前往地址。4子程序嵌套时应思索堆栈的深度。子程序嵌套时应思索堆栈的深度。第 4 章 汇编语言程序设计简介 5可以正确传送参数。参数分为入口与出口参数。所谓入可以正确传送参数。参数分为入口与出口参数。所谓入口参数,即调用子程序之前,需求传给子程序的参数。所谓出口参数,即调用子程序之前,需求传给子程序的参数。所谓出口参数,即子程序前往时应送回调用程序的结果参数。应根据口参数,即子程序前往时应送回调用程序的结果参数。应根据详细情况选择不同的参数传送方式,通常运用存放器、存储器详细情况选择不同的参数传送方
58、式,通常运用存放器、存储器或堆栈的方式传送参数。或堆栈的方式传送参数。6子程序应具有一定的功能和通用性。对于操作数应尽量子程序应具有一定的功能和通用性。对于操作数应尽量运用以地址或存放器方式给出运用以地址或存放器方式给出,普通不针对详细的数据编写子程普通不针对详细的数据编写子程序。序。 7为了便于调用,子程序应提供足够的信息。如:子程序为了便于调用,子程序应提供足够的信息。如:子程序名、子程序功能、入口参数和出口参数、子程序占用的硬件资名、子程序功能、入口参数和出口参数、子程序占用的硬件资源、子程序中调用的其他子程序名。源、子程序中调用的其他子程序名。第 4 章 汇编语言程序设计简介 【例【例
59、15】 把内部把内部RAM某一单元中一个字节的十六进制某一单元中一个字节的十六进制数转换成两位数转换成两位ASCII码码, 结果存放在内部结果存放在内部RAM的延续两个单的延续两个单元中。元中。 假设一个字节的十六进制数在内部假设一个字节的十六进制数在内部RAM 40H单元单元, 而结而结果存入果存入 50H, 51H单元单元, 可以用堆栈进展参数传送可以用堆栈进展参数传送, 程序如下程序如下: 第 4 章 汇编语言程序设计简介 MAIN: MOV R1, 50H ; R1 为存结果的指针为存结果的指针 MOV A, 40H ; A为需转换的十六进制数为需转换的十六进制数 SWAP A ; 先
60、转换高位半字先转换高位半字 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 ; 取被转换参数取被转换参
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 六年级下册数学试题-小升初专项练习题及答案-人教版
- 六年级音乐教学工作计划
- 六年级教材分析
- 会计实训总结
- 福建省南安市柳城义务教育小片区2026届中考语文考试模拟冲刺卷含解析
- 保温胶泥及真石漆施工方案
- 创建社区医院汇报材料
- 六年级语文教学设计
- 大学生入学教育习题及答案10套
- 2026 学龄前自闭症空间认知训练课件
- 2025年《青铜葵花》(曹文轩)阅读测试题和答案
- (完整版)气体灭火系统安装施工方案
- (正式版)T∕CPCPA 0017-2026 托育机构婴幼儿回应性照护服务规范
- 2026年北京市西城区初三一模英语试卷(含答案)
- 九师联盟2026届高三年级下学期4月测试英语试卷
- 新高考浪潮下生物学教学中学习共同体的构建与实践探索
- 2024年高考化学试卷(重庆)
- 2026年广东佛山市高三二模高考物理模拟试卷试题(含答案详解)
- T/CEC 211-2019 火电工程脚手架安全管理导则
- GB/T 16271-2025钢丝绳吊索插编索扣
- DBJ-T 15-94-2013静压预制混凝土桩基础技术规程(广东省标准)
评论
0/150
提交评论