3第三章:汇编语言程序设计X.ppt

上传人:本田雅阁 文档编号:2884834 上传时间:2019-06-01 格式:PPT 页数:47 大小:1.04MB
返回 下载 相关 举报
3第三章:汇编语言程序设计X.ppt_第1页
第1页 / 共47页
3第三章:汇编语言程序设计X.ppt_第2页
第2页 / 共47页
3第三章:汇编语言程序设计X.ppt_第3页
第3页 / 共47页
3第三章:汇编语言程序设计X.ppt_第4页
第4页 / 共47页
3第三章:汇编语言程序设计X.ppt_第5页
第5页 / 共47页
点击查看更多>>
资源描述

《3第三章:汇编语言程序设计X.ppt》由会员分享,可在线阅读,更多相关《3第三章:汇编语言程序设计X.ppt(47页珍藏版)》请在三一文库上搜索。

1、第三章 MCS-51单片机 汇编语言程序设计,内容提要:,3-2汇编语言及汇编过程,3-1汇编语言程序设计概述,3-3汇编语言程序的基本结构及应用举例,3-4编程综合举例,高级语言:,3-1 汇编语言程序设计概述,一、汇编语言的特点及其语句格式,汇编语言:,机器语言:,程序设计语言:,用二进制代码表示指令和数据。,用助记符表示指令操作功能,用标号表示操作对象。,独立于机器,面向过程,接近自然语言和数学表达式., 助记符指令和机器指令一一对应,效率高、占用存储空 间小、运行速度快,编制的程序是最优化的程序。 使用汇编语言编程比使用高级语言编程困难,要深入了 解硬件。 汇编语言能直接管理和控制存储

2、器及接口电路等硬件设 备,也能处理中断。 汇编语言无通用性,程序不易移植,各种计算机的汇编 语言不能通用。,标 号语句地址的标志符号,其它语句访问该语句的地址。 1-8个ASC字符组成,第一个字符必须是字母。 不能使用本汇编语言已经定义了的符号作标号(助记符伪指 令寄存器名等)。 标号后为冒号(:)。 一个程序中的标号不能重复定义 。 标号不是必须的,其它语句访问该语句时才定义标号。 操作码表示了该指令所能执行的操作功能。 操作数表示参加操作的数的本身或操作数所在的地址。,标号:,操作码助记符,第一操作数,,第二操作数,;注释,MCS-51指令格式:,在程序中需对数据的存放、寄存器和工作单元的

3、使用作出具体安排。 要对单片机的硬件结构有详细的了解。 程序设计的技巧性。,二、汇编语言程序设计的特点,3-2 汇编语言及汇编过程,一、汇编程序功能,源程序 (汇编指令程序),目标程序 (机器码指令程序),汇编指令与机器码指令有一一对应的关系。 汇编程序是一种翻译程序,将源程序翻译成目标程序。,二、汇编程序的汇编过程 汇编有两种方法:手工汇编、机器汇编。,1、手工汇编: 第一次汇编:确定地址,翻译成各条机器码,字符标号原样写出; 第二次汇编:标号代真,将字符标号用所计算出的具体地址值或偏移量代换。,源程序,目标程序,地址,ORG 1000H START:MOV R0,2FH MOV R2,#0

4、0H MOV A,R0 MOV R3,A INC R3 SJMP NEXT LOOP:INC R0 CJNE R0,#44H,NEXT INC R2 NEXT:DJNZ R3,LOOP MOV 2AH,R2 SJMP $ END,第一次汇编,第二次汇编,1000 A82F 1002 7A00 1004 E6 1005 FB 1006 0B 1007 80NEXT 1009 08 100A B644NEXT 100D 0A 100E DBLOOP 1010 8A2A 1012 80FE,A82F 7A00 E6 FB 0B 8005 08 B64401 0A DBF9 8A2A 80FE,机器汇

