第4章__汇编语言程序设计知识1
单片机学习第四章汇编语言程序设计

ORG START:CLR
MOV SUBB JC MOV XCH MOV NEXT: NOP SJMP END
1000H C A,60H A,61H NEXT A,60H A, 61H 60H,A
$
;0→CY
;做减法比较两数 ;若(60H)小,则转移
;交换两数
整理课件
【例4.6】将R2中的一位十六进制数转换为 ASCII码,结果仍存放于R2中。
MOV R0, #0 SJMP NEXT4 NEXT2:MOV R0,A DEC R0 NEXT4:MOV 31H,R0 SJMP $ END
;取X ;与5比较
;X<5,则转NEXT2 ; ;设10<X,Y=X十1
;与1l比较 ;x>10,则转NEXT4
;5≤X≤10,Y=0
;X<5,Y=X-1 ;存结果
MOV
@R0,A
;保存结果
SJMP $
;原地踏步
END
整理课件
【例4.2】假设两个双字节无符号数,分别存 放在R1R0和R3R2中,高字节在前,低字 节在后。编程使两数相加,用R2R1R0存放 和。 对多字节的加法,存在最高位的进位问题。 如果最高位有进位,则和的字节数要比加 数或被加数的字节数多一个。
经常用于定义一个地址表。Yi为双字节数据, 它可以为十进制或十六进制的数,也可以 为一个表达式。高位数在前,低位数在后。
整理课件
• 例如: ORG 1000H DATA:DW 3241H,1234H,78H 上述程序将对从1000H单元开始的6个单元 赋值,赋值情况如何呢? (1000H)=32H,(1001H)=41H, (1002H)=12H,(1003H)=34H, (1004H)=00H,(1005H)=78H。
汇编语言程序设计(第四版)【课后答案】

汇编语言程序设计第四版【课后习题答案】第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章 汇编语言程序设计

因此, 因此,对例子中的存储器地址作如下运 算: 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章 单片机汇编语言程序设计

RO 20HBCMDH BCDL
SWAP A ORL A, #30H MOV 21H, A SJMP $
;BCDH数送A的低4位 21 0011
;完成转换 @R0 ;存数
H22HB0C001D0HBCD 01000L
END
回目录 上页 下页
方法1小结:
以上程序用了8条指令,15个内存字节,执行时间为9个 机器周期。
21 0011BCDH H22H0011BCDL
回目录 上页 下页
程序:
ORG 1000H
MOV R0, #22H ;R0 22H MOV @R0,#0 ; 22H 0 MOV A, 20H ;两个BCD数送A
A
B00C01D01H0BB0CC0D0DHL
XCHD A, @R0 ;BCDL数送22H ORL 22H, #30H ;完成转换
例4-7:设30H单元存放的是一元二次方程ax2+bx+c = 0
根的判别式△= b2 – 4ac的值。
试根据30H单元的值,编写程序,
判断方程根的三种情况。
在31H中存放“0”代表无实根,
存放“1”代表有相同的实根,
存放“2”代表两个不同的实根。
解:△为有符号数,有三种情况,这是一多重分支程序
即小于零,等于零、大于零。
R3
R2
回目录 上页 下页
程序:
ORG 1000H CLR C CLR A SUBB A, R0 MOV R2, A CLR A
SUBB A, R1 MOV R3 , A SJMP $ END
;CY 0
;A 0
;低字节求补
;送R2
;A清零 R3 0000
;高字节求补 0000
第4章 MCS-51单片机汇编语言程序设计

