第4章汇编语言程序设计知识2
第四章-汇编语言程序的设计

第四章汇编语言程序设计本章的汇编语言程序设计的主要容有:汇编语言程序设计概述、汇编语言程序的结构形式、汇编语言的伪指令。
(一个单片机应用系统和其它计算机系统一样,在完成一项具体工作的时候,它要按照一定的次序,去执行操作,这些操作实际上就是由设计人员,以单片机能够接受的指令编制的程序,那么无论计算机也好,单片机也好,实际上编制程序的过程,就是用计算机来反映设计者的编程思想,那么这一章中,我们将向大家介绍怎样使用单片机指令系统来编制一些应用程序。
在介绍之前,我们还是来学习汇编语言的一些基础知识)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章汇编语言程序设计知识

(1)流程图
(2)程序清单
START:MOV R1, A ; RL A ADD A,R1 ;(A)x 3放在A中
MOV DPTR,#TABLE;表首址入DPTR JMP @A+DPTR ;散转
TABLE:LJMP PP1;转向编号1的处理入口 LJMP PP2;
LJMP PP8;
例4-1
例4-1: 128种分支转移程序。 功能:根据入口条件转移到128个目的地址。 入口:(R3)=转移目的地址的序号00H~7FH。 出口:转移到相应子程序入口。
;修改地址指针
INC R0
CJNE R0,#00H,LOOP;判断循环结束条件
END
(2)多重循环程序
例:实现50ms的延时程序。 利用多重循环嵌套能实现长时间的软件延
时。延时长短与MCS-51指令执行时间有关, 若主频为12MHz ,一个机器周期为1us,循 环程序执行完所需时间即为延时时间。注意 用软件延时时,不允许有中断,否则将影响 定时的准确性。
隔符。可以用作分隔符的符号:空格“ ”、冒号“:”、、 逗号“,”、分号“;”等。 例:LOOP:MOV A,#00H;立即数00H→A
标号
标号是用户定义的符号地址。 一条指令的标号是该条指令的符号名字,标号的值是汇编这
条指令时指令的地址。 标号由以英文字母开始的1~8个字母或数字组成,以冒号
行转移。
二、分支程序
在MCS-51指令系统中,通过条件判断实现单分支 程序转移的指令有:JZ、JNZ、CJNE、DJNZ等。 此外还有以位状态作为条件进行程序分支的指令, 如JC、JNC、JB、JNB、JBC等。使用这些指令可 以完成0、1、正、负,以及相等、不相等作为各种 条件判断依据的程序转移。
4_2 汇编语言程序设计知识

;保存数据十位
40H
十 个
4-2-2 分支程序 由条件转移指令构成程序判断框部分,形成程序分支结构。 一、单重分支程序 一个判断决策框,程序有两条出路。 两种分支结构。 例:求R2中补码绝对值,正数不变, 负数变补。 MOV A,R2 JNB ACC.7,NEXT ;为正数? CPL A ;负数变补 INC A MOV R2,A NEXT:SJMP NEXT ;结束
子程序 S … … … RET
二、子程序的入口与出口参数 入口参数:调用子程序之前,需要传给子程序的参数。 出口参数:子程序送回调用程序的结果参数。 子程序调用的参数传递方式。 ① 寄存器传送参数 ② 存储器传送参数 ③ 堆栈传送参数
延时时间计算:(设fosc=12MHz) t=(1×1+1×100+2×100×255+2×100+2×1)×1µS=51.3 ms
例2:将片内RAM中的一串单字节无符号 数升序排序。 方法:每次取相邻单元的两个数比较,决 定是否需要交换数据位置。 第一次:比较N-1次,取到表中最大值。 第二次:比较N-2次,取到次大值。 … 第N-1次:比较一次,排序结束。
4-2 编程的步骤、方法和技巧
一、确定方案和计算方法 二、了解应用系统的硬件配置、性能指标。 三、建立系统数学模型,确定控制算法和操作步骤。 四、画程序流程图,表示程序结构和程序功能 五、编制源程序 合理分配存储器单元和了解I/O接口地址。 按功能设计程序,明确各程序之间的相互关系。 用注释行说明程序,便于阅读、调试和修改。 常用程序结构:①顺序程序 ②分支程序 ③循环程序 ④子程序
二、多重循环 循环中套循环。以双重循环使用较多。 例1:用循环程序将指令重复多次执行,实现软件延时。试 计算延时程序的执行时间。 源程序 DELAY:MOV R6,#64H I1: MOV R7,#0FFH I2: DJNZ R7,I2 DJNZ R6,I1 RET 机器周期数 1 1 2 2 2 指令执行次数 1 100 100×255 100 1
微机原理及应用第四章汇编语言程序设计基础