5、编是一个两次扫描过程。 第一次扫描:检查语法错误,确定符号名字; 建立使用的全部符号名字表; 每一符号名字后跟一对应值(地址或数)。 第二次扫描:是在第一次扫描基础上,将符号地址转换成 地址(代真);利用操作码表将助记符转换 成相应的目标码。,三、伪指令 伪指令是告诉汇编程序,如何汇编源程序的指令。 伪指令既不控制机器的操作,也不能被汇编成机器代码, 故称为伪指令。,1、起始地址伪指令 ORG (ORiGin) ORG addr16 用于规定目标程序段或数据块的起始地址, 设置在程序开始处。 2、汇编结束伪指令 END(END of assembly) 告诉汇编程序,对源程序的汇编到此结束。

6、一个程序中只出现一次,在末尾。,3、赋值伪指令 EQU(EQUate) 告诉汇编程序,将汇编语句操作数的值赋予本语句的标号。 格式: 标号名称 EQU 数值或汇编符号 “标号名称”在源程序中可以作数值使用,也可以作数据地址、 位地址使用。 先定义后使用,放在程序开头。 4、定义字节伪指令 DB(Define Byte) 告诉汇编程序从指定的地址单元开始,定义若干字节存储单 元并赋初值。(定义数据) 格式: 标号: DB 字节数据或字节数据表或引号起来 5、定义字伪指令 DW(Define Word) 的字符串(ASC) 从指定地址开始,定义若干个16个位数据,高八位存入低地址; 低八位存入高地

7、址。(定义地址),例、 ORG 1000H PIOI:DW 7654H,40H、12、AB,6、数据地址赋值伪指令 DATA 将表达式指定的数据地址赋予规定的字符名称 格式: 字符名称 DATA 表达式 注:该指令与EQU指令相似,只是,可先使用后定义, 放于程序开头、结尾均可。,7、定义空间伪指令 DS 从指定地址开始,保留由表达式指定的若干字节空间作 为备用空间。 格式: 标号: DS 表达式 例2、 ORG 1000H DS 0AH DB 71H,11H,11H ;从100BH开始存放 ;71H11H、11H。,注:DB、DW、DS 只能用于程序存储器; 而不能用于数据存储器。,8、位地

8、址赋值伪指令 BIT 将位地址赋予规定的字符名称。 格式: 字符名称 BIT 位地址,例3、 X1 BIT P1.2 相当于 X1 EQU 92H,3-3 汇编语言程序的基本结构 及应用举例,程序编写做到:占用存储空间少;运行时间短; 程序的编制、调试及排错所需时间短;结构清晰,易读、易于移植。,按结构化程序设计思想,任何复杂程序都可由 顺序结构、 分支结构、 循环结构 子程序结构,语句 3,语句 2,顺序结构,入口,语句 1,出口,分支结构,入口,条件满足否?,分支 1,出口,Y,N,分支 2,循环结构,入口,处理,修改条件,条件满足否?,Y,出口,N,一、顺序程序举例 例1、设在片内RAM

9、的60H单元存有1个字节代码,要求将其分解成两个4位字段,高4位存入原单元的低4位,其低4位存入61H单元的低4位,且要求这两个单元的高4位均为0,试编制完整程序。,分析:,# # # # ¥ ¥ ¥ ¥,解: 核心指令 ANL ORL 1000H MODE:MOV R0,#60H MOV A,R0 MOV B,A ANL A,#0F0H SWAP A MOV R0,A ANL B,#0FH MOV A,B INC R0 MOV R0,A END,二、分支结构与分支程序设计 1 单分支程序 结构:根据不同的条件,进行相应的处理。 通常用条件转移指令形成简单分支结构。 如: 判(A) = Z 或

10、 NZ ,转移(JZ,JNZ) 判(CY)= 1 或 0 ,转移(JC,JNC) 判(bit)=1 或 0 ,转移(JB,JNB,JBC) CJNE 比较不相等转移 DJNZ 减1条件转移,单分支程序举例 例1、设在外RAM的ST1、ST2和ST3共三个连续单元,其中ST1、ST2存放着两个8位无符号二进制数,要求找出其中大数存入ST3中。,START: CLR C ;进位位清”0“ MOV DPTR,#ST1 ;设置数据指针 MOVX A,DPTR ;取第一个数 MOV R2,A ;第一个数存R2 INC DPTR ;数据指针加1 MOVX A,DPTR ;取第二个数 SUBB A,R2 ;