程序清单:
送转移地址序号
A,R3 ;取序号 A ;序号乘2 DPTR, #JTAB ;32个子程序 首地址送DPTR JMP @A+DPTR ;根据序号转移 JTAB: AJMP ROUT00 ;32个子程序首地址 AJMP ROUT01 … MP: MOV RL MOV AJMP ROUT31
第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计
【例4-1】
双字节二进制数求补。
程序说明:对R3(高8位)、R2(低8位)中的二进制定 点数取反加1即可得到其补码。
开始
程序清单:
BINPL:MOV A,R2 CPL A ADD A,#01H MOV R2,A MOV A,R3 CPL A ADDC A,#00H MOV R3,A RET ;低位字节取反 ;加1 ;低位字节补码送R2 ;高位字节取反 ;加进位 ;高位字节补码送R3
散转生成正确偏移号
置换指令地址表首址
转入R3指示的程序
AJMP
……
AJMP
第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计
3.循环程序
包括:循环初始化、循环处理、循环控制
开始 置初值 循环体 循环结束? Y 循环修改 N 循环体 循环结束? N Y 结束 循环修改 结束 开始 置初值
;调用查表子程序 ; 暂存R1中 ;调查表子程序 ;平方和存A中 ;等待
取第一个数→A 调查表子程序 结果存入R1 取下一个数→A 调查表子程序 两数平方相加 存结果
子程序清单:
SQR: INC A ;加RET占的一个字节 MOVC A,@A+PC ;查平方表 RET TAB: DB 0,1,4,9,16 DB 25,36,49,64,81 END
第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
序执行程序。
分支程序又分为单分支和多分支结构。 多分支程序是首先把分支程序按序号排列,然后按序号值进 行转移。
微机原理与接口技术(第三版) 龚尚福章 (4)

