单片机学习第四章汇编语言程序设计
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
整理课件
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。
通常用于定义一个常数表。Xi为单字节数据, 它为二进制、八进制、十进制或十六进制数, 也可以为一个表达式,还可以是由两个单引 号所括起来的一个字符串,或单引号括起来 的字符。
整理课件
3.字定义伪指令 格式:[标号:] DW Y1,Y2,…,Yn 功能:从指定地址开始,存放若干字数据。 注意:在程序存储器空间定义双字节数据,
6.位定义伪指令 格式:[标号] BIT 位地址 功能:将位地址赋给标号。
其中,标号为字符名称,其后无冒号。 例如:
A1 BIT P0.1 A2 BIT PSW.3
整理课件
4.2 汇编语言程序设计
4.2.1 汇编程序设计基础 1.汇编语言程序设计的步骤: (1)分析问题,明确任务 (2)确定算法 (3)画出程序流程图 (4)编写源程序 (5)汇编和调试
;低8位送A ; ;
;送结果低位 ;高8位送A ; ;加进位
;送结果高位
整理课件
【例4.4】将内部RAM的60H单元中的无符号 二进制数转换为3位BCD码,并将结果按由 高位到低位的顺序存放到63H、62H、61H 单元中。
分析:8位无符号二进制数表示的数据范围 0~255,所以用BCD码,最多3位。可将被 转换的数除以100,商即百位数;余数再除 以10得十位数;最后余数即为个位数。
第4章 汇编语言程序设计
➢计算机在完成一项工作时,必须按照顺序 执行各项操作。这些操作是计算机程序设 计人员按照解决问题的步骤事先描述好的 算法,设计出相应的程序,然后由计算机 去执行。
➢程序设计就是用计算机所能接受的形式把 解决问题的步骤描述出来。
➢本章介绍汇编语言程序设计的基础知识, 通过实例让学习汇编语言程序的设计方法。
整理课件
1.汇编起始地址命令 格式:ORG nn 功能:规定此命令之后的程序或数据的存 放起始地址。 ORG伪指令总是出现在每段源程序或数据 块的开始。
整理课件
2.定义字节伪指令 格式:[标号:] DB X1,X2,…,Xn 功能:从指定地址开始,存放若干字节数据。 注意:在程序存储器空间定义8位单字节数据,
整理课件
4.汇编结束伪指令 END 该伪指令指出结束汇编,即使后面还有指令,
汇编程序也不处理。
5.赋值伪指令 格式:标号 EQU 表达式 功能:将表达式的值(数据或地址)赋给标 号。
整理课件
• 注意:标号为字符名称,其后无冒 号。在一个程序中对于某一个标号 只能赋一次值,一旦赋值在本程序 的任意位置就可以引用该标号。
• 例如:
ORG 3000H
STA TAB MUL
EQU 80H EQU 10 EQU 4000H MOV A,STA MOV B,TAB LCALL MUL
定义了三个标号: STA=80H,TAB=10, MUL=4000H,在程 序中直接引用这三个 标号来代替80H、10、 4000H。
整理课件
整理课件
4.注释 注释不是汇编语言的功能部分,它是语句 的说明部分,用于改善程序的可读性,它 以分号“;”开始。注释可为一行或多行 (每行均以分号开始)。
整理课件
4.1.3 伪指令 所谓伪指令又称为伪操作,它不象机器指 令那样是在程序运行期间由计算机来执行 的,它是在汇编程序对源程序汇编时,由 汇编程序处理的操作,它们可以完成如数 据定义、分配存储器、指示程序结束等功 能。
整理课件
【例4.1】两个8位无符号数相加,和仍为8位。
分析:假设两个无符号数X、Y分别存放于内部 RAM的60H、61H单元中,求和并存于62H单元 中0H
;设R0为数据指针
MOV
A, @R0
;将X值送入A中
INC
R0
ADD
A,@R0
;X+Y
INC
R0
;加进位位 ;存和数进位位 ;
整理课件
【例4.3】16位二进制数求补,设两个字节原 码数存在R1R0中,求补后结果存在R3R2 中。
分析:二进制数求补操作,可采用“原码求 反+1”的方法来实现,可使用求反指令和加 法指令来实现。
整理课件
程序如下: ORG 1000H MOV A,R0 CPL A ADD A,#01H MOV R2,A MOV A,R1 CPL A ADDC A,#00H MOV R3,A SJMP $ END
整理课件
• 循环程序的结构一般由两种形式:
整理课件
1.单循环程序设计 【例4.8】循环次数已知的单重循环。
在内部RAM的 20H~2FH连续16个单元中 存放单字节无符号数。求这16个无符号数 之和,并存入内部RAM 61H和60H中。 分析:这是重复相加问题,且事先知道循环 次数,故采用计数器控制的循环程序设计 方法。设用R0作加数地址指针,R7作循环 次数计数器,R3作和数的高字节寄存器。
整理课件
【例4.7】设变量x存入30H单元,求得函数y 存入31H单元。按下式要求给y赋值: x+1 (10<x) y= 0 (5≤x≤10) x-1 (x<5)
分析:要根据x的大小来决定y值,在判断x< 5和x>10时,采用CJNE和JC以及CJNE和 JNC指令进行判断。
整理课件
程序如下:
ORG 1000H MOV A,30H CJNE A,#5,NEXTl NEXT1:JC NEXT2 MOV R0,A INC R0 CJNE A,#11,NEXT3 NEXT3:JNC NEXT4
整理课件
4.2.4 循环程序设计 循环程序一般包括以下5部分: ① 初始化部分:循环程序的准备部分,把初始参数
赋给控制变量。 ② 循环处理部分:循环程序反复执行的部分,这是
循环程序的实体。 ③ 修改部分:修改控制变量的值,为进入下一轮循
环做准备。 ④ 控制部分:根据循环结束条件,判断循环是否结
束。 ⑤ 结束部分:分析、处理及存放程序执行结果。
;存十位
;存个位BCD
4.2.3 分支程序设计
图4-1 分支程序流程图
整理课件
【例4.5】设内部RAM 60H和61H单元中存放 两个无符号数,试比较它们的大小。将较 小的数存放在60H单元,较大的数存放在 61H单元中。
分析:这是一个简单分支程序,可以使两数 相减,用JC指令进行判断。若CY=1,则被 减数小于减数。
法。 (2)合理地绘制程序流程图 (3)少用无条件转移指令,尽量采用循环结
构和子程序结构。 (4)充分利用累加器。 (5)精心设计主要程序段。 (6)对于中断要注意保护和恢复现场。
整理课件
4.2.2 顺序程序设计 顺序结构程序又称为简单结构程序,是指 一种顺序执行的程序,程序从第一条指令 到最后一条指令的整个执行过程中既无分 支又无循环。
3.操作数 操作数是该指令操作所需要的数据。
注意:这一字段可能有也可能没有,当多于 一个操作数时,操作数之间用逗号分隔。
整理课件
操作数字段的内容可以包括以下几项: (1)工作寄存器名; (2)特殊功能寄存器名; (3)标号名; (4)常数; (5)$:该符号用来表示程序计数器的当 前值。该符号常出现在转移指令中; (6)表达式:在汇编时,计算出表达式的 值,并把该值填入目标码中。
整理课件
2.汇编语言程序的格式
ORG 起始地址
……
;数据存放
……
;程序代码
SJMP $
;原地踏步
END
整理课件
3.汇编语言源程序的汇编 汇编语言源程序必须转换成计算机能过识 别的目标程序后才能执行,汇编方法通常 有机器汇编和手工汇编两种方法。
整理课件
4.汇编语言程序设计的技巧 (1)尽量采用模块化、结构化的程序设计方
整理课件
4.1.2 汇编语言格式
汇编语言语句格式为: 标号:操作码 操作数 ;注释
1.标号是由用户定义的符号地址,指明该指 令的起始地址。 标号是由英文字母开头的1~8个字母和数字 组成的字符串,以冒号“:”结尾。
整理课件
2.操作码 操作码表示该语句要执行的操作内容,是 每一条汇编语言必有的部分。操作码用助 记符表示,在操作码后面至少要有一个空 格,使它与操作数分开。
整理课件
编程如下:
ORG 1000H
HBCD: MOV A,60H
MOV B,#100
DIV AB
MOV 63H,A
MOV A,B
MOV B,#10
DIV AB
MOV 62H,A BCD
MOV 61H,B
SJMP $
END
整理课件
;取原数据 ;除数100→B ;除100 ;百位BCD
;除数10→B ;
整理课件
本章难点:
1 汇编语言程序设计算法的确定及绘制程序流程图 2 多重循环程序设计及子程序设计与调用 3 综合应用程序设计的实现
整理课件
4.1 汇编语言简介
4.1.1 程序设计语言 1.机器语言:机器语言是直接面向硬件的二
进制代码指令。 2.汇编语言:汇编语言是机器语言的符号表
示,与机器语言一一对应,编程效率高, 实时性好,但也不能跨平台工作。 3.高级语言:高级语言是一种面向算法和过 程的语言 。
整理课件
ORG 1000H
CLR C MOV A,R0 ADD A,R2 MOV R0,A MOV A,Rl
→A ADDC A,R3 MOV R1,A MOV A,#0 ADDC A,#0 MOV R2,A
SJMP $
END
;取被加数低字节→A ;与加数低字节相加 ;存和数低字节
;取被加数高字节
;与加数高字节相加 ;存和数高字节
整理课件
本章总体要求:
1 熟练掌握汇编语言语句的格式、常用的伪指令和程序流程图 2 掌握汇编语言程序设计的步骤和技巧 3 熟悉顺序、分支、循环结构和子程序调用等程序的应用特征 4 能够独立完成本章作业
整理课件
本章重点:
1 汇编语言程序设计中常用伪指令的使用 2 汇编语言程序设计的步骤 3 分支与循环描述的理解与实现 4 综合程序的设计
分析:数字0~9的ASCII码分别是30H~39H, 英文大写字母A~F的ASCII码分别是 41~46H。因此,若该十六进制数小于10, 要转换为ASCII码应加30H,若该十六进制 数大于10,则加37H。
整理课件
ORG 1000H MOV A,R2 CJNE A,#0AH,L1 L1: JNC ADD37 ADD30:ADD A,#30H MOV R2,A SJMP FINISH ADD37:ADD A,#37H MOV R2,A FINISH:SJMP $ END
整理课件
ORG 0200H
START:MOV R7,#15 ;循环次数
MOV R3,#0 ;装和的高字节
MOV A, 20H
;
MOV R0,#21H ;加数的地址
LOOP:ADD A,@R0 ;累加和在A中
JNC NEXT
;没进位则跳NEXT
INC R3
;有进位,则高位加1
NEXT:INC R0
;加数地址加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。
通常用于定义一个常数表。Xi为单字节数据, 它为二进制、八进制、十进制或十六进制数, 也可以为一个表达式,还可以是由两个单引 号所括起来的一个字符串,或单引号括起来 的字符。
整理课件
3.字定义伪指令 格式:[标号:] DW Y1,Y2,…,Yn 功能:从指定地址开始,存放若干字数据。 注意:在程序存储器空间定义双字节数据,
6.位定义伪指令 格式:[标号] BIT 位地址 功能:将位地址赋给标号。
其中,标号为字符名称,其后无冒号。 例如:
A1 BIT P0.1 A2 BIT PSW.3
整理课件
4.2 汇编语言程序设计
4.2.1 汇编程序设计基础 1.汇编语言程序设计的步骤: (1)分析问题,明确任务 (2)确定算法 (3)画出程序流程图 (4)编写源程序 (5)汇编和调试
;低8位送A ; ;
;送结果低位 ;高8位送A ; ;加进位
;送结果高位
整理课件
【例4.4】将内部RAM的60H单元中的无符号 二进制数转换为3位BCD码,并将结果按由 高位到低位的顺序存放到63H、62H、61H 单元中。
分析:8位无符号二进制数表示的数据范围 0~255,所以用BCD码,最多3位。可将被 转换的数除以100,商即百位数;余数再除 以10得十位数;最后余数即为个位数。
第4章 汇编语言程序设计
➢计算机在完成一项工作时,必须按照顺序 执行各项操作。这些操作是计算机程序设 计人员按照解决问题的步骤事先描述好的 算法,设计出相应的程序,然后由计算机 去执行。
➢程序设计就是用计算机所能接受的形式把 解决问题的步骤描述出来。
➢本章介绍汇编语言程序设计的基础知识, 通过实例让学习汇编语言程序的设计方法。
整理课件
1.汇编起始地址命令 格式:ORG nn 功能:规定此命令之后的程序或数据的存 放起始地址。 ORG伪指令总是出现在每段源程序或数据 块的开始。
整理课件
2.定义字节伪指令 格式:[标号:] DB X1,X2,…,Xn 功能:从指定地址开始,存放若干字节数据。 注意:在程序存储器空间定义8位单字节数据,
整理课件
4.汇编结束伪指令 END 该伪指令指出结束汇编,即使后面还有指令,
汇编程序也不处理。
5.赋值伪指令 格式:标号 EQU 表达式 功能:将表达式的值(数据或地址)赋给标 号。
整理课件
• 注意:标号为字符名称,其后无冒 号。在一个程序中对于某一个标号 只能赋一次值,一旦赋值在本程序 的任意位置就可以引用该标号。
• 例如:
ORG 3000H
STA TAB MUL
EQU 80H EQU 10 EQU 4000H MOV A,STA MOV B,TAB LCALL MUL
定义了三个标号: STA=80H,TAB=10, MUL=4000H,在程 序中直接引用这三个 标号来代替80H、10、 4000H。
整理课件
整理课件
4.注释 注释不是汇编语言的功能部分,它是语句 的说明部分,用于改善程序的可读性,它 以分号“;”开始。注释可为一行或多行 (每行均以分号开始)。
整理课件
4.1.3 伪指令 所谓伪指令又称为伪操作,它不象机器指 令那样是在程序运行期间由计算机来执行 的,它是在汇编程序对源程序汇编时,由 汇编程序处理的操作,它们可以完成如数 据定义、分配存储器、指示程序结束等功 能。
整理课件
【例4.1】两个8位无符号数相加,和仍为8位。
分析:假设两个无符号数X、Y分别存放于内部 RAM的60H、61H单元中,求和并存于62H单元 中0H
;设R0为数据指针
MOV
A, @R0
;将X值送入A中
INC
R0
ADD
A,@R0
;X+Y
INC
R0
;加进位位 ;存和数进位位 ;
整理课件
【例4.3】16位二进制数求补,设两个字节原 码数存在R1R0中,求补后结果存在R3R2 中。
分析:二进制数求补操作,可采用“原码求 反+1”的方法来实现,可使用求反指令和加 法指令来实现。
整理课件
程序如下: ORG 1000H MOV A,R0 CPL A ADD A,#01H MOV R2,A MOV A,R1 CPL A ADDC A,#00H MOV R3,A SJMP $ END
整理课件
• 循环程序的结构一般由两种形式:
整理课件
1.单循环程序设计 【例4.8】循环次数已知的单重循环。
在内部RAM的 20H~2FH连续16个单元中 存放单字节无符号数。求这16个无符号数 之和,并存入内部RAM 61H和60H中。 分析:这是重复相加问题,且事先知道循环 次数,故采用计数器控制的循环程序设计 方法。设用R0作加数地址指针,R7作循环 次数计数器,R3作和数的高字节寄存器。
整理课件
【例4.7】设变量x存入30H单元,求得函数y 存入31H单元。按下式要求给y赋值: x+1 (10<x) y= 0 (5≤x≤10) x-1 (x<5)
分析:要根据x的大小来决定y值,在判断x< 5和x>10时,采用CJNE和JC以及CJNE和 JNC指令进行判断。
整理课件
程序如下:
ORG 1000H MOV A,30H CJNE A,#5,NEXTl NEXT1:JC NEXT2 MOV R0,A INC R0 CJNE A,#11,NEXT3 NEXT3:JNC NEXT4
整理课件
4.2.4 循环程序设计 循环程序一般包括以下5部分: ① 初始化部分:循环程序的准备部分,把初始参数
赋给控制变量。 ② 循环处理部分:循环程序反复执行的部分,这是
循环程序的实体。 ③ 修改部分:修改控制变量的值,为进入下一轮循
环做准备。 ④ 控制部分:根据循环结束条件,判断循环是否结
束。 ⑤ 结束部分:分析、处理及存放程序执行结果。
;存十位
;存个位BCD
4.2.3 分支程序设计
图4-1 分支程序流程图
整理课件
【例4.5】设内部RAM 60H和61H单元中存放 两个无符号数,试比较它们的大小。将较 小的数存放在60H单元,较大的数存放在 61H单元中。
分析:这是一个简单分支程序,可以使两数 相减,用JC指令进行判断。若CY=1,则被 减数小于减数。
法。 (2)合理地绘制程序流程图 (3)少用无条件转移指令,尽量采用循环结
构和子程序结构。 (4)充分利用累加器。 (5)精心设计主要程序段。 (6)对于中断要注意保护和恢复现场。
整理课件
4.2.2 顺序程序设计 顺序结构程序又称为简单结构程序,是指 一种顺序执行的程序,程序从第一条指令 到最后一条指令的整个执行过程中既无分 支又无循环。
3.操作数 操作数是该指令操作所需要的数据。
注意:这一字段可能有也可能没有,当多于 一个操作数时,操作数之间用逗号分隔。
整理课件
操作数字段的内容可以包括以下几项: (1)工作寄存器名; (2)特殊功能寄存器名; (3)标号名; (4)常数; (5)$:该符号用来表示程序计数器的当 前值。该符号常出现在转移指令中; (6)表达式:在汇编时,计算出表达式的 值,并把该值填入目标码中。
整理课件
2.汇编语言程序的格式
ORG 起始地址
……
;数据存放
……
;程序代码
SJMP $
;原地踏步
END
整理课件
3.汇编语言源程序的汇编 汇编语言源程序必须转换成计算机能过识 别的目标程序后才能执行,汇编方法通常 有机器汇编和手工汇编两种方法。
整理课件
4.汇编语言程序设计的技巧 (1)尽量采用模块化、结构化的程序设计方
整理课件
4.1.2 汇编语言格式
汇编语言语句格式为: 标号:操作码 操作数 ;注释
1.标号是由用户定义的符号地址,指明该指 令的起始地址。 标号是由英文字母开头的1~8个字母和数字 组成的字符串,以冒号“:”结尾。
整理课件
2.操作码 操作码表示该语句要执行的操作内容,是 每一条汇编语言必有的部分。操作码用助 记符表示,在操作码后面至少要有一个空 格,使它与操作数分开。
整理课件
编程如下:
ORG 1000H
HBCD: MOV A,60H
MOV B,#100
DIV AB
MOV 63H,A
MOV A,B
MOV B,#10
DIV AB
MOV 62H,A BCD
MOV 61H,B
SJMP $
END
整理课件
;取原数据 ;除数100→B ;除100 ;百位BCD
;除数10→B ;
整理课件
本章难点:
1 汇编语言程序设计算法的确定及绘制程序流程图 2 多重循环程序设计及子程序设计与调用 3 综合应用程序设计的实现
整理课件
4.1 汇编语言简介
4.1.1 程序设计语言 1.机器语言:机器语言是直接面向硬件的二
进制代码指令。 2.汇编语言:汇编语言是机器语言的符号表
示,与机器语言一一对应,编程效率高, 实时性好,但也不能跨平台工作。 3.高级语言:高级语言是一种面向算法和过 程的语言 。
整理课件
ORG 1000H
CLR C MOV A,R0 ADD A,R2 MOV R0,A MOV A,Rl
→A ADDC A,R3 MOV R1,A MOV A,#0 ADDC A,#0 MOV R2,A
SJMP $
END
;取被加数低字节→A ;与加数低字节相加 ;存和数低字节
;取被加数高字节
;与加数高字节相加 ;存和数高字节
整理课件
本章总体要求:
1 熟练掌握汇编语言语句的格式、常用的伪指令和程序流程图 2 掌握汇编语言程序设计的步骤和技巧 3 熟悉顺序、分支、循环结构和子程序调用等程序的应用特征 4 能够独立完成本章作业
整理课件
本章重点:
1 汇编语言程序设计中常用伪指令的使用 2 汇编语言程序设计的步骤 3 分支与循环描述的理解与实现 4 综合程序的设计
分析:数字0~9的ASCII码分别是30H~39H, 英文大写字母A~F的ASCII码分别是 41~46H。因此,若该十六进制数小于10, 要转换为ASCII码应加30H,若该十六进制 数大于10,则加37H。
整理课件
ORG 1000H MOV A,R2 CJNE A,#0AH,L1 L1: JNC ADD37 ADD30:ADD A,#30H MOV R2,A SJMP FINISH ADD37:ADD A,#37H MOV R2,A FINISH:SJMP $ END
整理课件
ORG 0200H
START:MOV R7,#15 ;循环次数
MOV R3,#0 ;装和的高字节
MOV A, 20H
;
MOV R0,#21H ;加数的地址
LOOP:ADD A,@R0 ;累加和在A中
JNC NEXT
;没进位则跳NEXT
INC R3
;有进位,则高位加1
NEXT:INC R0
;加数地址加1