11、两数比较 JNC BIG1 ;第二个数大转BIG1 XCH A,R2 BIG0: INC DPTR MOVX DPTR ,A ;存大数 RET BIG1: MOVX A,DPTR SJMP BIG0,例2、设a存放在累加器A中,b存放在寄存器B中,要求按下式 计算Y值,并将结果Y存于累加器A 中,试编写程序。 a-b (a0) Y = a+b (a 0),解:本题关键是判a是正数,还是负数;由ACC.7便知。 ORG 1000H BR: JB ACC.7,MINUS CLR C SUBB A,B SJMP DONE MINUS: ADD A,B DONE: SJMP END,多分支程序结构,指

12、令系统中没有多分支转移指令, 无法使用单条指令完成多分支转移,多分支程序举例 (1)使用多条CJNE指令,连续比较,实现多分支转移,CJNE A,55H,LOOP1 ;TaT55,转LOOP1 AJMP FH ;Ta=T55,返回 LOOP1: JNC JW ;若(CY)=0,则TaT55,转JW CJNE A,54H,LOOP2 ; TaT54,转LOOP2 AJMP FH ; Ta=T54,返回 LOOP2:JC SW ;若(CY)=1,则TaT54,转SW FH: RET,多分支程序举例 (2)使用查转移指令表的方法实现多分支转移,也是以查表实现多分支程序转移,但表中放转移指令,转移 指

13、令用AJMP,转移范围是2KB(128分支),用LJMP是64K,例5 假定键盘上有3 个操作键,键值已读 入A中,其功能为:,. MOV DPTR,#BRTAB CLR C RLC A JMP A+DPTR BRTAB:NOP NOP AJMP DS AJMP XS AJMP CR . .,三、循环程序,循环是为了重复执行一个程序段, 汇编语言没有专用循环指令,只 能用条件转移指令通过条件判断 来控制循环是继续还是结束,循环结构不但使程序简练,而且大大节省存储空间。 循环程序包含四部分: 、初始化部分 (循环计数器、变量置初值) 、循环处理部分(主体,需要重复执行的部分) 、循环控制部分(修

14、改地址指针、修改变量、检测 循环结束条件) 、循环结束部分(对结果分析、处理,存放结果),先处理,后判断:,开始,初始化部分,处理部分,修改变量,循环结束?,结束部分,结束,先判断,后处理:,开始,初始化部分,修改变量,循环结束?,结束部分,结束,处理部分,循环有:单循环、多重循环。 循环次数已知,可用计数器控制循环次数; 循环次数未知,按问题条件控制循环是否结束。,1、单循环程序 (1)循环次数是已知的程序 例1、已知片外RAM的1000H单元存放一8位二进制数,要求将其转移成相应的ASCII码,并以高位在前,低位在后的顺序,依次存放到片内RAM以40H为首地址的连续单元中,试编程。 解:先

15、将中间单元置成30H,然后判欲转换位是否为1, 若是,则将中间单元内容加1;否则,中间单元内容保持不变。 通过左移指令实现由高到低的顺序进行转换。,START:MOV R2,#08H ;循环计数初值(循环次数已知) MOV DPTR,#1000H ;地址指针初值 MOV R0,#3FH ;地址指针初值 MOVX A,DPTR ;取数 MOV B,A ;暂存B中 LOOP:MOV A,#30H ;将中间单元(A)置成30H JNB B.7,NA ;判断转换的二进制位为0否? INC A ;若为1,则变成1的ASCII码“31H” NA:INC R0 ;修改地址指针 MOV R0,A ;存放转换的

16、结果 MOV A,B RL A ;作好准备,判断下一位 MOV B,A ;暂存 DJNZ R2,LOOP ;判断转换结束否?未完继续 SJMP ,(2)循环次数未知的程序 例2、设用户用键盘输入长度不超过100字节的字符串放在8031单片机外部RAM以2000H为首地址的连续单元,该字符串用回车符CR(CR= 0DH)作为结束标志,要求统计此字符串的长度并存入内部RAM的1FH单元中。 解:从首单元开始取数,每取一数判断其是否为CR,是则结束。,ORG 1000H STADA DATA 1FFFH SLANG DATA 1FH CMCR2:MOV DPTR,#STADA MOV B,#0FFH