在同一个程序中,同样的标号或变量的定义只允许出现一 次,否则汇编程序会指示出错。
第4章 汇编语言程序设计
4.2.1 定义符号的伪指令 有时程序中多次出现同一个表达式,为方便起见,可以用
赋值伪操作给表达式赋予一个名字。 1. 等值伪指令EQU 格式: <符号名> EQU <表达式> 功能:给符号名定义一个值,赋予一个符号名、表达式或
助记符。
第4章 汇编语言程序设计
此后,程序中凡需要用到该表达式之处,就可以用表达式 名来代替了。可见,EQU的引入提高了程序的可读性,也使其 更加易于修改。上式中的表达式可以是任何有效的操作数格式, 可以是任何可以求出常数值的表达式,也可以是任何有效的助 记符。举例如下:
第4章 汇编语言程序设计
(3) 符号常数。用符号名来代替的常数就是符号常数,如 COUNT EQU 3或COUNT=3定义后COUNT就是一个符号常数,与数 值常数3等价。
第4章 汇编语言程序设计
2) 表达式
由运算对象和运算符组成的合法式子就是表达式。表达式
分为数值表达式、关系表达式、逻辑表达式和地址表达式等。
类型(TYPE)属性:类型表示该标号所代表的指令的转移范 围,分为NEAR和FAR两种。如果为NEAR型,则标号只能在段内 引用;如果为FAR型,则标号可以在段间引用。
第4章 汇编语言程序设计
(2) 变量。变量在数据段、附加数据段或堆栈段中定义, 后面不跟冒号。它也可以用LABEL或EQU伪操作来定义。变量经 常在操作数字段出现。它也有段、偏移及类型三种属性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
19:13
27
3、修改控制变量
在循环程序中,不许给出循环结束条件。 常见的是计数循环,当循环了一定的次数 后,就停止循环。 在单片机中,一般用一个工作寄存器Rn作 为计数器,对该计数器赋初值作为循环次 数。每循环一次,计数器的值减1,即修改 循环控制变量,当计数器的置件为0时,就 停止循环。
19:13
31
---循环结构实例
例4-6 设89C51单片机使用12MHz晶振(机器 周期T为lµs),试计算延时时间。
ORG 4000H R5, #80H ;1个机器周期
DEYPRG: MOV
LOOP1:
LOOP2:
MOV
DJNZ DJNZ NOP RET
R6, #0FFH ;1个机器周期
R6, LOOP2 R5, LOOP1 ;2个机器周期 ;2个机器周期 ;1个机器周期 ;2个机器周期
19:13 22
---分支结构实例 例4-4 128种分支转移程序。 功能:根据入口条件转移到128个目的地址。 入口:(R3)=转移目的地址的序号00H→7FH。 出口:转移到相应于程序入口。
散转指令 K=0 K=1 ┅ ┅
K=n-1
K=n
转向0分支
转向1分支
┅
转向n-1分支
转向n分支
19:13
19:13 20
---分支结构实例 例4-3 设变量x以补码形式存放在片内RAM的30H单元中, 变量y与x的关系是:
编写程序,根据x的值求y的值,并放回原单元中。
19:13
21
---分支结构实例 程序如下:
START: MOV A, 30H JZ NEXT ;x=0,转移 ANL A, #80H ;保留符号位 JZ ED ;x > 0 ,转移 MOV A, #05H ;x < 0,不转移 ADD A, 30H MOV 30H, A SJMP ED NEXT: MOV 30H, #20H ED: SJMP $
单片机原理与接口技术
第4章
汇编语言程序设计知识
19:13
1
本章教学要求
第4章
汇编语言程序设计知识
1. 了解汇编语言编程的基础知识;
2. 了解汇编语言程序设计的基本步骤和方法;
3. 了解汇编语言的特点:目标程序效率高、占存 储空间少、运行速度快、实时性强等; 4. 掌握89C51汇编语言的几种结构:顺序、分支、 循环、查表及子程序的结构;
14
19:13
2、模块划分的原则
每个模块应具有独立的功能,能产生一个明确的
结果,即单模块的功能高内聚性。
模块之间的控制耦合应尽量简单,数据耦合应尽 量少,即模块间的低耦合性。控制耦合是指模块 进入和退出的条件及方式,数据耦合是指模块间 的信息交换方式、交换量的多少及交换频繁程度。
模块长度适中。20条~100条的范围较合适。
具体要求:初学一定要加注释!
19:13
13
4.1.2
编程的方法和技巧
一、模块化程序设计方法
1、程序功能模块化的优点
单个模块结构的程序功能单一,易于编写、调试和修改。
便于分工,从而可使多个程序员同时进行程序的编写和 调试工作,加快软件研制进度。
程序可读性好,便于功能扩充和版本升级。 对程序的修改可局部进行,其它部分可以保持不变。 对于使用频繁的子程序可以建立子程序库,便于多个模 块调用。
例:MAIN:MOV A,#00H;立即数00H→A
19:13 8
标号:
标号是用户定义的符号地址。 一条指令的标号是该条指令的符号名字,标号的值
是汇编这条指令时指令的地址。
标号由以英文字母开始的1~8个字母或数字组成,
以冒号“:”结尾。
标号可以由赋值伪指令赋值,如果没有赋值,汇编 程序把存放该指令目标码第一字节的存储单元的地 址赋给该标号,所以,标号又叫指令标号。
工作过程?
现有的条件,已知数据,对运算的精度和 速度方面的要求? 设计的硬件结构是否方便编程?
4
19:13
2、确定算法
算法是如何将实际问题转化成程序模块来 处理。
在编程以前,先要对几种不同的算法进行 分析、比较,找出最适宜的算法。
19:13
5
3、画程序流程图
程序流程图是使用各种图形、符号、有向线 段等来说明程序设计过程的一种直观的表示。
5、用累加器传递入口参数或返回参数比较方便,在子程 序中,一般不必把累加器内容压入堆栈。
19:13 16
4.1.3
汇编语言程序的基本结构
一、顺序程序
顺序程序是最简单的程序结构,即顺序结构。 程序按顺序一条一条地执行指令。
19:13
17
---顺序程序实例
例4-1 将片内RAM的20H单元中的压缩BCD 码拆成两个ACSII码存入21H、22H单元。 低4位存在21H单元,高4位存在22H单元。 MOV A, 20H 压缩BCD码与非压缩BCD码的区别: MOV 压缩BCD码的每一位用4位二进制表示,一 B, #10H ;除以10H 个字节表示两位十进制数。例如10010110B表示十 DIV AB 进制数96D; ORL 非压缩BCD码用1个字节表示一位十进制数, B, #30H;低4位BCD码转换为ASCII码 高四位总是0000,低4位的0000~1001表示0~9.例如 MOV 21H, B 00001000B表示十进制数8. ORL A, #30H;高4位BCD码转换为ASCII码 MOV 22H, A
19:13
32
四、 查表程序
----其它应用程序实例
查表程序是一种常用的程序,它广泛使用于LED显示器控 制、打印以及数据补偿、计算、转换等功能程序中,具有 程序简单、执行速度快等优点。查表,就是根据变量x在表 格中查找y,使y=f (x)。 例4-7 试编写程序,将16进制数(0-F)转换成ASCII码。 分析:16进制0~9的ASCII码为30~39H,A~F的ASCII码为 41H~46H,ASCII码表的首地址为ASCTAB。 入口:HEX单元的低四位存放16进制数。 出口:转换后的ASCII码送回HEX单元。
28
19:13
4、循环控制部分
根据循环结束条件,判断是否结束循环。 89C51可采用DJNZ指令来自动修改控制变 量并能结束循环。
19:13
29
置初值 置初值 循环体 循环修改 循环控制
完
退出循环
未完
循环体
未完
循环控制
完
退出循环
循环修改
(a)
19:13
(b)
循环组织方式流程图
30
---循环结构实例
例4-5 将内部RAM中起始地址为data的数据串传送到外部RAM 中起始地址为buf的存储区域内,直到发现“$”字符停止传送。 本例结束条件为找到“$”停止传送。程序如下:
MOV R0, #DATA MOV DPTR, #BUF LOOP0: MOV A, @R0 CJNE A, #24H, LOOP1 SJMP LOOP2 LOOP1: MOVX @DPTR, A INC R0 INC DPTR SJMP LOOP0 LOOP2: SJMP $ ;源数据区首地址 ;目的数据区首地址 ;取数据 ;判断是否为$字符 ;是$,转结束 ;不是$,执行传送 ;修改源地址 ;修改目的地址 ;传送下一个数据
11
19:13
(4)常数:可用二进制(B)、十进制、十六进 制(H),若常数以字符开头,前面加0。 (5)$:用来表示程序计数器的当前值。 (6)表达式:汇编时,计算出表达式的值填入目 标码。
19:13
12
注释
注释部分不是汇编语言的功能部分,只是用语增 加程序的可读性。
良好的注释是汇编语言程序编写中的重要组成部 分。
;高8位向左环移1位
19:13
19
二、分支程序
程序分支是通过条件转移指令实现的,即根据条件对程序的 执行进行判断、满足条件则进行程序转移,不满足条件就顺 序执行程序。
分支程序又分为单分支、双分支和多分支结构。
多分支程序是首先把分支程序按序号排列,然后按序号值进 行转移。 在89C51指令系统中,通过条件判断实现单分支程序转移的指 令有:JZ、JNZ、CJNE、DJNZ等。此外还有以位状态作为 条件进行程序分支的指令,如JC、JNC、JB、JNB、JBC等。 使用这些指令可以完成0、1、正、负,以及相等、不相等作 为各种条件判断依据的程序转移。
19:13
9
操作码
操作码是必不可少的。
它用一组字母符号表示指令的操作码。
在89C51中,由89C51的指令助记符组成。
19:13
10
操作数
汇编语言指令可能要求或不要求操作数,所以这一 字段可能有也可能没有。 若有两个操作数,操作数之间用逗号“,”分开。 操作数包括的内容有: (1)工作寄存器:由PSW.3和PSW.4规定的当前工 作寄存器区中的R0~R7。 (2)特殊功能寄存器:21个SFR的名字。 (3)标号名:赋值标号—由汇编指令EQU等赋值 的标号;指令标号—指令标号指示的指令的第一字 节地址是该标号的值。
33
19:13
4.2.4 查表程序
----其它应用程序实例
ORG 0200H HEX EQU 33H HEXASC:MOV A, HEX ANL A, #0FH ADD A, #03H ;变址调整 MOVC A, @A+PC MOV HEX, A RET ASCTAB: DB 30H, 31H, 32H, 33H DB 34H, 35H, 36H, 37H DB 38H, 39H, 41H, 42H DB 43H, 44H, 45H, 46H END 在这个程序中,查表指令MOVC A, @A+PC到表格首地址有 两条指令,占用3个地址空间,故变址调整为加3。