画流程图:以图示形式表示解决具体问题的思路和方法
编制源程序:精心挑选合适的指令和操作数的寻址方式
用注释行说明程序,便于阅读、调试和修改。
调试程序:
汇编
执行
Y
源程序--→机器程序--→分析结果正确--→调试程序完成
N
修改
4
• 起止框 • 处理框 • 判断框
• 连线
流程图图例
开始
结束
XX+1 Y Y-1
31H
取Data1和Data2
0000H
A, Data1 A, Data2
Y
不相等?
STEP1 ;两数不等,转STEP1
N
F0
;两数相等,F0置位
设置标志F0
Y
异号?
ACC.7, TEST;两数异号,转TEST A, Data2 ;两数同号,恢复Data1 结束
N
Y
Data1小?
Y
Data1正?
A, Data2 ;比较 STEP3 ; Data1小,转STEP3 BIG, Data1 ; Data1大
CJNE A, #0AH, $+3
clr c subb A,#30h
JNC ADD_37;若大于等于0AH,则加37Hcjne A,#10,$+3
ADD_30:ADD A, #30H;若小于0AH,则加30H
jc A, HEXASC1 ;A<10转移
MOV R2, A ;保存结果
RET
;子程序返回
subb A,#07h ASCHEX1: ret
3
2、 程序设计步骤
分析课题→确定算法和数据结构→确定操作步骤→画流程 图→编制源程序→调试程序
单片机第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章__89C51汇编语言程序设计(2)

┇
;MAIN为主程序或调用程序标
第 4章
89C51汇编语言程序设计 89C51汇编语言程序设计
SUB:
PUSH PSW PUSH ACC
;现场保护 ;
子程序处理程序段 POP ACC POP PSW RET ;现场恢复 ; ;最后一条指令必须为RET
5
第 4章
89C51汇编语言程序设计 89C51汇编语言程序设计
⑴ MOVC ⑵ MOVC
A,@A+DPTR A,@A+PC
MOVC A,@A+DPTR 完成把A中的内容作为一个无符号数与DPTR中的内容相加,所 得结果为某一程序存储单元的地址,然后把该地址单元中的内容 送到累加器A中。 MOVC A,@A+PC 以PC作为基址寄存器,PC的内容和A的内容作为无符号数,相加 后所得的数作为某一程序存储器单元的地址,根据地址取出程序 存储器相应单元中的内容送到累加器A中。
12
第 4章
89C51汇编语言程序设计 89C51汇编语言程序设计
例6:多字节二进制加法程序:2个4字节无符号二进制数求和, 分别存放于33H,32H,31H,30H及43H,42H,41H,40H中,和存放于 34H,33H,32H,31H,30H。 ORG 1000H DADD: MOV R0,#30H MOV R1,#40H MOV R7,#04H CLR C LOOP: MOV A,@R0 ADDC A,@R1 MOV @R0,A
例5:21H单元开始存放数据块(每单元有16进制数0-F),长度 存放于20H单元中,将它们转化为ASCII码,存放于41H开始单元。 0-9:ASCII:30H-39H=0-9+30H A-F: ASCII:41H-46H=A-F+37H ORG 0030H MAIN: MOV SP,#60H MOV R1,#41H MOV R0,#21H MOV R2,20H LOOP: MOV A,@R0 LCALL ZHCX MOV @R1,A INC R0 INC R1 DJNZ R2,LOOP SJMP $ ORG 1000H ZHCX: CJNE A,#0AH,NEXT NEXT: JC ASC1 ADD A,#37H SJMP ASC2 ASC1: ADD A,#30H ASC2: RET
第4章 MCS-51单片机汇编语言程序设计(2)