17、,CRLOP:INC DPTR INC B MOVX A,DPTR CJNE A,#0DH,CRLOP MOV SLANG,B SJMP END,3-4 编程综合举例,一、加减法运算,两个N字节无符号数分别存放在内RAM的单元中,低字节在前,高字节在 后,R0指定被减数单元地址,R1指定减数单元地址,差放原被减数单元,CLR C ;清进位位 MOV R2,#N ;设定字节数 LOOP:MOV A,R0 ;从低位取被减数的一个字节 SUBB A,R1 ;两数相减 MOV R0,A ;存字节相减的差 INC R0 INC R1 DJNZ R2,LOOP ;两数相减完否 JC QAZ ;最高字节有借

18、位转溢出处理 RET,二、乘法运算,进行两个双字节无符号数乘法运算, 被乘数和乘数分别放在内RAM的 R2、R3单元和R6、R7单元中,其中R2、R6为高字节,相乘结果(积) 依次放在R4、R5、R6、R7中,DBMUL:MOV A,R3 MOV B,R7 MUL AB ;R3*R7(得到第一次部分积) XCH A,R7 ;原R7内容送A,R7R3R7L(在R7中得到 乘积的第四字节) MOV R5,B ; R5R3R7H MOV B,R2 MUL AB ;R2*R7(得到第二次部分积) ADD A,R5 ;R2R7L+R3R7H MOV R4,A ;R4 和 CLR A ADDC A,B ;

19、R2R7H+(R2R7L+R5时产生的进位) MOV R5,A ;R5 和 MOV A,R6 MOV B,R3 MUL AB ;R3*R6(得到第三次部分积) ADD A,R4 ;R3R6L+R4 XCH A,R6 ;A R6,R6 R3R6L+R4(在R6中 得到乘积的第三字节),XCH A, B ;AR3R6H,B R6 ADDC A, R5 ;R3R6H+R5+(R3R6L+R4时产生的进位) MOV R5, A ;R5 和 MOV F0, C ;F0 进位 MOV A, R2 MUL AB ;R2*R6(得到第四次部分积) ADD A, R5 ;R2R6L+(R3R6H+R5时产生的进

20、位) MOV R5, A ;在R5中得到乘积的第二字节 CLR A MOV ACC.0, C ;累加器最高位进位 MOV C, F0 ADDC A, B ;R2R6H+F0+ACC.0 MOV R4, A ;在R4 中得到乘积的第一字节 RET,三、除法运算,除法指令DIV AB 是对单字节的,多字节除法不能直接使用,需要编程实现。常用的一种方法是“移位相减”,即按位进行:从 被除数高位逐位减去除数,够减商加1,依次一直循环到最后一位。,移位方法:被除数向余数单元左移,而被除数腾出的低位用于 存放商数,这样,除法完成后,被除数已经全部移到余数单元 并逐次减掉除数得到余数,而且被除数单元已经被商

21、数代替。 在大部分程序中,运算结束后,进行对余数的“四舍五入”处理,两个双字节无符号数的除法 数据单元分配: R7R6:被除数,程序执行后存商数 R5R4:除数 R3R2:存每次相除的余数,完成后为最终余数 3AH:溢出标志单元,除数为0,置3AH单元为”0FFH“ R1:循环次数计数器(16次),WDIV: MOV 3AH, #00H ;清溢出标志单元 MOV A,R5 JNZ ZERO ;除数高位不为0转 MOV A,R4 JZ OVER ;除数为0转溢出处理 ZERO: MOV A,R7 JNZ START ;被除数高字节不为0开始运算 MOV A,R6 JNZ START ;被除数低字

