1、2.8 2.8 汇编语言程序设计汇编语言程序设计 通过前面的学习,我们已经了解了单片机内部的通过前面的学习,我们已经了解了单片机内部的结构,结构,MCS-51MCS-51指令系统的寻址方式、各类指令的格式指令系统的寻址方式、各类指令的格式及功能。及功能。下面我们就是要如何利用下面我们就是要如何利用MCS-51MCS-51的指令系统,来的指令系统,来编写高效、充分利用其特点的程序。编写高效、充分利用其特点的程序。2022-11-1412.8.2.8.1 1 概述概述 程序设计语言程序设计语言1.1.机器语言机器语言2.2.汇编语言汇编语言3.3.高级语言高级语言2022-11-142 编制程序的
2、步骤编制程序的步骤1.1.任务分析(硬件、软件系统分析)任务分析(硬件、软件系统分析)2.2.确定算法和工作步骤;确定算法和工作步骤;3.3.程序总体设计和流程图绘制程序总体设计和流程图绘制关于流程图符号:关于流程图符号:开始、结束开始、结束-圆角矩形圆角矩形工作任务工作任务-矩形矩形判断分支判断分支-菱形菱形程序流向程序流向-程序连接程序连接-开始结束2022-11-1434.4.分配内存,确定程序与数据区存放地址;分配内存,确定程序与数据区存放地址;5.5.编写源程序;编写源程序;6.6.调试、修改,最终确定程序。调试、修改,最终确定程序。2022-11-144 方法技巧方法技巧1.1.模
3、块化设计(按功能分:显示、打模块化设计(按功能分:显示、打 印、输入、发送等)印、输入、发送等)2.2.尽量采用循环及子程序结构(节省内存)尽量采用循环及子程序结构(节省内存)2022-11-145 汇编语言的规范汇编语言的规范1.1.汇编语言源程序由以下两种指令构成汇编语言源程序由以下两种指令构成汇编语句(指令语句)汇编语句(指令语句)伪指令伪指令 (指示性语句)(指示性语句)2.2.汇编语句的格式:汇编语句的格式:标号标号:操作码操作码操作数操作数;注释;注释数据表示形式:数据表示形式:二进制(二进制(B B)、十六进制)、十六进制(H)H)、十进制、十进制(D D或省略或省略)、ASCI
4、IASCII码(以单引号标识)码(以单引号标识)2022-11-1463.3.伪指令:控制汇编用的特殊指令,这些指令不属伪指令:控制汇编用的特殊指令,这些指令不属 于指令系统,不产生机器代码。于指令系统,不产生机器代码。2022-11-147常用的伪指令v ORG ORG (Origin)(Origin)定位目的程序的起始地址。定位目的程序的起始地址。格式:格式:ORG ORG 表达式表达式 如如 :ORG 0000HORG 0000H 注注 :表达式必须为:表达式必须为1616位地址值。位地址值。v END END 汇编语言程序结束伪指令。汇编语言程序结束伪指令。注:注:一定放在程序末尾!一
5、定放在程序末尾!2022-11-148常用的伪指令v EQU EQU (EQUEQUateate)赋值伪指令。赋值伪指令。格式:格式:字符名称字符名称 EQU EQU 数值或汇编符号数值或汇编符号 例:例:AAAAEQUEQU30H30HK1K1EQUEQU40H40HMOV AMOV A,AAAA;(30H30H)A,A,直接寻址直接寻址MOV AMOV A,K1K1;(40H40H)AA2022-11-149常用的伪指令v DBDB(D Define efine B Byteyte)从指定单元开始定义(存储)若干个字节的数从指定单元开始定义(存储)若干个字节的数据或据或ASCIIASCII
6、码字符,常用于定义数据常数表。码字符,常用于定义数据常数表。格式:格式:DB DB 字节常数或字节常数或ASCIIASCII字符字符例例:ORG 1000HORG 1000HDBDB34H34H,0DEH0DEH,AA,BBDBDB0AH0AH,0BH0BH,20202022-11-1410常用的伪指令vDWDW(D Define efine W Wordord)从指定单元开始定义(存储)若干个字的数据从指定单元开始定义(存储)若干个字的数据 或或ASCIIASCII码字符。码字符。格式:格式:DWDW字常数字常数或或ASCIIASCII字符字符 例:例:ORG 2000HORG 2000HD
7、WDW1234H1234H,BBDWDW0AH0AH,20202022-11-1411常用的伪指令v BITBIT 位地址符号指令。位地址符号指令。(DATA DATA 字节地址赋于规定的字符名称字节地址赋于规定的字符名称)把位地址赋于规定的字符名称。直接地址把位地址赋于规定的字符名称。直接地址 格式格式:字符名称字符名称BITBIT位地址位地址例:例:ABCABCBITBITP1.1P1.1QQQQBITBITP3.2P3.22022-11-14122.8.2.8.2 2 汇编语言程序编辑和汇编汇编语言程序编辑和汇编1.1.编辑(源程序,以编辑(源程序,以.ASMASM扩展名存盘);扩展名存
8、盘);2.2.汇编(手工或汇编(手工或机器汇编机器汇编););如:如:(MOV A,#88H;MOV A,#88H;机器码机器码74,8874,88H H)又如:又如:地址地址 目标码目标码 源程序源程序 ORG 1000HORG 1000H 1000H 747F MOV A,#7FH 1000H 747F MOV A,#7FH 1002H 7944 MOV R1,#44H 1002H 7944 MOV R1,#44H END END2022-11-14132.8.2.8.3 3 程序设计基础与举例程序设计基础与举例 顺序结构程序org 1000h;4K=4096单元;start:mov dp
9、tr,#table;把0的地址送dptr mov a,20h movc a,a+dptr mov 21h,a sjmp$org 2000htable:db 0,1,4,9,16,25 end例1:变量存在内部RAM的20H单元中,其取值范围:05,编成,查表法求其平方值2022-11-1414开始表格首地址送DPTR变量送A(20H)A查平方表(A+DPTR)A结束结果送21H单元:A 21H2022-11-1415例例2 2:将:将2020H H单元的压缩单元的压缩(Packed Packed)BCDBCD码拆成两个码拆成两个ACSIIACSII码存入码存入2121H H、22H22H单元。
10、单元。内部RAM22H21H20H6 93 63 9BCD 0 1 2.9ASCII 30H 31H 32H.39H2022-11-1416方法1(20H)A10HBA/B,A中为高中为高4位位BCD码,码,B中为低中为低4位位BCD码码B+30HBB(21H)A+30HAA(22H)开始结束2022-11-1417周期数周期数 源程序源程序 ORG 2000HORG 2000HMOV AMOV A,20H20HMOV BMOV B,#10H#10HDIV ABDIV ABORL BORL B,#30H#30HMOV 21HMOV 21H,B BORL AORL A,#30H#30HMOV 2
11、2HMOV 22H,A AENDEND124221113;除以;除以1010H H;高高4 4位位BCDBCD码转换位码转换位ASCIIASCII码码;低低4 4位位BCDBCD码转换位码转换位ASCIIASCII码码2022-11-14180(21H)(20H)AA与(21H)的低4位交换(21H)+30H(21H)A的高低半字节交换A+30HAA(22H)开始结束方法2:2022-11-1419 ORG 2000H MOV R0,#21H MOV R0,#0 MOV A,20H XCHD A,R0 ORL 21H,#30H SWAP A ORL A ,#30H MOV 22H,A END;
12、清21H单元;低4位BCD码送21H单元,;低4位BCD码转换位ASCII码;高4位BCD码转换位ASCII码111121119周期数源程序2022-11-1420 分支程序分支程序可根据要求分支程序可根据要求无条件无条件或或条件地条件地改变程序执行流改变程序执行流向。编写分支程序主要在于正确使用向。编写分支程序主要在于正确使用转移指令转移指令。分支。分支程序有:单分支结构、双分支结构、多分支结构(散程序有:单分支结构、双分支结构、多分支结构(散转)转)条件成立?下条指令程序段A单分支结构YN条件成立?程序段AYN程序段A双分支结构2022-11-1421 分支程序分支程序可根据要求无条件或条
13、件地改变程序执行流分支程序可根据要求无条件或条件地改变程序执行流向。编写分支程序主要在于正确使用转移指令。分支向。编写分支程序主要在于正确使用转移指令。分支程序有:单分支结构、双分支结构、多分支结构(散程序有:单分支结构、双分支结构、多分支结构(散转)转)K=?程序段nn0程序段1多分支结构程序段012022-11-1422例例1 1:设变量:设变量x x以补码形式存放在片内以补码形式存放在片内RAM 30HRAM 30H单单元中,变量元中,变量y y与与x x的关系是:的关系是:编程根据编程根据x x的值求的值求y y值并放回原单元。值并放回原单元。0,50,200,xxxHxxy2022-
14、11-1423A=?y=x+50y=20Hy=x0取x 即(30h)A开始存y 即y 20h结束2022-11-1424 ORG 1000HSTART:MOV A,30H JZ NEXT ;x=0,转移 ANL A,#80H ;保留符号位 JZ ED ;x0,转移 MOV A,#05H ;x0,不转移 ADD A,30H MOV 30H,A SJMP ED NEXT:MOV 30H,#20H ED:SJMP$2022-11-1425STARTSTART:MOV DPTRMOV DPTR,#TAB#TAB MOV A MOV A,R7R7 ADD A,R7 ADD A,R7 ;R7R72 2A,
15、16bit A,16bit 的地址的地址 MOV R3,A ;MOV R3,A ;暂存暂存R3R3 MOVC A,A+DPTR MOVC A,A+DPTR ;取高位地址取高位地址 XCHXCH A A,R3R3 INC A INC A MOVC A MOVC A,A+DPTR A+DPTR ;取低位地址取低位地址 MOV DPLMOV DPL,A A MOV DPH MOV DPH,R3 R3 ;转移地址送入转移地址送入DPTRDPTR CLR A CLR A JMP A+DPTR JMP A+DPTR TAB:TAB:DWDW P0 P0 DWDW P1 P1 DW DW PN PN例例2
16、2:根据根据R7R7的内容,转至对应的分支程序。设的内容,转至对应的分支程序。设R7R7的内容为的内容为0 0N N,对应的处理程序地址分别为,对应的处理程序地址分别为P0P0P7P7P0高位P0低位TABP1高位P1低位TAB+22022-11-1426 循环程序循环程序循环程序一般由:初始化部分 循环体部分-处理部分、修改部分、控制部分 结束部分其结构一般有两种:先进入处理部分,再控制循环 至少执行一次循环体 先控制循环,再进入处理部分 循环体是否执行,取决于判断结果。2022-11-1427开始设置循环初值循环处理循环修改结束处理结束循环结束?开始设置循环初值循环处理循环修改结束处理结束
17、循环结束?NYYN2022-11-1428循环控制的一般方法:循环控制的一般方法:v 循环次数已知循环次数已知 利用循环次数控制利用循环次数控制v 循环次数未知循环次数未知 利用关键字控制利用关键字控制v 利用利用“逻辑尺逻辑尺”根据根据“逻辑尺逻辑尺”的内容,进行控制。的内容,进行控制。2022-11-1429例 1:50ms延时子程序。设晶振频率为12MHz,则机器周期为1us。参考p43程序例题;指令周期可以查教材p403附录;参考:P43.DEL:MOV R7,#200 ;1MC,机器周期DEL1:MOV R6,#123 ;1MC NOP ;1MC DJNZ R6,$;2MC DJNZ
18、 R7,DEL1 ;2MC RET ;2MC延时时间:t=1+200(1+1+2*123)+2+2 50000us=50ms2022-11-1430例2(上机调试):将内部RAM中起始地址为data的数据串串送到外部RAM中起始地址为buffer的存储区域中,直到发现$字符,传送停止-循环次数事先不知道先判断,后执行。MOV R0,#data;MOV DPTR,#buffer;LOOP1:MOV A,R0 ;CJNE A,#24H,LOOP2;判断是否为字符 SJMP LOOP3 ;是,转结束LOOP2:MOVX DPTR,A ;不是,传送数据 INC R0 ;INC DPTR ;SJMP L
19、OOP1 ;传送下一数据LOOP3:END2022-11-1431 子程序问题子程序问题子程序设计时注意事项:子程序设计时注意事项:1.1.给子程序赋一个名字。实际为入口地址代号。给子程序赋一个名字。实际为入口地址代号。2.2.要能正确传递参数:要能正确传递参数:入口条件:子程序中要处理的数据如何给予。入口条件:子程序中要处理的数据如何给予。出口条件:子程序处理结果如何存放。出口条件:子程序处理结果如何存放。(寄存器、存储器、堆栈方式)(寄存器、存储器、堆栈方式)3.3.保护与恢复现场:保护与恢复现场:保护现场:保护现场:压栈指令压栈指令PUSHPUSH 恢复现场:恢复现场:弹出指令弹出指令P
20、OPPOP4.4.子程序可以嵌套子程序可以嵌套2022-11-1432例3(上机调试):利用查表法求平方和 ,设a、b、c分别存于内部RAM的DA、DB、DC三个单元中。MOV A,DA ;取a,Da可以用伪指令定义 ACALL SQR ;调用查表子程序 MOV R1,A ;a的平方暂存R1中 MOV A,DB ;取b ACALL SQR ;调用查表子程序 ADD A,R1 ;求出平方和暂存A中 MOV DC,A ;结果存于DC 中 SJMP$SQR:MOV DPTR,#TAB ;子程序 MOVC A,A+DPTR RETTAB:DB 0,1,4,9,16,25,36,49,64,81 END
21、 22bac利用累加器或寄存器传递参数2022-11-1433 算术运算程序的设计算术运算程序的设计例6 多字节无符号数相加。上机实验例7 多字节无符号数相减.上机实验2022-11-1434 码型转换程序的设计码型转换程序的设计一、十六进制数与ASCCII码之间的转换 (对比BCD与ASCCI之间的转换4.3.1中例2)表4-1 十六进制数与ASCII码之间的关系十 六进制数十 六进制数十 六进制数十 六进制数 0 30H 4 34H 8 38H C 43H 1 31H 5 35H 9 39H D 44H 2 32H 6 36H A 41H E 45H 3 33H 7 37H B 42H F
22、 46H2022-11-1435例8 将一位十六进制数转换成ASCII码,设十六进制数存放在R0中,转换后的ASCII码放在R2中。HTASC:MOV A,R0 ;取十六进制数 PUSH ACC ;保护 CLR C ;SUBB A,#0AH ;判断是否大于十 POP ACC ;JC LOOP ;小于十,直接加30H ADD A,#07H ;大于十,加37H LOOP:ADD A,#30H MOV R2,A RET2022-11-1436例9 将多位十六进制数转换成ASCII码,设R0指向十六进制数低位,R2存放字节数,转换后R1指向ASCII码高位。HTASC:MOV A,R0 ;取十六进制数
23、 ANL A,#0FH ;取低四位 ADD A,#15 ;偏移修正 MOVC A,A+PC ;查表得ASCII码 MOV R1,A ;保存 INC R1 MOV A,R0 ;取十六进制数高四位 SWAP A ;ANL A,#0F0H ADD A,#06H ;偏移修正 MOVC A,A+PC ;查表 MOV R1,A ;保存 INC R0 ;指向下一单元 INC R1 DJNZ R2,HTASC RETASCTAB:DB 30H,31H,32H,33H,34H,35H,36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46H2022-11-1437二、BCD码与二进制
24、数之间的转换 (对比BCD与ASCCI之间的转换)可以参考教材:p320例7-12;p318;例:双字节数R2R3转换成压缩BCD码存在 R4R5R6中。由十进制数与二进制数之间的关系可知:十进制数D与n位二进制数的关系克表示为D=bn-12n-1+bn-22n-2+.+b12+b0 =.(bn-12+bn-2)2+bn-3.+b12+b0部分和存在R4R5R6中,其中bi每次移入Cy中2022-11-1438DCDTH:CLR A ;MOV R4,A ;R4清零 MOV R5,A ;R4清零 MOV R6,A ;R6清零 MOV R7,#16 ;循环初值LOOP:CLR C MOV A,R3 ;R2R3左移一位,并送回 RLC A ;(即将bi每次移入Cy中)MOV R3,A ;MOV A,R2 ;RLC A ;MOV R2,A ;MOV A,R6 ;R4R5R62+bi并调整送回 ADDC A,R6 DA A ;MOV A,R5 ;ADDC A,R5 ;DA A ;2022-11-1439 MOV A,R4 ;ADDC A,R4 DA A ;MOV R4,A ;DJNZ R7,LOOP ;END 2.8 见教材p124 编程练习:2022-11-1440