590 likes | 698 Views
第 4 章 MCS-51 汇编语言程序设计. § 4.1 汇编语言程序设计概述. § 4.2 单片机汇编语言程序的基本结构形式. § 4.3 MCS-51 单片机汇编语言程序设计举例. § 4.4 MCS-51 汇编语言的伪指令. § 4.5 单片机汇编语言源程序的编辑和汇编. 本章要求. 1. 了解掌握汇编语言程序的基本结构形式. 2. 了解掌握单片机汇编语言的伪指令. 3. 掌握单片机汇编语言程序设计方法. § 4.1 汇编语言程序设计概述. 一 . 汇编语言的特点及其语句格式. 1. 汇编语言的特点. ● 汇编语言能编写出最优化的程序.
E N D
第4章 MCS-51汇编语言程序设计 §4.1 汇编语言程序设计概述 §4.2 单片机汇编语言程序的基本结构形式 §4.3 MCS-51单片机汇编语言程序设计举例 §4.4 MCS-51汇编语言的伪指令 §4.5 单片机汇编语言源程序的编辑和汇编
本章要求 1.了解掌握汇编语言程序的基本结构形式 2.了解掌握单片机汇编语言的伪指令 3.掌握单片机汇编语言程序设计方法
§4.1 汇编语言程序设计概述 一. 汇编语言的特点及其语句格式 1. 汇编语言的特点 ●汇编语言能编写出最优化的程序 汇编语言是能助记符指令,她和机器指令一一对 应,编写的程序效率高,占用存储空间小,运行 速度快。 ●用汇编语言编程比使用高级语言困难 因为汇编语言是面向计算机的,程序设计人员必须对计算机硬件有相当深入的了解才能用汇编语言设计编程。
§4.1 汇编语言程序设计概述 一. 汇编语言的特点及其语句格式 1. 汇编语言的特点 ●汇编语言程序能直接管理和控制硬件设备。 汇编语言能直接访问存储器及接口电路,也能处理中断,因此汇编语言程序能直接管理和控制硬件设备。 ●汇编语言缺乏通用性,程序不易移植 各种计算机都有自己的汇编语言,不同机型汇编语言之间不能通用,程序不易移植,缺乏通用性 。
§4.1 汇编语言程序设计概述 一. 汇编语言的特点及其语句格式 2. 汇编语言的语句格式 ●汇编语言的语句格式 [<标号>]:<操作码>[<操作数>];[<注释>] ●每一语句占一行,填写一条指令。 ●每一行分成4段(标号、操作码、操作数和注释) 其中:方括号内的是可选择部分, 可有可无,视需要而定。
§4.1 汇编语言程序设计概述 一. 汇编语言的特点及其语句格式 2. 汇编语言的语句格式 [<标号>]:<操作码>[<操作数>];[<注释>] ①标号 ●标号代表该行指令所在的地址。不必每行都有。 ●标号必须由字母开头的字母数字串组成,字符不能 超过6个,不能用指令助记符或寄存器名称。 ●标号结尾应加冒号,这是标号与操作码的分界线。 ●标号不能重复使用。
§4.1 汇编语言程序设计概述 一. 汇编语言的特点及其语句格式 2. 汇编语言的语句格式 [<标号>]:<操作码>[<操作数>];[<注释>] ②操作码 ●操作码用于规定语句执行的操作内容。 ●操作码是以指令助记符或伪指令助记符表示的。 ●操作码是汇编指令格式中唯一不能空缺的部分。
§4.1 汇编语言程序设计概述 一. 汇编语言的特点及其语句格式 2. 汇编语言的语句格式 [<标号>]:<操作码>[<操作数>];[<注释>] ③操作数 ●操作数用于给指令的操作提供数据或地址。 ●在一条语句中,操作数可能是空白,也可能只包括 一项,还可能包括二项、三项,各操作数之间以逗 号分隔。
§4.1 汇编语言程序设计概述 一. 汇编语言的特点及其语句格式 2. 汇编语言的语句格式 [<标号>]:<操作码>[<操作数>];[<注释>] ④注释 ●注释不属于语句的功能部分,它只是对语句的解释 说明,可有可无。 ●注释要用分号“;”开头。
§4.1 汇编语言程序设计概述 一. 汇编语言的特点及其语句格式 2. 汇编语言的语句格式 [<标号>]:<操作码>[<操作数>];[<注释>] ⑤分界符(分隔符) ●分界符用于把语句格式中的各部分隔开,便于区分 冒号(:) 用于标号之后 空格( ) 用于操作码和操作数之间 逗号(,) 用于操作数之间 分号(;) 用于注释之前
§4.1 汇编语言程序设计概述 二. 汇编语言程序设计的特点 用汇编指令编写设计程序时请注意如下特点: ●在程序中要对数据的存放、寄存器和工作单元的 使用等作出具体安排。 ●设计人员必须对所使用的单片机的硬件结构有较 为详细的了解,特别对寄存器、端口、定时器/计 数器、中断等内容更应了如指掌,以便在程序设 计中熟练使用。 ●对程序设计的技巧性要求较高。
§4.2单片机汇编语言程序的基本结构形式 一. 顺序程序 ●顺序程序是最简单的程序结构,在顺序程序中 既无分支、也无循环,也不调用子程序,执行 时一条一条地按顺序执行。 ●例: 二字节无符号数相加,其中被加数放在内 部 RAM的50H、和51H单元中;加数放在内 部RAM的53H和54H单元中。 要求把相加和存放在50H和51H单元中, 进位存放在位寻址区的00H位中。
§4.2单片机汇编语言程序的基本结构形式 一. 顺序程序 MOV R0,#51H ;被加数的低字节地址 MOV Rl,#54H ;加数的低字节地址 MOV A,@R0 ;取被加数的低字节 ADD A,@Rl ;取加数低字节与被加数低字节相加 MOV @R0,A ;存低字节相加和 DEC R0 DEC R1 MOV A,@R0 ;取被加数的高字节 ADDC A,@Rl ;高字节带进位相加 MOV @R0,A ;存高字节相加和 MOV 00H,C ;进位送00H位保存 CLR A ADDC A,#00H MOV R0,#00H ;存放进位的单元地址 MOV @R0,A ;进位送00H位保存
§4.2单片机汇编语言程序的基本结构形式 二. 分支程序 分支程序通过转移指令实现。 1. 单分支程序 ●单分支程序用条件转移指令实现,即根据条件对 程序的执行进行判断,满足条件则程序转移,否 则程序顺序执行。 △建立判断标志指令。 △有条件转移指令。
入口 Y A=255? N A=100 A=0 RET §4.2单片机汇编语言程序的基本结构形式 二. 分支程序 1. 单分支程序 ●例:A的内容是255时,把A清0,否则A置100。 ADD A,#01H JC NEXT MOV A,#100 RET NEXT: CLR A RET CLR C SUBB A,#0FFH JNC NEXT MOV A,#100 RET NEXT: CLR A RET
K=? K=1 K=n K=0 转向n分支 转向1分支 ‥ ‥ ‥ ‥ 转向0分支 §4.2单片机汇编语言程序的基本结构形式 二. 分支程序 2. 多分支程序 ●有下列四种方法实现多分支程序转移。 ①用多条CJNE指令,通过连续比较,实现多分支程序 转移。
+UCC +UCC 控 制 对 象 89C51 KA D P2.0 DS18B20 R P1.0 KA L N §4.2单片机汇编语言程序的基本结构形式 2.多分支程序 例: 某温度控制系统,要求把控制对象的温度(t) 控制在TH≥t≥TL范围之内。
采样温度t→A Y A>TH? 入口 N Y A<TL? N 加 热 停止加热 RET §4.2单片机汇编语言程序的基本结构形式 2.多分支程序 程序流程图 采集的实际温度t 放A中 温控下限TL存54H单元中 温控上限TH存55H单元中 若t>TH则降温处理(JWCL) 若t<TL则升温处理(SWCL)
§4.2单片机汇编语言程序的基本结构形式 2.多分支程序 CJNE A,55H,LOOPl ;t≠TH,转向L00Pl LJMP LOOP9 ;t=TH,返回 LOOPl:JNC JWCL ;若t>TH,转降温处理 CJNE A,54H,LOOP2 ;t≠TL,转向L00P2 LJMP LOOP9 ;t=TL,返回 LOOP2:JC SW ;若t<TL,转升温处理 LJMP LOOP9 ;TH≥t≥TL,返回主程序 JWCL: SETB P1.0 ;使继电器有电,加热器停电 LJMP LOOP9 SWCL: CLR P1.0 ;使继电器停电,加热器通电 LOOP9: NOP RET 程序
§4.2单片机汇编语言程序的基本结构形式 二. 分支程序 2. 多分支程序 ②使用查地址表方法实现多分支程序转移 通过转移指令JMP @A+DPTR进行分支 ③使用查转移指令表方法实现多分支程序转移 ④通过堆栈操作实现多分支程序转移
入口 初始化 循环体 修改初值 循环结束否 ? 出口 §4.2单片机汇编语言程序的基本结构形式 三. 循环程序 ●循环是为了重复执行一个程序 段。其循环结构的流程图如下: 1、初始化部分: 在进入循环之前,要对循环体 中参加操作的有关参数、地址 赋以初始值,特别是用于判断 循环结束的变量。 2、循环体部分: 重复执行的程序段
入口 初始化 循环体 修改初值 循环结束否 ? 出口 §4.2单片机汇编语言程序的基本结构形式 三. 循环程序 3、修改初始值部分: 循环结构中每执行一次循环都要对设置的初始值进行修改,特别是用于判断结束条件的参数。 4、判断部分: 控制部分,即每次循环都要检查结束条件是否满足,满足时停止循环,否则继续执行循环体。
§4.2单片机汇编语言程序的基本结构形式 三. 循环程序 例: 有一字符串以回车符为结束标志,并存放在 内部RAM从40H单元开始的连续存储单元中, 编写测试字符串长度的程序。 ●为测试字符串的长度,应使用逐个字符依次 与回车符(ODH)比较的方法。 MOV R2, #0FFH ;设置长度计数器初值 MOV R0, #3FH ;设置字符串指针初值 L00P:INC R2 INC R0 CIJNE @R0,#0DH,L00P RET
§4.2单片机汇编语言程序的基本结构形式 三. 循环程序 例:把内部RAM中起始地址为data的数据串传送 到外部RAM以buffer为首地址的区域,直到 发现“$”字符的ASCII码为止。同时规定数 据串的最大长度为32个字节。 编写数据串传送程序。
§4.2单片机汇编语言程序的基本结构形式 三. 循环程序 MOV R0,#data ;d数据区起始地址 MOV DPTR,#buffer ;数据区起始地址 MOV R1,#20H ;最大数据串 LOOP: MOV A,@R。 ;取数据 CLR C SUBB A,#24H ;判是否为“$”符 JZ LOOPl MOV A,@R0 MOVX @DPTR, A ;数据传送 INC DPTR INC R0 DJNZ Rl,L00P ;循环控制 LOOP1: RET ;结束
§4.2单片机汇编语言程序的基本结构形式 四. 子程序 子程序是指能完成明确任务、具有独立功能且能被其它程序反复调用的程序。 [例] 设内部RAM 20H、21H单元中有两个数a和b, 编程求c=a2+b2并把c送入内部RAM 22H单元。 该程序由两部分组成(主程序和子程序): 主程序:通过累加器A传送入口参数a和b, 子程序:求平方并将结果通过A传送给主程序。
§4.2单片机汇编语言程序的基本结构形式 四. 子程序 MOV A,20H ;a→A ACALL SQR ;求a2 MOV R0,A ;a2→R0 MOV A,21H ;b→A ACALL SQR ;求b2 ADD A,R0 ;a2+b2→A MOV 22H,A ;存入22H单元 RET SQR:ADD A,#01H ;地址调整 MOVC A,@A+PC ;查平方表 RET TAB: DB 0,1,4,9,16,25 DB 36,49,64,81,100
§4.2单片机汇编语言程序的基本结构形式 四. 子程序 ●汇编语言子程序编写格式 需第一条指令要有标号,最后一条指令是RET, 其它可根据程序功能编写即可。 ●调用子程序是通过指令ACALL(或LCALL)实现。 ●调用子程序时,计算机只自动保护和恢复断点 地址,其它寄存器和直接地址单元的内容则需 编程人员根据程序具体情况通过一些指令进行 保护和处理。 ●调用子程序时常需要参数传递,参数传递不能 为立即数,应该采用存储单元地址或寄存器。
§4.3 MCS-51单片机编语言程序设计举例 一. 算术运算程序 1. 加减法运算 ●不带符号的多个单字节数加法 例: 有多个单字节数,依次存放在21H开始的外部 RAM的连续单元中,要求把计算结果存放在R1 和 R2中(假定相加的和为二字节数),其中R1 为高位,R2为低位。
§4.3 MCS-51单片机编语言程序设计举例 一. 算术运算程序 1. 加减法运算 MOV R0,#21H ;设置数据指针 MOV R7,#N ;字节个数 MOV R1,#00H ;和的高位清“0” MOV R2,#00 ;和的低位清“0” L00P1:MOVX A, @R0 ;取一个加数 ADD A,R2 ;单字节数相加 MOV R2,A ;和的低位送R2 JNC L00P2 INC R1 ;有进位和高位加1 L00P2:INC R0 ;指向下一单元 DJNZ R7,L00P1 RET
[例]双字节无符号数乘法运算程序 §4.3 MCS-51单片机编语言程序设计举例 一. 算术运算程序 2. 乘法运算 乘法指令(MUL AB)是对单字节的,但对于多字节数的乘法就必须通过程序实现。 已知在R2R3和R4R5中分别存放有双字节的被乘数和乘数(R3、R5存放低8位,R2、R4存放高8位),试编程求积并存入BLOCK开始的连续四个存储单元(低字节在前,高字节在后)。
R2 a R3 b R5 c d R4 × bdH bdL adL adH bcL bcH acL + acH 积 Block+3 Block+1 Block+2 Block §4.3 MCS-51单片机编语言程序设计举例 一. 算术运算程序 2. 乘法运算 双字节无符号 数乘法原理图
ORG 1000H BLOCK EQU 30H MOV R0,#BLOCK ;指向积单元首址 MOV A,R3 MOV B,R5 MUL AB ;b×d MOV @R0,A ;保存bdL MOV A,B ;bdH送A INC R0 MOV @R0,A ;保存bdH §4.3 MCS-51单片机编语言程序设计举例 2. 乘法运算
MOV A,R2 MOV B,R5 MUL AB ;a×d ADD A,@R0 ;bdH+adL MOV @R0,A INC R0 MOV A,B ;adH送A ADDC A,#00H ;adH+进位 MOV @R0,A §4.3 MCS-51单片机编语言程序设计举例 2. 乘法运算
DEC R0 MOV A,R3 MOV B,R4 MUL AB ;b×c ADD A,@R0 ;bcL与bdh、adL、进位累加 MOV @R0,A MOV A,B ;bcH送A INC R0 ADDC A,@R0 ;bcH与adH、进位累加 MOV @R0,A §4.3 MCS-51单片机编语言程序设计举例 2. 乘法运算
INC R0 CLR A ADDC A,#00H MOV @R0,A ;保存进位 MOV A,R2 MOV B,R4 MUL AB ;a×c DEC R0 ADD A,@R0 ;acL与adH、bcH、进位累加 §4.3 MCS-51单片机编语言程序设计举例 2. 乘法运算
MOV @R0,A MOV A,B ;acH送A INC R0 ADDC A,@R0 ;acH与进位累加 MOV @R0,A RET §4.3 MCS-51单片机编语言程序设计举例 2. 乘法运算
§4.3 MCS-51单片机编语言程序设计举例 一. 算术运算程序 3. 除法运算 除法指令(DIV AB)是对单字节的,但对于多字节数的除法就必须通过程序实现。(P94-95) 例:我们将给定的单字节二进制数,转换成十 进制数(BCD码)。将累加器A的值拆为三 个BCD码,并存入30H开始的三个单元。
二进制数送 A 除以100,得百位数 保存百位数 余数除10,得十位数 保存十位数 余数为个位数,保存 结束 §4.3 MCS-51单片机编语言程序设计举例 一. 算术运算程序 二十进制转换 3. 除法运算 MOV B,#100 DIV AB ;除以100 MOV 30H,A ;商为百位 MOV A,B ;余数送A MOV B,#10 DIV AB ;除以10 MOV 31H,A ;商为十位 MOV 32H,B ;余数为个位
§4.3 MCS-51单片机编语言程序设计举例 二. 数制转换程序 1. 十六进制数转换为十进制数 ●将30H单元中的16进制数转换为十进制数,并把十进制数 的百、十、个位分别存于40H,41H,42H单元。 MOV A,30H ;取16进制数 MOV B,#64H DIV AB ;除100 MOV 40H,A ;商为百位数存40H MOV A,#0AH XCH A,B ;除以100的余数作为被除数 DIV AB ;余数再除以10 MOV 41H,A ;商为十位数存41H MOV 42H,B ;余数为个位数存42H RET
清C 减30H Y 小于0 N Y 00H~09H N 减07H Y 小于0AH N Y 大于0FH N 返回 非16进制数 §4.3 MCS-51单片机编语言程序设计举例 二. 数制转换程序 2.ASCII码转换为十六进制数 转换算法: 把转换的ASCII码减30H(0的码是30H)。若差小于0则为非16进制数;若在0~9之间,即为转换结果;若≥0AH(A的码是41H),应再减7。减7后,若在0AH~0FH之间,即为转换结果。
清C 减30H Y 小于0 N Y 00H~09H N 减07H Y 小于0AH N Y 大于0FH N 返回 非16进制数 §4.3 MCS-51单片机编语言程序设计举例 二. 数制转换程序 2. ASCII码转换为十六进制数 例:如把外部RAM 30H~3FH 单元中的ASCII码依次 转换为16进制数,并存 入内部RAM 60H~67H单 元之中。
§4.3 MCS-51单片机编语言程序设计举例 MAIN: MOV R0,#30H ;取码地址 MOV R1,#60H ;存数地址 MOV R7,#08H ;数字节数 ABC: ACALL TRAN ;调子程序 SWAP A ;进高4位 MOV @R1,A ;存数据 INC R0 ACALL TRAN XCHD A,@R1 ;16进制拼装 INC R0 INC R1 DJNZ R7,ABC ;继续 HALT: AJMP HALT TRAN: CLR C MOVX A,@R0 ;取码 SUBB A,#30H CJNE A,#10,TRA1 AJMP TRA2 TRA1: JC TRA9 TRA2: SUBB A,#07H NOP ;A-41H TRA9: RET ;
§4.3 MCS-51单片机编语言程序设计举例 三. 定时程序 1. 单循环定时程序 MOV R7, #TIME LOOP: NOP NOP : NOP DJNZ R7,LOOP NOP的机器周期为1个 DJNZ的机器周期为2 则一次循环需 2+n个 机器周期。 如单片机的晶振频率为6MHz,则一个机器周期是2us,因此定时程序的总延迟时间是: T=2(2+n)×TIME+4(us)
§4.3 MCS-51单片机编语言程序设计举例 三. 定时程序 2. 以一个基本的延时程序满足不同的定时要求 DELAY: MOV R6, #DATA ;延时一秒子程序 DELY1: NOP : NOP DJNZ R6,DELY1 RET MOV R7, #TIME LOOP: LCALL DELAY NOP DJNZ R7,LOOP
§4.3 MCS-51单片机编语言程序设计举例 四. 查表程序 1. 查表指令 MOVC A,@A+DPTR MOVC A,@A+PC ●两种指令功能相同。 ●区别是DPTR的查表范围是64K; PC只能在指令下面256个地址范围内。
§4.3 MCS-51单片机编语言程序设计举例 四. 查表程序 MOV R7,#04H MOV R0,#30H MOV DPTR,#TAB LOP:MOV A,@R0 MOVC A,@A+DPTR MOV @R0,A INC R0 DJNZ R7,LOP RET TAB:DB 30H,31H,~,39H DB 41H,42H,~45H 2. 查表程序举例 例:把 30H~33H 的 16 进制数 转换为ASCII 码,并 存 回 原地址。
§4.3 MCS-51单片机编语言程序设计举例 五. 数据极值查找程序 六. 数据排序程序 1. 算法说明 2. 程序设计 七. 数据检索程序 1. 顺序检查 2. 对分检索
§4.4 MCS-51汇编语言的伪指令 ●伪指令具有控制汇编程序的输入输出、定义数 据和符号、条件汇编、分配存储间等功能。 ●汇编语言不同伪指令也不同。 伪指令是程序员发给汇编程序的命令,也称 为汇编命令或汇编程序控制指令。 ●只在汇编前的源程序中才有伪指令。汇编得到目 标程序后,伪指令已不存在。 ●目标程序中没有伪指令相对应的机器码。
§4.4 MCS-51汇编语言的伪指令 1.ORG(ORiGin)汇编起始地址命令 ●本命令总是出现在源程序的开头位置。 ●用于规定目标程序的起始地址。 ●命令格式: [<标号:>] ORG <地址> 其:[<标号:>]是选择项,根据需要选用。 <地址>项:为16位绝对地址, 也可用标号或表达式。 ●如不用ORG,则汇编的目标程序将从0000H开始。 例如: ORG 8000H START:MOV A,#00H 规定标号START代表地址8000H