22、节不为0开始运算 RET ;被除数字节为0结束程序 START:CLR A ;开始除法运算 MOV R2,A ;余数单元清”0“ MOV R3,A MOV R1,#10H ;置循环次数为10H LOOP: CLR C ;进行一位除法运算 MOV A,R6 RLC A MOV R6,A MOV A,R7 RLC A MOV R7,A MOV A,R2 ;移出的被除数高位移入余数单元,R7R6:被除数 R5R4:除数,RLC A MOV R2,A MOV A,R3 RLC A MOV R3,A MOV A,R2 ;余数减除数 SUBB A,R4 ;低位先减 JC NEXT ;不够减转移 MOV R

23、0,A MOV A,R3 SUBB A,R5 ;再减高位 JC NEXT ;不够减转移 INC R6 ;够减商为1 MOV R3,A ;相减结果送回余数单元 MOV A,R0 MOV R2,A NEXT: DJNZ R1,LOOP ;不够16次返回 ;四舍五入处理 OVER: MOV 3AH,#0FFH ;除数为0置溢出标志 RET,R7R6:被除数 R5R4:除数,四、十六进制数转换为ASC码,ORG 2000H H2ASC: MOV A,R2 ;取待转换的数据(入口) ADD A,#0F6H ;判此数是否10 ? 若10,则C=1;10,则C=0 MOV A,R2 ;重取待转换的数据 JN

24、C AD30H ;小于10就跳去加30H ADD A,#07H ;10就先加7 再去加30H AD30H: ADD A,#30H MOV R2,A ;存结果(出口) RET,例:16进制数(00H0FH)转ASCII码子程序,算法:凡10的十六进制数加37H;凡10的十六进制数加 30H。(参见 ASCII码表) ie. 09 30H39H, AF 41H46H,五、ASC码转换为16进制数,在片内RAM的30H3FH单元中的ASC码依次转换为 16进制数(高位在前),存放在内RAM的60H67H单元中,转换算法:计算法,把ASC码减30H,其结果: 若小于0,为非16进制数; 若为0 9即为

25、转换结果; 若大于等于0AH,应再减7,减7后: 若在0AH 0FH之间即为转换结果 若小于0AH或大于0FH,也是非16进制数,入口参数:R0间址,出口参数:A,MAIN:MOV R0,#30H ;设置ASC码地址指针 MOV R1,#60H ;设置16进制数地址指针 MOV R7,#08H ;拼装的16进制数字节个数 AB: ACALL TRAN ;调用转换子程序 SWAP A ;A高低4位交换 MOVX R1,A ;存放外部RAM INC R0 ACALL TRAN ;调用转换子程序 XCHD A,R1 ; 16进制数拼装 INC R0 INC R1 DJNZ R7,AB ;继续 HAL

26、T :AJMP HALT TRAN:CLR C ;清进位位 MOVX A, R0 ;取 ASC码 SUBB A,#30H ;减30H JC ERROR CJNE A,#0AH,BB BB: JC DONE SUBB A,#07H CJNE A,#0AH,BC BC: JC ERROR CJNE A,#10H,BD BD: JNC ERROR RET ;返回,ERROR: MOV A, #0FFH RET,六、布尔处理机的应用,此方程可用硬件求解也可用软件求解,下图是用TTL硬件求解的方案,软件求解方法: 利用字节型逻辑指令的方法 利用位测试指令的方法 利用布尔处理机逻辑操作指令子集的方法,假定

27、:U和V是输入引脚P1.1和P1.2,W和X是2个外设控制 器的状态位TF0(TCON.5)和IE1(TCON.3),Y和Z是程 序中设置的软件标志20H.0和21H.1,Q是输出口引脚P3.3。,布尔处理机逻辑操作指令求解程序,U BIT P1.1 V BIT P2.2 W BIT TF0 X BIT IE1 Y BIT 20H.0 Z BIT 21H.1 Q BIT P3.3 MOV C,V ORL C,W ANL C,U MOV F0,C MOV C,X ANL C,/Y ORL C,F0 ORL C,/Z MOV Q,C,上述三种程序的效益比较:,占用存储器字节数 执行周期数 字节型逻辑指令 50 65 位测试指令 24 16 布尔处理机指令集 18 18 由此可见:布尔处理机在求解逻辑 方程的应用中十分简单并且有效,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1