XCH A,R3 INC A MOVC A,@A+DPTR MOV DPL,A MOV DPH,R3 CLR A JMP @A+DPTR TAB DW DW A0 A1
…………. DW AN
INC
DPTR
MOVX A,@DPTR SUBB A,R7 JNC XCH BIG1 A,R7
BIG0:INC DPTR
实现程序如下: 实现程序如下
START:CLR C : MOV DPTR,#ST1 , MOVX A,@DPTR , MOV R7,A
MOVX @DPTR,A RET BIG1:MOVX A,@DPTR SJMP BIG0
实现程序如下: 实现程序如下 MOV 30H, 20H ANL 30H,#00011111B MOV A,21H SWAP A RL A ANL A,#11100000B ORL 30H,A
第4章 MCS-51单片机汇编语言程序设计
实现程序如下: 实现程序如下 例 A,@R1 ADDC4.3 做3个字节的 无符号的加法. 无符号的加法.设一个加 MOV R0,#52H , MOV @R0,A 数存放在内部RAM 50H、 RAM的 数存放在内部RAM的50H、 MOV R1,#55H , DEC R0 51H、52H单元中 单元中, 51H、52H单元中,另一 DEC R1 RAM的53H、 MOV A,@R0 个加数存放在RAM 个加数存放在RAM的53H、 MOV A,@R0 54H、55H单元中 单元中, 54H、55H单元中,相加 ADD A,@R1 结果存内部RAM的50H、 结果存内部RAM的50H、 RAM ADDC A,@R1 51H、52H单元 单元, 51H、52H单元,均从高 MOV @R0,A 字节开始存放, 字节开始存放,进位存放 MOV 00H,C 在位寻址区的00H位中。 00H位中 在位寻址区的00H位中。 MOV @R0,A DEC DEC R0 R1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MOV DPTR, #CJTAB
0053H 85H
MOVC A, A+DPTR
0054H 77H
SJMP $
0055H 65H
ORG 0050H
0056H 92H
CJTAB: DB 98H, 74H, 83H, 85H, 77H
0057H 68H
DB 65H, 92H, 68H, 84H, 70H
0058H 84H
★ 画流程图是程序结构设计是采用的一种重要手段。 ★ 流程图步骤分得越细致,编写程序是也越方便。 ★ 一个系统软件有总的流程图(主程序框图)和局部的流程图。 ★ 流程图常采用的图形和符号。
椭圆框 矩形框 菱形框
圆圈 指向线
流程图常采用的图形和符号
或桶形框
:表示程序的开始或结束。
:表示要进行的工作。
汇编语言指令可能要求或不要求操作数,所以这一字段 可能有也可能没有。
若有两个操作数,操作数之间用逗号“,”分开。 操作数字段的内容复杂多样,可能包括:
(3)操作数
* 符号
§4.1 编程的步骤
◆ 工作寄存器:由RS0和RS1规定的当前工作寄存器区中的R0~R7。 ◆ 特殊功能寄存器:21个特殊功能寄存器SFR的名字。 ◆ 标号名:
模块长度适中。20条~100条的范围较合适。
§4.3 编程的方法和技巧
2、编程技巧
尽量采用循环结构和子程序。 尽量少用无条件转移指令。 对于通用的子程序,考虑到其通用性,除了用于存放子程序
入口参数的寄存器外,子程序中用到的其他寄存器的内容应 压入堆栈(返回前再弹出),即保护现场。 在中断处理程序中,除了要保护处理程序中用到的寄存器外, 还要保护标志寄存器。 用累加器传递入口参数或返回参数比较方便,在子程序中, 一般不必把累加器内容压入堆栈。
§4.1 编程的步骤
〔标号:〕〔操作码〕〔操作数〕;〔注释〕
(2)操作码
操作码是必不可少的。 它用一组字母符号表示指令的操作码。在89C51中,由
指令助记符组成。 一般留出标号字段的空位,以便与标号相区别。
§4.1 编程的步骤
4、编写程序
〔标号:〕〔操作码〕〔操作数〕;〔注释〕
(3)操作数
5、上机调试
§4.2 伪指令
伪指令不是真正的指令,它主要是为汇编程序服务的,在 汇编过程中起控制作用的指示性语句。无地址、无对应的机 器码,在汇编时不产生目标程序。
• ORG 汇编起始地址命令 • END 汇编语言程序结束伪指令 • EQU 赋值伪指令 • DB 定义字节伪指令 • DW 定义字伪指令 • BIT 位地址符号伪指令 • DATA 定义标号数值伪指令
例: “两个BCD码相加” 完成:片内数据存储器30H、31H单元和40H、41H单元 存放有两个4位BCD码,将其相加,结果放在 50H、51H单元中。
30H
31H
05
47
40H
41H
50
E8
50H
51H
56
2F
开始
低字节相加, 和放到51H中
高字节相加,加CY 和放到50H中
结束
ORG 0000H LJMP MAIN ORG 3000H MAIN:MOV A,31H ADD A, 41H DA A MOV 51H, A ;低字节相加 MOV A, 30H ADDC A, 40H DA A MOV 50H, A ;高字节相加 SJMP $
放该指令目标码第一字节的存储单元的地址赋给该标号,所 以,标号又叫指令标号。 一条指令的标号是该条指令的符号名字,标号的值是汇编这 条指令时指令的地址,代表16位长的ROM地址编码。 并不是每一条语句都需要标号,只有那些欲被引用的语句才 需要。
4、编写程序
§4.1 编程的步骤
〔标号:〕〔操作码〕〔操作数〕;〔注释〕
END
0059H 70H
§4.2 伪指令
6、DW 定义字命令
格式:DW 16位数据项或项表
功能:把DW后的16位数据项或项表从当前地址连续存放。
每项数值为16位二进制数,高8位先放,低8位后存
放。DW用于定义一个地址表。
例如:
ORG 1500H
TABLE:DW 7234H,8AH,10H,‘H’
经汇编后:
┇
(1500H)=72H, (1501H)=34H, (1502H)=00H,
(1503H)=8AH,(1504H)=00H, (1505H)=10H。
(1506H)=00H,(1507H)=48H (H的ASCII值)
§4.2 伪指令
7、DS 定义存储空间命令
格式:DS 表达式 功能:在汇编时,从指定地址开始保留DS之后表达式的值所
单引号中的ASCII字符串。
5、DB 定义字节命令 §4.2 伪指令
例如:
ORG 2000H DB 0A3H
LIST:DB 26H,03H STR: DB ‘ABC’
┇
A3H 26H 03H 41H 42H 43H
2000H 2019H 2019H 2019H 2019H 2019H
经汇编后:(2000H)=A3H, (2019H)=26H, (2019H)=03H, (2019H)=41H, (2019H)=42H, (2019H)=43H,
1、模块化的程序设计方法
(2)划分模块的原则
每个模块应具有独立的功能,能产生一个明确的结果,即单 模块的功能高内聚性。
模块之间的控制耦合应尽量简单,数据耦合应尽量少,即模 块间的低耦合性。控制耦合是指模块进入和退出的条件及方 式,数据耦合是指模块间的信息交换方式、交换量的多少及 交换频繁程度。
DELY EQU 07EBH
MOV A,A10 ;A10作为片内的一个直接地址
LCALL DELY ;DELY作为一个16位子程序的入口地址
§4.2 伪指令
4、DATA 数据地址赋值命令来自 格式:[字符名称] DATA [表达式] 功能:与EQU类似,但有以下差别:
◆ EQU定义的字符名必须先定义后使用,而DATA定义的字 符名可以后定义先使用。
以是数,也可以是汇编符号。EQU赋值过的符号名可以用作数 据、代码地址、位地址或一个立即数。可以是8位的,也可以是 16位的。
§4.2 伪指令
3、EQU 赋值命令
例如:
例1: A_ASCII EQU ‘A’ ASCII
MOV A,A_ASCII 例2: A10 EQU 10
;A_ASCII分配字符“A”的 ;值(41H=65)
注意:在一个源程序中,可以多次使用ORG指令,来规定不同的程 序段的起始地址。但是,地址必须由小到大排列,不能交叉、重叠。
§4.2 伪指令
2、END 汇编结束命令
格式:END 功能:通知汇编程序结束汇编。在END之后所有的汇编指令均
不予以处理。
§4.2 伪指令
3、EQU 赋值命令
格式:[字符名称] EQU [项](数或汇编符号) 功能:把“项”赋给“字符名称”。 注意:字符名称不等于标号(其后没有冒号);其中的项,可
第四章 汇编语言程序设计知识
主讲:康科锋
第四章 汇编语言程序设计及知识
§4.1 编程的步骤 §4.2 伪指令 §4.3 编程的方法和技巧 §4.4 汇编语言程序的基本结构
1、分析问题
§4.1 编程的步骤
对需要解决的问题进行分析,以求对问题有 正确的理解。 ★ 解决问题的任务是什么?
★工作过程? ★现有的条件,已知数据,对运算的精度和速
:表示要判断的事情,菱形框内的 表达式表示要判断的内容。
:表示连接点
:表示程序的流向
开始
将学生成绩存入 累加器A中
比较(A)与#60的大小 (A)=#60?
YES
NO
NO (A)>#60?
YES
增加R1的值
增加R2的值
打印学生成绩 结束
4、编写程序
§4.1 编程的步骤
用89C51汇编语言编写的源程序行(一条语句)包括四个部 分,也叫四个字段: 〔标号:〕〔操作码〕〔操作数〕;〔注释〕
与标号或符号名相区别。
* 表达式
◆ 汇编时,计算出表达式的值填入目标码。
§4.1 编程的步骤
4、编写程序
〔标号:〕〔操作码〕〔操作数〕;〔注释〕
(4)注释
注释部分不是汇编语言的功能部分,只是用语增加程序 的可读性。
良好的注释是汇编语言程序编写中的重要组成部分。 由“;”或“/*……*/”表示。
单个模块结构的程序功能单一,易于编写、调试和修改。 便于分工,从而可使多个程序员同时进行程序的编写和调试
工作,加快软件研制进度。 程序可读性好,便于功能扩充和版本升级。 对程序的修改可局部进行,其它部分可以保持不变。 对于使用频繁的子程序可建立子程序库,便于多个模块调用。
§4.3 编程的方法和技巧
度方面的要求? ★ 设计的硬件结构是否方便编程?
2、确定算法
§4.1 编程的步骤
★ 算法是如何将实际问题转化成程序模块来处理。 ★ 在编程以前,先要对几种不同的算法进行分 析、比较,找出最适宜的算法。
§4.1 编程的步骤
3、画程序流程图
★ 程序流程图是使用各种图形、符号、有向线段等来说明程序 设计过程的一种直观的表示。
每个字段之间要用分隔符分隔,而每个字段内部不能使用分 隔符。可以用作分隔符的符号:空格“ ”、冒号“:”、、 逗号“,”、分号“;”等。
例:LOOP:MOV A,#00H ;立即数00H→A
4、编写程序
§4.1 编程的步骤
〔标号:〕〔操作码〕〔操作数〕;〔注释〕
(1)标号
出现在助记符之前的,是由用户定义的一个字符串。 标号可以由赋值伪指令赋值,如果没有赋值,汇编程序把存