4 汇编程序设计
第4章汇编语言程序设计PPT教学课件
图 分支程序结构流程图
2020/12/11
《单片机应用技术》教学课件
12Leabharlann 第4章 汇编语言程序设计条件满足? Y
A
4.2.2 分支程序结构
第4章 汇编语言程序设计
目的:1.进一步熟悉指令系统 2.会编写简单的程序 3.上机训练
内容:4.1 汇编语言程序设计概述
4.2 三种程序结构 4.3 程序设计举例
2020/12/11
《单片机应用技术》教学课件
1
第4章 汇编语言程序设计
4.1 汇编语言程序设计概述
所谓程序设计,就是按照给定的任务要求,编写 出完整的计算机程序。要完成同样的任务,使用的方 法或程序并不是唯一的。
汇编后: (1000H)=12H (1001H ) = 34H
(1002H ) = 00H ( 1003H ) = ABH (1004H ) =00H (1005H) =0AH
2020/12/11
《单片机应用技术》教学课件
7
第4章 汇编语言程序设计
• (6)定义存储区伪指令DS
• 功能:从指定地址开始预留一定数量的内 存单元,以备源程序执行过程中使用。预
(4) 编写源程序
(5) 程序优化。
(6)上机调试、修改和最后确定源程序。
2020/12/11
《单片机应用技术》教学课件
10
第4章 汇编语言程序设计
4.2.1 顺序程序设计
顺序结构程序是一种最简单、最基本的程序,按照程序编 写的顺序依次执行。
【例4-1】两个多字节数加法
1.两个三字节无符号相加,其中被加数在内部RAM的 50H、51H和52H单元中;加数在内部RAM的53H、54H和 55H单元中;要求把相加之和存放在50H、51H和52H单元中 进位存放在位寻址区的00H位中。
第4章 汇编语言程序设计
因此, 因此,对例子中的存储器地址作如下运 算: SUM+2 CYCLE-5 NOT_DONE-GO 是有效的表达式。 是有效的表达式。而 SUM-CYCLE
(2)逻辑运算符 逻辑运算符是按位操作的AND、OR、 、 逻辑运算符是按位操作的 、 XOR和NOT。 和 。 1010 1010 1010 1010B AND 1100 1100 1100 1100B=1000 1000 1000 1000B 1100 1100 1100 1100B OR 1111 0000 1111 0000B=1111 1100 1111 1100B NOT 1111 1111 1111 1111B=0000 0000 0000 0000B
ASSUME CS:MY_CODE, ;规定 和DS 规定CS和 : 的内容 DS:MY_DATA : PORT_VA1 EQU 3 ;端口的符号名 GO: MOV AX, MY_DATA ;DS : 初始化为MY_DATA 初始化为 MOV DS, AX MOV SUM, 0 ;清SUM单元 单元
变量可以具有以下几种寻址方式: 变量可以具有以下几种寻址方式: ① 直接寻址 ② 基址寻址 变址(索引) ③ 变址(索引)寻址 ④ 基址变址寻址
2.运算符(Operators) .运算符( ) 算术运算符( Operators) ① 算术运算符(Arithmetic Operators) 逻辑运算符( Operators) ② 逻辑运算符(Logical Operators) 关系运算符( Operators) ③ 关系运算符(Relational Operators) 分析运算符( Operators) ④ 分析运算符(Analytic Operators) 合成运算符( Operators) ⑤ 合成运算符(Synthetic Operators)
第四章-汇编语言程序的设计
第四章汇编语言程序设计本章的汇编语言程序设计的主要容有:汇编语言程序设计概述、汇编语言程序的结构形式、汇编语言的伪指令。
(一个单片机应用系统和其它计算机系统一样,在完成一项具体工作的时候,它要按照一定的次序,去执行操作,这些操作实际上就是由设计人员,以单片机能够接受的指令编制的程序,那么无论计算机也好,单片机也好,实际上编制程序的过程,就是用计算机来反映设计者的编程思想,那么这一章中,我们将向大家介绍怎样使用单片机指令系统来编制一些应用程序。
在介绍之前,我们还是来学习汇编语言的一些基础知识)4.1 汇编语言程序设计概述1、计算机的汇编语言以助记符表示的指令,每一条指令就是汇编语言的一条语句。
(汇编语言程序设计实际上就是使用汇编指令来编写计算机程序。
汇编语言的语句有严格的格式要求)2、汇编语言的语句格式MCS-51汇编语言的语句格式表示如下:[<标号>]: <操作码> [<操作数>]; [<注释>]标号:指令的符号地址,有了标号,程序中的其它语句才能访问该语句。
①标号是由1~8个ASCII字符组成,但头一个字符必须是字母,其余字符可以是字母、数字或其它特定字符。
②不能使用汇编语言已经定义了的符号作为标号,如指令助记符、伪指令记忆符以及寄存器的符号名称等。
(同一个标号在程序中只能定义一次,不能重复定义;一条语句可以有标号,也可以没有标号,所以是否有标号,取决于程序中是否需要访问该语句。
)操作码:规定语句执行的操作容,操作码是以指令助记符表示的,是汇编指令格式中唯一不能空缺的部分。
操作数:给指令的操作提供数据或地址。
注释:是对语句或程序段的解释说明。
(在单片机中,这四个部分怎么加以区分呢?使用分界符)分界符(分隔符):用于把语句格式中的各部分隔开,以便于编译程序区分不同的指令段。
冒号(:)用于标号之后空格()用于操作码和操作数之间逗号(,)用于操作数之间,分割两个以上的操作数分号(;)用于注释之前。
第4章 汇编 语言程序设计
DJNZ R1,LOOP ;R1减1不为零,则跳LOOP处 NOP
HERE:SJMP
HERE
上述4个字段应该遵守的基本语法规则如下。
10
1.标号字段
语句所在地址的标志符号,才能被访问。如标号 “START”和“LOOP”等。有关标号规定如下: (1)标号后必须跟冒号“:”。 (2)标号由1~8个ASCII码字符组成,第一个字符必须是
8
汇编语言语句是符合典型的汇编语言的四分段格式:
标号字段 (LABLE) 操作码字段 (OPCODE) 操作数字段 (OPRAND) 注释字段 (COMMENT)
标号字段和操作码字段之间要有冒号“:”分隔; 操作码字段和操作数字段间的分界符是空格; 双操作数之间用逗号相隔;
操作数字段和注释字段之间的分界符用分号“;”。
表示的机器语言程序,才能识别和执行。
完成“翻译”的程序称为汇编程序。经汇编程序“汇编”得 到的以“0”、“1”代码形式表示的机器语言程序称为目标 程序。
5
优点:用汇编语言编写程序效率高,占用存储空间小,运行 速度快,能编写出最优化的程序, 缺点:可读性差,离不开具体的硬件,是面向“硬件”的语 言通用性差。 2.高级语言
功能是把P1.6的位地址赋给变量QA。
4.2
汇编语言源程序的汇编
“汇编”?汇编可分为手工汇编和机器汇编两类。
22
4.2.1
手工汇编
通过查指令的机器代码表(表3-2),逐个把助记符指令 “翻译”成机器代码,再进行调试和运行。 手工汇编遇到相对转移偏移量的计算时,较麻烦,易出 错,只有小程序或受条件限制时才使用。实际中,多采用“ 汇 编程序”来自动完成汇编。
16
重叠。例如:
ORG …… ORG …… ORG …… 2000H 2500H 3000H
单片机第4章汇编语言程序设计
4.2 伪指令
伪指令是在机器汇编中告诉汇编程序 如何汇编、对汇编过程进行控制的命令。 伪指令与汇编语言指令不同,只在源程序 中出现,不产生任何机器代码,在程序的 运行过程中不起作用,故称为“伪指令”。
处理 判断 连接
2.绘制程序流程图 简单的问题可由文字说明, 当问题复杂时,将文字说明的步骤以图形符号表示, 称流程图。
3.编写源程序 用汇编语言把流程图所表明的 步骤描述出来,实现流程图中每一框内的要求,从 而编制出一个有序的指令流,即汇编语言源程序。
4.汇编、调试 汇编语言是用指令助记符代替机 器码的编程语言,所编写的程序是不能在计算机上 直接执行的,因此利用它所编写的汇编语言程序必 须转换为单片机能执行的机器码形式的目标程序才 能运行,我们把这一过程称为汇编,进行汇编的程 序称为汇编程序。
4. 定义字伪指令DW
[标号:] DW 16位字数据表
该指令的功能与DB相似, 区别仅在于从指定地
址开始存放的是指令中的16位数据, 而不是字节串。
每个16位数据要占两个存储单元, 高8 位先存(低位
地址), 低 8 位后存(高位地址)。
1403H 3CH
ORG 1400H DATA1:DW 324AH,3CH
散转程序是分支程序的一种, 它可根据运算结果或输入数 据将程序转入不同的分支。MCS - 51 指令系统中有一条跳转指 令JMP@A+DPTR,用它可以很容易地实现散转功能。该指令 把累加器的8位无符号数与16位数据指针的内容相加, 并把相加 的结果装入程序计数器PC,控制程序转向目标地址去执行。
4-汇编程序设计
B+30HB B(21H)
A+30HA A(22H)
结束
A:高4位BCD码 B:低4位BCD码
周期数 源程序
ORG 2000H
1
MOV A,20H
2
MOV B,#10H ;除以10H
4
DIV AB
; 商->A,余数->B
2
ORL B,#30H ;高4位BCD码转换位ASCII码
2
MOV 21H,B
例3:排序程序设计。 若以30H为首地址的内部RAM中有7个连续存放的数
据,按由小到大的次序排好后存入这7个单元。
冒泡法排序基本思想: 是一种相邻数互换的排序方法。执行时从前向后依次 将相邻两单元的数进行比较,即第一个数与第二个数、 第二个数与第三个数……进行比较,如果符合从小到 大的顺序则不变动,否则将它们交换位置。如此反复 比较和交换,使小数向前移、大数向后移,直到数列 排好为止。
例2:将20H单元的压缩BCD码 低四位和高四位,分别拆成 两个ACSII码存入21H、22H单 元。
(BCD ASCII 码对照表)
20H
BCD
ASCII
21H
0
30H
22H
1
31H
2
32H
3
33H
…
…
9
39H
内部RAM
高
低
四
四
位
位
69 39 36
方法 1
开始
(20H)A
A取高四位,B取低四位
常用的伪指令
DW(Define Word) 从指定单元开始定义(存储)若干个字的数据 或ASCII码字符。
格式:DW 字常数或ASCII字符
04_汇编语言程序设计完整
第4章 汇编语言程序设计 类型属性(TYPE):指变量占用存储单元的字节数。若占 用一个字节,称为字节变量,其类型为BYTE:若占用两个字 节,称为字变量,其类型为WORD;若占用4个字节,称为双 字变量,其类型为DWORD。
第4章 汇编语言程序设计
2) 伪指令语句
伪指令语句也叫指示性语句,它只是为汇编程序在翻译汇 编语言源程序时提供有关信息,并不翻译成机器代码,所以也 不占用执行时间。 伪指令的格式为:
【符号名】 伪指令定义符 【参数表】 【;注释】
实际上,汇编语言源程序中还可出现宏指令语句。宏指令
语句就是由若干条指令语句形成的语句体。一条宏指令语句的
果程序中有堆栈段,也需要把段地址装入SS中。但是,代码段
CS不需要这样做,这一操作是在程序初始化时完成的。
第4章 汇编语言程序设计 为了对段定义作进一步地控制,SEGMENT伪操作添加有类 型及属性的说明,其格式如下:
<段名> SEGMENT [定位类型][组合类型][使用类型]
[类别] … <段名> ENDS 在一般情况下,这些说明可以不用。但是,如果需要用连 接程序把本程序与其他程序模块相连接时,就需要使用这些说 明。
ASSEMBLER)两种。我们采用QASM2.7版来说明汇编程序所提供的
伪操作和操作符,操作流程如图所示。
第4章 汇编语言程序设计
出错 编辑程序 EDLINE WPS WORD EDIT 文件 EXMP.ASM 汇编程序 ASM MASM TASM
文件 EXMP.OBJ (EXMP.LST) (EXMP.CRF)
串、?、用逗号隔开的上述各项或DUP(表达式)。
第04章 汇编语言程序设计 39页 0.2M PPT版
MOV AL,10100000B OR 00000101B ;(AL)←10100101B
例4-4 关系运算符的应用
MOV AX,5 EQ 101B ;(AX)←0FFFFH
MOV BH,10H GT 16 ;(BH)←0
例4-5 数值返回运算符的应用
K1 DB 30H,31H,32H
K2 DW 4041H,4043H
(4)STACK
(5)MEMORY
(6)AT表达式
4. 类别名
返回
4.2.4 段寻址伪指令
格式:
ASSUME 段寄存器名:段名,段寄存器名:段名,……
例4-15 求从NUM开始的12个无符号字节数的和,结果放在SUM字单元中。
DATA SEGMENT NUM DB 95H,83H,36H,2DH DB 33H,22H,1AH,34H DB 62H,45H,75H,49H SUM DW ?
例4-13
STR1 DB ‘COMPUTER’ ;定义一个字符串,字符串的首地址为STR1 STR2 DW ‘AA’,‘BC’,‘DE’ ;给两个字符组成的字符串分配两个字节存储单元 DATA DW ?,?,? ;为DATA预留6个存储单元
例4-14
DATA1 DB 20 DUP(?) ;为变量DATA1分配20个字节的空间,初值为任意值 DATA2 DW ? ;为变量DATA2分配2个字节的空间,初值为任意值 DATA3 DB 20 DUP(30H) ;为变量DATA3分配20个字节的空间,初值均为30H
K3 DW 20H DUP(0)
K4 DD 50515253H
MOV AL,TYPE K1 ;等效于MOV AL,1
MOV AH,TYPE K2 ;等效于MOV AH,2
第4章汇编语言程序设计知识
图4-1 分支程序结构
例4-1
JMP_128:MOV RL MOV JMP JMPTAB:AJMP AJMP ┇ AJMP A,R3 A DPTR,#JMPTAB @A+DPTR ROUT00 ROUT01 ┇ ROUT7F
128个子程序首址
二、分支程序
说明:此程序要求128个转移目的地址(ROUT00 ~
三、反汇编
将二进制机器语言程序翻译成汇编语言程序的过程 称反汇编。
汇编和反汇编的过程如图4-3所示。
汇编(汇编程序)
源程序 (汇编语言)
反汇编(汇编程序)
目标码 (机器语言)
图4-3 汇编和反汇编过程
§4.2.3 伪指令
伪指令不是真正的指令,无对应的机器码,在汇编 时不产生目标程序,只是用来对汇编过程进行某种 控制。
格式:字符名称
DATA
表达式
功能:与EQU类似,但有以下差别:
1、EQU定义的字符名必须先定义后使用,而DATA定义的 字符名可以后定义先使用。
ORG START
2000H MOV R0,#21H ;21H→(R0) MOV A,20H ; (20H)→(A) ANL A,#0FH ;A^#0FH→(A),取低位 MOV @R0,A ; (A)→((R0))),低 位置 21H 中 INC R0 ;R0+1→(R0) MOV A,20H ; (20H)→(A) SWAP A, ;A0~3-((A4~7),低位 与高位交换 ANL A,#0FH ;A^#0FH,取高位 MOV @R0,A ; (A)→((R0)),高位 置 22H
序执行程序。
分支程序又分为单分支和多分支结构。 多分支程序是首先把分支程序按序号排列,然后按序号值进 行转移。
汇编语言程序设计第四版
汇编语言程序设计第四版汇编语言是一种低级编程语言,它允许程序员直接使用机器指令来编写程序。
由于其与硬件的紧密关联,汇编语言通常用于对性能要求极高的系统编程、嵌入式系统开发以及操作系统内核编写等场景。
《汇编语言程序设计》第四版作为该领域的教材,不仅更新了内容以适应最新的硬件发展,还增加了一些新的编程技术和实践。
第一章:汇编语言概述本章介绍了汇编语言的基本概念,包括它的定义、特点以及与其他编程语言的比较。
同时,阐述了汇编语言在现代计算机系统中的重要性和应用领域。
第二章:计算机系统基础在深入学习汇编语言之前,了解计算机系统的工作原理是非常必要的。
本章详细介绍了计算机的硬件组成、指令执行过程以及内存管理等基础知识。
第三章:汇编语言的语法和指令集这一章是汇编语言编程的核心,涵盖了汇编语言的基本语法规则、指令集以及操作数的使用。
通过本章的学习,读者将能够理解汇编指令的结构,并开始编写简单的汇编程序。
第四章:汇编程序的编写与调试本章介绍了如何使用汇编器将汇编语言代码转换为机器代码,以及如何使用调试工具来测试和调试汇编程序。
此外,还讨论了程序的优化技巧,帮助读者提高程序的执行效率。
第五章:高级汇编语言技术随着硬件技术的发展,汇编语言也在不断进步。
本章介绍了一些高级汇编语言技术,如宏指令、条件汇编和重复汇编等,这些技术可以显著提高编程的灵活性和效率。
第六章:输入输出和中断处理在计算机系统中,输入输出操作和中断处理是不可或缺的。
本章讲解了如何使用汇编语言来控制硬件设备,实现数据的输入输出,以及处理各种中断事件。
第七章:汇编语言在操作系统中的应用操作系统是计算机系统中最为关键的软件之一,而汇编语言在操作系统的开发中扮演着重要角色。
本章探讨了操作系统中的一些关键组件,如进程调度、内存管理和文件系统等,并展示了如何使用汇编语言来实现这些功能。
第八章:汇编语言在嵌入式系统中的应用随着嵌入式系统的普及,汇编语言在这一领域的应用也越来越广泛。
汇编语言程序设计(第四版)第1~5章【课后答案】
第1章汇编语言基础知识〔习题1.1〕简述计算机系统的硬件组成及各部分作用。
〔解答〕CPU:包括运算器、控制器和寄存器组。
运算器执行所有的算术和逻辑运算;控制器负责把指指令逐条从存储器中取出,经译码分析后向机器发出各种控制命令,并正确完成程序所要求的功能;寄存器组为处理单元提供所需要的数据。
存储器:是计算机的记忆部件,它用来存放程序以及程序中所涉及的数据。
外部设备:实现人机交换和机间的通信。
〔习题1.2〕明确下列概念或符号:主存和辅存,RAM和ROM,存储器地址和I/O端口,KB、MB、GB和TB。
〔解答〕主存又称内存是主存储器的简称,主存储器存放当前正在执行的程序和使用的数据,CPU可以直接存取,它由半导体存储器芯片构成其成本高、容量小、但速度快。
辅存是辅助存储器的简称,辅存可用来长期保存大量程序和数据,CPU 需要通过I/O接口访问,它由磁盘或光盘构成,其成本低、容量大,但速度慢。
RAM是随机存取存储器的英语简写,由于CPU可以从RAM读信息,也可以向RAM写入信息,所以RAM也被称为读写存储器,RAM型半导体存储器可以按地址随机读写,但这类存储器在断电后不能保存信息;而ROM中的信息只能被读出,不能被修改,ROM型半导体通常只能被读出,但这类存储器断电后能保存信息。
存储器由大量存储单元组成。
为了区别每个单元,我们将它们编号,于是,每个存储单元就有了一个存储地址,I/O接口是由一组寄存器组成,为了区别它们,各个寄存器进行了编号,形成I/O地址,通常称做I/O端口。
KB是千字节、MB是兆字节、GB是吉字节和TB是太字节,它们都是表示存储器存储单元的单位。
〔习题1.3〕什么是汇编语言源程序、汇编程序、目标程序?〔解答〕用汇编语言书写的程序就称为汇编语言源程序;完成汇编工作的程序就是汇编程序;由汇编程序编译通过的程序就是目标程序。
〔习题1.4〕汇编语言与高级语言相比有什么优缺点?〔解答〕汇编语言与高级语言相比的优点:由于汇编语言本质就是机器语言,它可以直接地、有效地控制计算机硬件,因而容易产生运行速度快,指令序列短小的高效目标程序,可以直接控制计算机硬件部件,可以编写在“时间”和“空间”两方面最有效的程序。
第4章汇编程序设计PPT课件
初值表
• 初值表是用逗号分隔的参数 • 主要由数值常数、表达式或?、DUP组成
?——表示初值不确定,即未赋初值; DUP——表示重复初值 DUP的格式为: 重复次数 DUP(重复参数)
第8页/共70页
• 例如 BIGGEST DD 12345678H 在汇编时就会初始化,如图所示。它定义了一个双字变量,且给了初始值。
SEGMENT和ENDS语句把汇编语言源程序分 成段,这些段就相应于存储器段,在这些存储 器段中,存放相应段的目标码。
汇编程序必须知道程序的段结构,并知道 在各种指令执行时将访问哪一个段由段寄存器 所 指 向 。 这 个 信 息 是第1由7页A/共S70S页U M E 语 句 提 供 的 。
通常在汇编语言的源程序中,至少要定义 码段(指令段)、堆栈段和数据段,有时还要定 义附加段。每一个段必须有一个名称,如 MY_DATA、MY_CODE等。一个段由命令SEGMENT 开始,由命令ENDS结束,它们必须成对出现, 而且它们的语句中必须有名称,名称必须相同。 最后用语句END来结束整个源程序。
[分析]因为需要重复进行数据大小的比较,所 以可设计为循环程序结构形式,设计要点是: ①找出循环的规律;②确定控制循环的方法
第30页/共70页
• 参考程序:
DATA SEGMENT BUF DB 26, 78, 196, 45, 16, 9 CNT EQU $-BUF
DATA ENDS CODE SEGMENT
NAME1
SEGMENT
语句
┇
语句
NAME1
ENDS
NAME2
SEGMENT
语句
┇
语句
NAME2
ENDS
第四章 程序设计
…………
R3=7,转向SUBR7
拟以多向分支 的形式实现
MOV DPTR, #JMPTAB
MOV A, R3
ADD A, R3 JMP @A+DPTR JMPTAB: AJMP SUBR0 ;转移指令表 AJMP SUBR1 …… AJMP SUBR7
三、循环结构与循环程序设计
循环结构使程序简练,大大节省存储空间。 循环程序包含四部分: 1、初始化部分 (循环计数器、变量置初值) 2、循环处理部分(主体,需要重复执行的部分) 3、循环控制部分(修改地址指针、修改变量、检测 循环结束条件)
TABLE: DB
…………
五、子程序设计
经常重复使用的程序宜设计成子程序。子程序 在结构上应具有通用性和独立性,编写子程序应 注意以下几点:
1. 子程序应取名,常用标号作为其名称,也代表子程序的入 口地址。 2. 主程序调用子程序必须有LCALL等指令实现,子程序返回 必须在末尾处执行RET等指令。
3. 调用子程序应特别注意保护现场和恢复现场。LCALL等指 令只自动对PC指针进行保护和恢复,其它重要内容,需要 客户自行编写现场保护与恢复的软件。 4. 调用子程序,要能正确传送参数,即要满足入口条件和出 口条件。
书例4.2.17-----看5分钟 该程序几个特点: 1. 求平方通过子程序实现。
(2)循环次数未知的程序
例2、设用户用键盘输入长度不超过100字节的字符串放在8031单片 机外部RAM以20H为首地址的连续单元,该字符串用回车符CR (‘CR’= 0DH)作为结束标志,要求统计此字符串的长度并存入内 部RAM的1FH单元中。
解:从首单元开始取数,每取一数判断其是否为‘CR’,是则结束。 ORG 1000H
第4章汇编语言程序设计ppt课件
DATA1
11
22
33 44
DATA2
11
00
22
00
44
33
DATA3
22
0
0
0
22
0
0
0
XX
66
55 44 33
28
数据定义伪指令的几点 说明
伪指令的性质决定所定义变量的类型;
定义字符串必须用DB伪指令
例:
DATA1 DB ‘ABCD’,66H
41H
‘A’
42H
‘B’
43H
‘C’
44H
‘D’
AH
DISN:T D2X1H
功能号OAH 字符串在内存中的存放地址
58
2. 定义字符缓冲区
用户自定义缓冲区格式:
N1 N2
存放字符个数:≤255
存放键入的字符 整个缓冲区
实际键入字符数 最大可键入字符数
0DH
59
输入字符串程序段
DAT1 DB 20,?,20 DUP(?)
┇
LEA DX,DAT1 MOV AH,0AH INT 21H
定义的变量为4字型(8字节)
定义的变量为10字节型
26
数据定义伪指令例
DATA1 DB 11H,22H,33H,44H DATA2 DW 11H,22H,3344H DATA3 DD 11H*2,22H,33445566H
以上变量在内存中的 存放形式
27
数据定义伪指令例_变量在内存中的
分布
DSEG SEGMENT DATA1 DB 1,2, 3 DUP(?) DATA2 DW 1234H
DSEG ENDS ESEG SEGMENT
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
椭圆框:起止框,在程序的开始和结束时使用。 矩形框:处理框,表示要进行的各种操作。 菱形框:判断框,表示条件判断,以决定程序的流向。 指向线:流程线,表示程序执行的流向。 圆 圈:连接符,表示不同页之间的流程连接。 各种几何图形符号如下图所示。
§4-2 汇编语言程序的基本结构形式 一、简单程序的设计 例4-1 已知两个压缩BCD码分别 放在内部RAM的31H30H和33H 32H 等4个单元中,试编程求和,结果存 入R4R3R2中。 分析:流程如图: 程序如下: ORG 0000H LJMP MAIN ORG 0040H
第四章
汇编语言程序设计
§4-1 汇编语言程序设计基本概念 §4-2 汇编语言程序的基本结构形式
§4-1 汇编语言程序设计基本概念 一、MCS-51指令操作数说明 1、语句格式 [标号:] 操作码 [操作数(目的操作数,源操作数)] [;注释] 2、操作数 对于立即数 #data (1)立即数188,可表示为 #10111100B、#0BCH、#188 (2)MOV R0,# BLOCK;BLOCK为定义过的标号地址 对于直接地址 direct (1)二进制、十进制、十六进制数,MOV A,30H (2)定义过的标号地址,AGAIN:LJMP AGAIN (3)表达式,如SUM+2,其中SUM为定义过的标号地址 (4) SFR寄存器符号名称,如SP、DPH、DPL等
;查表
;查表
;ASCII表
例4-10 利用查表指令,根据R2的分支序号找到对应 的转向入口地址送DPTR,清ACC后,执行散转指令 JMP @A+DPTR,转向对应的分支处理, 假定分支处理程序在ROM 64KB的范围内分布。 程序如下: ORG 1000H START: MOV DPTR, #TAB MOV A, R2 ADD A, R2 JNC ST1 INC DPH (转下页)
(1)利用DPTR作基址的参考程序如下 HEXASC: MOV DPTR, #TABLE MOV A, R2 ANL A, #0FH MOVC A, @A+DPTR ;查表 XCH R2, A ANL A, #0F0H SWAP A ; MOVC A, @A+DPTR ;查表 MOV R3, A RET TABLE: DB 30H,31H,32H,33H,34H ;ASCII表 DB 35H,36H,37H,38H,39H DB 41H,42H,43H,44H,45H,46H
1、定位伪指令ORG(Origin) 格式: [标号:] ORG m m:16位二进制数,代表地址。 功能:指出汇编语言程序通过编译,得到的机器语言程序的起 始地址。 2、定义字节伪指令DB(Define Byte) 格式:[标号:] DB X1,X2,~Xn Xn:单字节二进制、十进制、十六进制数,或以‘ ’括起 来的 字符串,数据符号。 功能:定义程序存储器从标号开始的连续单元,用来存放常 数、字符和表格。 3、定义字伪指令DW(Define Word) 格式:[标号:] DW Y1,Y2,~Yn Yn:双字节二进制、十进制、十六进制数,或以‘ ’括起来 的 字符串,数据符号。
例4-3 假定在外部RAM中有ST1、ST2和ST3共3个连续 单元,其中ST1、ST2单元中分别存放着两个8位无符号 数,要求找出其中的大数并存入ST3单元。 分析:两个无符号数的大小比较可利用两数相减 是否有借位来判断,流程图和程序如下所示:
START:CLR MOV MOVX MOV INC MOVX SUBB JC MOVX SJMP BIG1:XCH BIG2:INC MOVX SJMP
(2)利用PC作基址的参考程序如下: HEXASC: MOV A, R2 ANL A, #0FH ADD A, #9 MOVC A, @A+PC XCH R2, A ANL A, #0F0H SWAP A ADD A, #2 MOVC A, @A+PC MOV R3, A RET TABLE: DB “0”,“1”,…,“F”
START:MOV MOV
R0, #ST1 R1, #ST2A, @R0
MOV
INC
@R1,A
R0
INC
SJMP
R1
LOOP
ENT:RET
四、查表程序设计 用于查表的指令有两条: MOVC A,@A+PC; MOVC A,@A+DPTR; 当使用DPTR作为基址寄存器时查表比较简单,查表 的步骤分三步 1)基址(表格首地址)送DPTR数据指针; 2)变址值(在表中的位置是第几项)送累加器A; 3)执行查表指令MOVC A,@A+DPTR,进行读 数,查表结果送回累加器A。
4、汇编结束命令END 格式:[标号:] END 功能:END是汇编语言源程序的汇编结束标志,在它后面所 写的指令均不予处理。 5、等值命令EQU 格式:字符名称 EQU 数或汇编符号 功能:将一个数或特定的汇编符号赋予规定的字符名称。先 定义后使用。
6、数据地址赋值命令DATA 格式:字符名称 DATA 表达式 功能:将数据地址或代码地址赋予规定的字符名称
START:MOV MOV MOV MOV LOOP:MOV ADD MOV CLR ADDC MOV INC DJNZ SJMP
R6, R7, R2, R0, A, A, R7, A A, R6, R0 R2, $
#0 #0 #50 #30H R7 @R0 A R6 A LOOP
3、多重循环 如果在一个循环程序中嵌套了其他的循环程序,称 为多重循环程序。在用软件实现延时时显得特别有用。 例4-7 设计1秒延时子程序,假设fosc=12MHz。 分析:软件延时与指令的执行时间关系密切,在 使用12MHz晶振时,一个机器周期的时间为1,us,执行 一条DJNZ指令的时间为2us,我们可以采用三重循环的 方法写出延时1秒的子程序 流程、程序如下图所示:
MAIN:
MOV A, 30H ADD A, 32H DA A MOV R2,A MOV A,31H ADDC A,33H DA A MOV R3,A CLR A MOV ACC.0,C MOV R4, A HERE: AJMP HERE END
例4-2 利用查表指令将内部RAM中20H单元的压缩BCD码拆开, 转换成相应的ASCII码,存入21H、22H中,高位存在22H。 分析:控制流程图(略),程序如下: START: MOV DPTR,#TABLE MOV A, 20H ANL A, #0FH MOVC A, @A+DPTR MOV 21H, A MOV A, 20H ANL A, #0F0H SWAP A MOVC A, @A+DPTR MOV 22H, A AJMP $ TABLE: DB 30H,31H,32H,33H,34H DB 35H,36H,37H,38H,39H
对于偏移量 rel (1)可以是数值、标号地址、表达式 (2)使用特殊符号“$”,它代表本条转移指令所在的地址, 如LJMP $(死循环) (3)实际编程时,凡指令中用到地址(rel、 addr11 、addr16 等)都可用标号地址代替实际地址,而地址的运算由汇编程序 完成。 二、常用伪指令 汇编:将计算机不可直接识别的汇编语言源程序翻译成机器语 言的过程。分为计算机汇编和人工汇编两种。 汇编程序:具有完成汇编功能的程序。 目标程序:汇编语言源程序经过汇编得到的机器语言程序。 伪指令:提供汇编用控制信息的指令,只能被汇编程序所识 别,不是单片机的CPU可执行的指令。
二、分支程序设计 1、单分支程序 单分支结构程序使用转移指令实现,即根据条件 对程序的执行进行判断,满足条件是转移执行,否则 顺序执行。 在MCS-51指令系统中条件转移指令有: (1)判A转移指令JZ、JNZ; (2)判位转移指令JB、JNB、JBC、JC、JNC; (3)比较转移指令CJNE; (4)减1不为0转移指令DJNZ;
…
AJMP PRG0:
…
PRGn
…
PRGn:
… … …
三、循环程序设计 1、循环程序的结构
循环程序包括以下四个部分: 置循环初值 循环体 循环控制变量修改 循环终止控制 常用于循环控制的指令有: DJNZ、CJNE、JC、JNC 等控制类指令。
2、单循环 终止循环控制采用计数的方法,即用一个寄存器 作为循环次数计数器,每次循环后计数加1或减1,达 到终止值后退出循环。 例4-6 计算50个8位二进制数(单字节)之和。 要求:50个数存放在30H开头的内部RAM中,和放 在R6R7中。 分析:采用DJNZ循环体的流程框图如下页所示, 在参考程序中,R0为数据地址指针,R2为减法循环计 数器。 在使用DJNZ控制时,循环计数器初值不能为0, 当为0时,第一次进入循环执行到DJNZ时,减1使R2 变为FFH,循环次数成了256,显然不合题意。
当使用PC作为基址寄存器时,由于PC本身是一 个程序计数器,与指令的存放地址有关,查表时其操 作有所不同。查表的步骤也分三步: 1)变址值(在表中的位置是第几项)送累加器A; 2)偏移量(查表指令的下一条指令的首地址到表 格首地址之间的字节数)+ A → A;(修正) 3)执行查表指令MOVC A,@A+PC。 例4-9 二位十六进制数与ASCII码的转换程序。设 数值在R2中,结果低位存在R2中,高位存在R3中。 分析:对于2位16进制数必须进行2次查表,因此, 取数后通过屏蔽的方法来实现高低位分开。
例4-5 根据条件0、1、2 …、n,分别转向处理程序PRG0、 PRG1、…、PRGn,条件K设在R2中。 START: MOV DPRT, #TABLE MOV A, R2 ADD A, R2 JNC NEXT INC DPH NEXT: JMP @A+DPTR TABLE: AJMP PRG0
C DPTR,#ST1 A, @DPTR R7, A DPTR A, @DPTR A, R7 BIG1 A, @DPTR BIG2 A, R7 DPTR @DPTR,A $