单片机教程-汇编语言程序设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
;取入口数据(23BCD)
ANL A,#0F0H ;取出十位
SWAP A
;高4位 低4位
MOV B,#10
MUL AB ;十位乘10
MOV R3,A ;积暂存进R3
MOV A,R2 ANL A,#0FH ADD A,R3 MOV R2,A
SJMP $ END
;再取入口数据 ;取出个位 ;加上个位 ;结果 R2(17h)
例3-7:将R5R4中的双字节BCD码数转为十六进制数存 于R5R4中.(KEIL演示OK)
编程要点: 1.两字节 BCD码数范围为: 0000H—9999H 2.相应2进制/16进制数为: 0000H—270FH 3.调用BCD2B子程序实现“千位,百位”转为二进制,并
乘100; 4.再调用BCD2B子程序实现“十位,个位”转为二进制;
汇编语言程序设计
教学要求: 1.进一步熟悉指令系统,自己可以看懂书上的程序; 2.自己可以编写20行以内的程序,并在计算机上调试通过,考试编程必考
3.1 汇编语言程序设计中的数
3.2 汇编语言编程基本规则
3.3 汇编程序的伪指令
3.4 汇编语言程序的结构
3.5 几种常见程序
3.5.1 简单程序
3.5.2 分支程序设计
1.ORG addr16——汇编程序中一定要写!(ORIGINE) 规定编译后的机器代码存放的起始位置.可以多次使用ORG命令 2.END——ASM51程序中一定要写!
表示翻译到此结束,其后的任何内容不予理睬. 每段程序只能有一条END指令 3.$ ——“当前PC值”也叫位置计数器,代表正在执行的指令所在 位置. 如:HERE:SJMP HERE 可写为: SJMP $ 4.符号名称 EQU 表达式 (EQUATE) 将表达式的值赋予符号名称,程序中凡出现该符号名称就等同于 该表达式.
例3-2: (Keil 演示 OK)
ORG 1500H
TAB2: DW 1234H,80H
解 答 : (1500H)=12H, (1501H)=34H, (1502H)=00H, (1503H)=80H.
预留存储空间伪指令DS (STORAGE)
格式: [标号: ]DS 表达式 该伪指令的功能是从标号指定的单元开始, 保留若干 字节的内存空间以备源程序使用. 存储空间内预留的存储单 元数由表达式的值决定. 例3-3: ORG 1000H (Keil 通过)
2.画流程图(VISIO,亿图) 画流程图是指用各种图形、符号、指向线等来说明
程序设计的过程.国际通用的图形和符号说明如下:
椭圆框:起止框,在程序的开始和结束时使用. 矩形框:处理框,表示要进行的各种操作. 菱形框:判断框,表示条件判断,以决定程序的流向. 指向线:流程线,表示程序执行的流向. 圆 圈:连接符,表示不同页之间的流程连接. 各种几何图形符号如下图所示:
(R5,R4)=23 45(BCD)=09 29(H)= 9*16^2+2*16+9
(R5) 千 百 调 BCD2B
十 个 (R4)
(A) 二进制 X 100
调 BCD2B
(B) 二进制
(A)
二进制 +
(A) 二进制
R4
+ Cy
二进制 (R5)
二进制 (R4)
例3-8: 16进制数(00H—0FH)转ASCII码子程序 (keil演示) 0~9 → 30H~39H, A~F → 41H~46H(记忆) 算法:凡<10的十六进制数加30H
十六进制数必须带后缀“H”或“h”; 十进制数的后缀是“D”或“d”或无.
3.3 汇编程序的伪指令
1.汇编程序→软件→工具→工具软件:将程序员用汇编 语言编写的程序翻译成机器码 2.用汇编语言编写的程序在此被称为应用程序 3.指令:告诉计算机如何操作以及做何种操作(有机器码) 4.伪指令:告诉汇编程序在翻译应用程序时有何具体约 定.伪指令不进行具体的操作,那是一般指令的事. 比如: 从何处开始,何处结束,某些编程者自己规定的表述代表什 么意思…… (没有机器码)
最后,对位相加.
MAIN:MOV A,R4 MOV R2,A LCALL BCD2B MOV A,R2 MOV R4,A ;R4暂存
MOV A,R5 MOV R2,A LCALL BCD2B MOV A,R2 MOV B,#100 MUL AB ADD A,R4 MOV R4,A MOV A,B ADDC A,#00H MOV R5,A RET
常用的十六进制数和十进制数的.
1.机器指令/目标代码:由0/1代码组成的操作码与操作数.
2.二进制数:由0/1组成、“逢2进1”的数制.
如:01011110B (0~1 后缀:B/b Binary )
3.十六进制数:便于读写记忆的二进制数的简写形式. (0~
9,A~F 后缀:H/h Hexadecimal )
3.5.3 循环程序设计 3.5.4 散转程序设计
3.5.5 查表程序设计 3.5.6 子程序和参数传递
3.5.7 关键字查找程序设计 3.5.8 数据极值查找程序设计
3.5.9 数据排序程序设计 3.5.10 码制转换程序设计
3.1 汇编语言程序设计中的数
计算机只能识别二进制数——机器指令,它原本是不认识
SUBB A,#0AH
MOV A,R2
;重取待转换的数据
JC SMALL ;C=1,小于10就跳去加30H
ADD A,#07H ;≥10就先加7 再去加30H
SMALL: ADD A,#30H
MOV R2,A
;存结果(出口)
SJMP $
END
3.5.2 分支程序设计
1.单分支程序 单分支结构程序使用转移指令实现,根据条件对程序的执行进行判断,满足条件转移执行,否则
4.BCD码:用二进制数表达的十进制数.
(0~9表
示为:0000~1001B)
3.2 汇编语言编程基本规则
1.汇编语言:用助记符描述的指令的集合. 2.汇编程序:汇编语言编写的程序借助编译工具 编译成为目标代码,计算机才能识别.这个编译工具称为汇编程 序. 3.[标号:]操作码 [目的操作数][,源操作数][;注释] √指令中以 A—F 开头的十六进制数前必须添一个 “0”. √二进制数必须带后缀“B”或“b”;
例3-4: EQU和DATA的以用法(KEIL演示 OK) ORG 0000H
A10 EQU 10H A20 DATA 20H
MOV R0,A10
;直接用A10, 10H单元中的内容 →R0
MOV R1,A10+1
;A10+1,11H中的内容 →R1
MOV R2,#A10
;注意使用了#, #10H立即数 →R2 注意
DS 20H
DB 30H, 8FH
汇编后: 从 1000H开始, 预留 32(20H)个字节的内存单元, 然 后从 1020H开始, 按照下一条DB指令赋值, 即(1020H)=30H, (1021H)=8FH. 保留的存储空间将由程序的其它部分决定它 们的用处.
等值指令EQU (Equate) 指令格式: 字符名称 EQU 功能: 使指令中的字符名称等价于给定的数字或汇编符号. 使用等值指令可给程序的编制、调试、修改带来方便, 如果 在程序中要多次使用到某一地址,由EQU指令将其赋值给一个字 符名称, 一旦需要对其进行变动, 只要改变EQU命令后面的数字即 可, 而不需要对程序中涉及到该地址的所有指令逐句进行修改. 但 要注意, 由 EQU等值的字符名称必须先赋值后使用, 且在同一个 源程序中, 同一个标号只能赋值一次. 例: PA8155 EQU 8001H 即给标号PA8155赋值为8001H.
凡≥10的十六进制数加37H (参见课件的ASCII码表)
解1: ORG 0000H ;入口参数出口参数均在R2中
H2ASC: MOV A,R2
;取待转换的数据(入口)
ADD A,#0F6H ;判此数是否≥10 ?F6+A=1 00(H)
;若≥10,则C=1;<10,则C=0
MOV A,R2 ;重取待转换的数据
;将Cy清零
MOV R0,#41H
;将被加数地址指针送R0
MOV R1,#51H
;将加数 地址指针送R1
AD1: MOV A, @R0 ;被加数低字节的内容送入A
ADD A,@R1 ;两个低字节相加
MOV @R0,A ;低字节的和存入被加数低字节中
DEC R0
;指向被加数高位字节
DEC R1
;指向加数高位字节
15
3.5 几种常见程序
3.5.1 顺序程序
例3-5: 两个无符号双字节数相加. (KEIL演示) 设被加数存放于内部RAM的40H(高位字节), 41H(低位 字节), 加数存放于50H(高位字节), 51H(低位字节), 和 数存入 40H和41H单元中.
ORG 0000H
START: CLR C
DB '5','A','BCD'
解答:(2000H) = 30H, (2001H)=8AH, (2002H)=7FH
(2003H) = 49H ; 十进制数 73 以十六进制数存放
(2004H) = 35H ; 数字 5 的ASCII码
(2005H) = 41H ; 字母A的ASCII码
(2006H) = 42H ; ‘BCD’中B的ASCII码
顺序执行.在MCS-51指令系统中条件转移指令有: (1)判A转移指令JZ、JNZ; (2)判位转移指令JB、JNB、JBC、JC、JNC; (3)比较转移指令CJNE; (4)减1不为0转移指令DJNZ;
例3-9:假定在外部RAM中有ST1、ST2和ST3共3个连续单元,其中ST1、ST2单元中分别 存放着两个8位无符号数,要求找出其中的大数并存入ST3单元.
将双字节数据[或双字节数据组]顺序存放在此后的存储单元 中,占据相应存储空间. 8.DATA 数据地址赋值 命令格式:字符名称 DATA 表达式 功能:将数据地址或代码地址赋予规定的字符名称
例3-1: (Keil 演示 OK) c:2000h
ORG 2000H
TAB1: DB 30H,8AH,7FH,73
5.符号名称 BIT 位地址 将位地址的值赋予符号名称,程序中凡出现该符号名称就代表
该位地址.如:AΒιβλιοθήκη Baidu BIT P1.0 6.DB 8位数据[或8位数据组] (Define Byte)
将8位数据[或8位数据组]顺序存放在此后的存储单元中,占相 应数量的存储空间. 7.DW 双字节数据[或双字节数据组] (Define Word)
MOV A, @R0 ;被加数高位字节送入A
ADDC A, @R1
;两个高位字节带Cy相加
MOV @R0,A ;高位字节的和送被加数高位字节
SJMP $
END
例3-6:将R2中BCD码数转为十六进制数存进R2(0X23=17h) (此子程序在下一例中还要用到)keil演示
ORG 0000H
BCD2B: MOV A,R2
(2007H) = 43H
; ‘BCD’中C的ASCII码
(2008H) = 44H ; ‘BCD’中D的ASCII码
DW伪指令与DB的功能类似, 所不同的是DB用于定义一 个字节(8 位二进制数), 而DW则用于定义一个字(即两个字 节, 16 位二进制数). 在执行汇编程序时, 机器会自动按高 8 位先存入, 低 8 位后存入(记忆!)的格式排列, 这和MCS-51 指令中 16 位数据存放的方式一致.
(keil演示)
分析:两个无符号数的大小比较可利用两数相减是否有借位来判断,流程图和程序如下 所示:
ST1 EQU 4000h
ORG 0000h
START: CLR C
MOV
DPTR,#ST1
MOVX A,@DPTR ;取第一个数
体会这些细微的用法
MOV R3,A20 MOV R4,A20+1 MOV R5,#A20 SJMP $ END
3.4 汇编语言程序的结构
1.程序设计的基本步骤,一般步骤为: (1)分析题意,明确要求; (2)建立思路,确定算法; (3)编制框图,绘出流程; (4)编写程序,上机调试; 显然,算法和流程是至关重要的.程序结构有简单顺序、 分支、循环和子程序等几种基本形式.
JNC AD30H ;C=0,小于10就跳去加30H
ADD A,#07H ;≥10就先加7 再去加30H
AD30H: ADD A,#30H
MOV R2,A ;存结果(出口)
SJMP $
END
解2: ORG 0000H ;入口参数出口参数均在R2中
H2ASC: MOV A,R2 ;取待转换的数据(入口)