1 / 42

第四章 汇编语言程序设计

第四章 汇编语言程序设计. 通过前面的学习,我们已经了解了单片机内部的结构, MCS-51 指令系统的寻址方式、各类指令的格式及功能。 下面我们就是要如何利用 MCS-51 的指令系统,来编写高效、充分利用其特点的程序。. § 4.1 概述. 4.1.1 程序设计语言. 目前,用于程序设计的语言基本上分为三种:. 1. 机器语言 在单片机中,用二进制代码表示的指令、数字和符号简称为机器语言。直接用机器语言编写的程序称为机器语言程序。 缺点:程序不易看懂,不便于记忆,容易出错。. 程序设计语言. 2. 汇编语言

Télécharger la présentation

第四章 汇编语言程序设计

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第四章汇编语言程序设计 通过前面的学习,我们已经了解了单片机内部的结构,MCS-51指令系统的寻址方式、各类指令的格式及功能。 下面我们就是要如何利用MCS-51的指令系统,来编写高效、充分利用其特点的程序。

  2. §4.1 概述 4.1.1 程序设计语言 目前,用于程序设计的语言基本上分为三种: 1. 机器语言 在单片机中,用二进制代码表示的指令、数字和符号简称为机器语言。直接用机器语言编写的程序称为机器语言程序。 缺点:程序不易看懂,不便于记忆,容易出错。

  3. 程序设计语言 • 2. 汇编语言 • 用助记符表示的指令称为符号语言或汇编语言。 • 汇编语言程序(源程序)需要“汇编”(由专门的汇编程序完成)才能转换成机器语言。得到的机器语言程序称为目标程序。 • 特点: • 是面向机器的语言,必须对硬件有一定的了解。 • 助记符指令和机器指令一一对应。 • 能直接管理和控制硬件设备(功能部件)。

  4. 3. 高级语言 • 高级语言不受具体机器的限制,都是参照一些数学语言而设计的,使用了许多数学公式和数学计算上的习惯用语,非常擅长于科学计算。 • 常用的高级语言,如BASIC、FORTRAN、C语言等。 • 特点: • 通用性强,直观、易懂、易学、可读性好。 • 计算机不能直接识别和执行。(需要进行编译) • 发展很快。

  5. 4.1.2 编制程序的步骤 1.任务分析(硬件、软件系统分析) 2.确定算法和工作步骤; 3.程序总体设计和流程图绘制 关于流程图符号: 开始、结束----圆角矩形 工作任务----矩形 判断分支----菱形 程序流向---- 程序连接---- 结束 开始

  6. 4.1.2 编制程序的步骤 4. 分配内存,确定程序与数据区存放地址; 5. 编写源程序; 6. 调试、修改,最终确定程序。

  7. 4.1.3 方法技巧 • 模块化设计(按功能分:显示、打印、输 • 入、发送等) • 2. 尽量采用循环及子程序结构(节省内存)

  8. 4.1.4 汇编语言的规范 • 汇编语言源程序由以下两种指令构成: • 汇编语句(指令语句) • 伪指令(指示性语句) • 汇编语句的格式: • 标号: 操作码 操作数 ;注释 • 数据表示形式: • 二进制(B)、十六进制(H)、十进制(D或省略)、 • ASCII码(以单引号标识)

  9. 伪指令 控制汇编用的特殊指令,这些指令不属于指令系统,不产生机器代码。 通过使用伪指令向汇编程序发出指示信息,告诉它如何完成汇编工作。 伪指令具有控制汇编程序的输入输出、定义数据和符号、条件汇编、分配存储空间等功能。

  10. 常用的伪指令 • ORG(Origin) • 定位目的程序的起始地址。 • 格式: ORG 表达式 • 如:ORG 0000H • 注:表达式必须为16位地址值。 • END 汇编语言程序结束伪指令。 注:一定放在程序末尾!

  11. 常用的伪指令 • EQU (EQUate) • 赋值伪指令。 • 格式:字符名称EQU数值或汇编符号 • 例: AA EQU 30H • K1 EQU 40H • MOV A,AA ; (30H)→A • MOV A,K1 ;(40H)→A

  12. 常用的伪指令 • DB(DefineByte) • 从指定单元开始定义(存储)若干个字节的数据或ASCII码字符,常用于定义数据常数表。 • 格式:DB 字节常数或ASCII字符 • 例: ORG 1000H • DB 34H,0DEH,“A”,“B” • DB 0AH,0BH,20

  13. 常用的伪指令 • DW(DefineWord) • 从指定单元开始定义(存储)若干个字的数据 • 或ASCII码字符。 • 格式:DW 字常数或ASCII字符 • 例: ORG 2000H • DW 1234H,“B” • DW 0AH,20 • 思考: (2000H)及其以后的地址单元中的内容是多少?

  14. 常用的伪指令 • BIT • 位地址符号指令。 • 把位地址赋于规定的字符名称。 • 格式:字符名称BIT位地址 • 例: ABC BIT P1.1 • QQ BIT P3.2

  15. §4.2 汇编语言程序编辑和汇编 1. 编辑(源程序,以.ASM扩展名存盘); 2. 汇编(手工或机器汇编); 如:MOV A,#88H;机器码74 88 又如: 地址 目标码 源程序 ORG 1000H 1000H 74 7F MOV A,#7FH 1002H 79 44 MOV R1,#44H END

  16. §4.3 程序设计基础与举例 4.3.1 顺序结构程序 例1:变量存在内部RAM的20H单元中,其取值范围:0~5,编成,查表法求其平方值 org 1000h start:mov dptr,#2000h mov a,20h movc a,@a+dptr mov 21h,a sjmp $ org 2000h table:db 0,1,4,9,16,25 end

  17. 开始 表格首地址送DPTR 变量送A(20H) A 查平方表(A+DPTR) A 结果送21H单元:A 21H 结束

  18. 内部RAM 22H 21H 6 9 20H 例2:将20H单元的压缩(Packed )BCD码拆成两个ACSII码存入21H、22H单元。 3 6 3 9 BCD 0 1 2 ... 9 ASCII 30H 31H 32H ... 39H

  19. 方法1 开始 (20H)A 10HB A/B,A中为高4位BCD码, B中为低4位BCD码 B+30HB B(21H) A+30HA A(22H) 结束

  20. 周期数 源程序 • ORG 2000H • MOV A,20H • MOV B,#10H • DIV AB • ORL B,#30H • MOV 21H,B • ORL A,#30H • MOV 22H,A • END 1 2 4 2 2 1 1 13 ;除以10H ;高4位BCD码转换位ASCII码 ;低4位BCD码转换位ASCII码

  21. 方法2: 开始 0 (21H) (20H)A A与(21H)的低4位交换 (21H)+30H(21H) A的高低半字节交换 A+30HA A(22H) 结束

  22. 周期数 源程序 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 1 1 1 1 2 1 1 1 9 ;清21H单元 ;低4位BCD码送21H单元, ;低4位BCD码转换位ASCII码 ;高4位BCD码转换位ASCII码

  23. Y 条件成立? 条件成立? N Y N 程序段A 程序段A 程序段A 下条指令 单分支结构 双分支结构 4.3.2 分支程序 分支程序可根据要求无条件或条件地改变程序执行流向。编写分支程序主要在于正确使用转移指令。分支程序有:单分支结构、双分支结构、多分支结构(散转)

  24. 0 K=? n 1 程序段n 程序段1 程序段0 多分支结构 4.3.2 分支程序 分支程序可根据要求无条件或条件地改变程序执行流向。编写分支程序主要在于正确使用转移指令。分支程序有:单分支结构、双分支结构、多分支结构(散转)

  25. 例1:设变量x以补码形式存放在片内RAM 30H单元中,变量y与x的关系是: 编程根据x的值求y值并放回原单元。

  26. 开始 取x 即(30h) A A=? <0 >0 0 y=x+5 y=x y=20H 存y 即y 20h 结束

  27. ORG 1000H START:MOV A,30H JZ NEXT ;x=0,转移 ANL A,#80H ;保留符号位 JZ ED ;x>0,转移 MOV A,#05H ;x<0,不转移 ADD A,30H MOV 30H,A SJMP ED NEXT:MOV 30H,#20H ED:SJMP $

  28. TAB P0高位 P0低位 TAB+2 P1高位 P1低位 例2:根据R7的内容,转至对应的分支程序。设R7的内容为0~N,对应的处理程序地址分别为P0~P7 • START:MOV DPTR,#TAB • MOV A,R7 • ADD A,R7 ;R7×2A • MOV R3,A ; 暂存R3 • MOVC A,@A+DPTR ;取高位地址 • XCHA ,R3 • INC A • MOVC A,@A+DPTR ;取低位地址 • MOV DPL,A • MOV DPH,R3 ;转移地址送入DPTR • CLR A • JMP @A+DPTR • TAB: DW P0 • DW P1 • … • DW PN

  29. 4.3.3 循环程序 • 循环程序一般由: • 初始化部分 • 循环体部分--处理部分、修改部分、控制部分 • 结束部分 • 其结构一般有两种: • 先进入处理部分,再控制循环 • 至少执行一次循环体 • 先控制循环,再进入处理部分 • 循环体是否执行,取决于判断结果。

  30. 开始 设置循环初值 循环处理 循环修改 循环结束? 结束处理 结束 开始 设置循环初值 Y 循环结束? N 循环处理 N 循环修改 Y 结束处理 结束

  31. 循环控制的一般方法: • 循环次数已知 • 利用循环次数控制 • 循环次数未知 • 利用关键字控制 • 利用“逻辑尺” • 根据“逻辑尺”的内容,进行控制。

  32. 例4-3-6 : 50ms延时子程序。设晶振频率为12MHz,则机器周期为1us。 DEL: MOV R7,#200 ;1MC DEL1:MOV R6,#123 ;1MC NOP ;1MC DJNZ R6,$ ;2MC DJNZ R7,DEL1 ;2MC RET ;2MC 延时时间:t=1+200[(1+1+2*123)+2]+2 ≈50000us=50ms

  33. 例4-3-8:将内部RAM中起始地址为data的数据串串送到外部RAM中起始地址为buffer的存储区域中,直到发现‘$’字符,传送停止----循环次数事先不知道先判断,后执行。例4-3-8:将内部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 LOOP1 ;传送下一数据 LOOP3:END

  34. 4.3.4 子程序问题 子程序设计时注意事项: 1. 给子程序赋一个名字。实际为入口地址代号。 2. 要能正确传递参数: 入口条件:子程序中要处理的数据如何给予。 出口条件:子程序处理结果如何存放。 (寄存器、存储器、堆栈方式) 3. 保护与恢复现场: 保护现场:压栈指令PUSH 恢复现场:弹出指令POP 4. 子程序可以嵌套

  35. 例4-3-9 :利用查表法求平方和 ,设a、b、c分别存于内部RAM的DA、DB、DC三个单元中。 MOV A,DA ;取a 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 RET TAB: DB 0,1,4,9,16,25,36,49,64,81 END 利用累加器或寄存器传递参数

  36. 4.3.5 码型转换程序的设计 一、十六进制数与ASCCII码之间的转换 (对比BCD与ASCCI之间的转换—4.3.1中例2) 表4-1 十六进制数与ASCII码之间的关系

  37. 例4-3-15 将一位十六进制数转换成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 RET

  38. 例4-3-16 将多位十六进制数转换成ASCII码,设R0指向十六进制数低位, R2存放字节数,转换后R1指向ASCII码高位。 HTASC: MOV A,@R0 ;取十六进制数 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 RET ASCTAB:DB 30H,31H,32H,33H,34H,35H,36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46H

  39. 二、BCD码与二进制数之间的转换 (对比BCD与ASCCI之间的转换—4.3.1中例2) 例4-3-17:双字节数R2R3转换成压缩BCD码存在 R4R5R6中。由十进制数与二进制数之间的关系可知:十进制数D与n位二进制数的关系克表示为 D=bn-1×2n-1+bn-2×2n-2+...+b1×2+b0 ={...{[(bn-1×2+bn-2)×2]+bn-3}...+b1}×2+b0 部分和存在R4R5R6中,其中bi每次移入Cy中

  40. DCDTH: 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 ; R4R5R6×2+ bi并调整送回 ADDC A,R6 DA A ; MOV A,R5 ; ADDC A,R5 ; DA A ;

  41. MOV A,R4 ; ADDC A,R4 DA A ; MOV R4,A ; DJNZ R7,LOOP ; END

More Related