片机汇编语言程序设计.ppt_第1页
片机汇编语言程序设计.ppt_第2页
片机汇编语言程序设计.ppt_第3页
片机汇编语言程序设计.ppt_第4页
片机汇编语言程序设计.ppt_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章单片机汇编语言程序设计 4 1汇编语言程序设计的基础知识4 2汇编程序设计方法4 3综合编程举例 4 1汇编语言程序设计的基础知识 4 1 1汇编语言的语句格式汇编语言具有程序结构简单 执行速度快 程序易优化 编译后占用空间小的特点 汇编语言编程比高级语言困难 必须对计算机硬件有相当深入的了解 才能使用汇编语言编写程序 各种汇编语言的语法规则是基本相同的 且具有相同的语句格式 汇编语句除包括指令外还包括伪指令 MCS 51单片机汇编语言的语句格式表示如下 标号 操作码 操作数 注释 4 1 1汇编语言的语句格式 1 标号标号是语句地址的标志符号 标号后边必须跟以冒号 标号由1 8个ASCII字符组成 头一个字符必须是字母 其余字符可以是字母 数字或其它特定字符 不能使用汇编语言已经定义了的符号作为标号 如指令助记符 伪指令助记符以及寄存器名等 1TAB 以数字开头 START 无冒号 TAB 5 号不能出现在标号中 MOV 指令助记符 都是错误的标号 4 1 1汇编语言的语句格式 2 操作码操作码用于规定这条语句执行的操作 是一条指令助记符或伪指令助记符 操作码在一条汇编语句中是必不可少的 3 操作数操作数用于给操作码提供操作的数据或地址 在一条语句中 操作数可能是空白 也可能包括一项 二项或三项 各操作数之间用逗号分隔 MCS 51单片机汇编语句操作数的获得有立即数寻址 寄存器寻址 寄存器间接寻址等6种之同的寻址方式 4 1 1汇编语言的语句格式 4 注释注释是对语句的解释说明 不是必须的 但它可使程序的编制显得更加清楚 注释以 开头 长度不限 一行不够时可以换行接着书写 但换行时应还在开头使用 号 5 分隔符汇编语句在上述各部分的开头或末尾使用分隔符把它们分开 以便于区分 冒号 用于标号之后 空格 用于操作码和操作数之间 逗号 用于操作数之间 分号 用于注释之前 4 1 2伪指令 伪指令与指令的概念不同 伪指令并不被译成机器码 只是影响到汇编过程 用来对汇编过程进行某种控制或提供某些汇编信息 1 设置起始地址伪指令ORG格式 标号 ORGnnORG100HSTART MOVA 30HMOVB 50H一般来说 在一个汇编语言源程序的开始 都安置一条ORG伪指令来指出该程序在存储器中存放的起始位置 4 1 2伪指令 2 定义字节伪指令DB格式 标号 DBX1 X2 Xn该伪指令把单字节数据X1 X2 Xn存入目标程序存储器 通常用于定义一个常数表 ORG1000HTAB DB00H 01H 02H 03H 04H伪指令定义的数据00H 01H 02H 03H 04H从指定的1000H单元开始依次存放 一个数据占用一个字节存储单元 指令中Xi也可以是由两个单引号括起来的一个字符串 这时Xi定义的字节长度等于字符串的长度 每一个字符为一个ASCII码 4 1 2伪指令 3 字定义伪指令DW格式 标号 DWY1 Y2 Yn该伪指令功能与DB伪指令类似 也是给数据表中的数据分配存储单元 所不同的是DW伪指令定义的数据为字 存储时将高8位数据存入低地址单元 将低8位数据存入高地址单元 ORG2000HWTAB DW1000H 2000H 3000H伪指令DW定义了数据1000H 2000H 3000H 它们依次从指定的2000H单元开始存放 4 1 2伪指令 4 赋值伪指令EQU格式 符号名EQU表达式伪指令表示将表达式的值或特定的某个汇编符号定义一个指定的符号名 由EQU伪指令定义过的符号名可以在本程序段的任意位置上引用 DBUFEQU30H使用上述伪指令后 则符号DBUF就等价于30H 在程序中对DBUF进行赋值 实际上就是对内部RAM的30H赋一个值 4 1 2伪指令 5 位定义伪指令bit格式 符号名BIT位地址表达式该伪指令把位地址表达式的值赋给前面的符号名 HIGHbit20H使用上述伪指令后 则HIGH等价于位地址20H 在其后的编程中可以用HIGH代替20H使用 6 汇编结束伪指令END格式 标号 ENDEND伪指令指出结束汇编 即使后面还有指令 汇编程序也不作处理 4 1 3汇编语言程序的基本框架 ORG0000H AJMPMAIN 跳转到主程序ORG0003H LJMPINT X0 外部中断0入口ORG000BH LJMPINT T0 定时器0中断入口ORG0013H LJMPINT X0 外部中断1入口ORG001BH LJMPINT T1 定时器1中断入口ORG0023HLJMPINT S 串口中断入口ORG0100H 4 1 3汇编语言程序的基本框架 MAIN 主程序开始MOVSP 70H 设置堆栈段 以下是中断服务程序INT X0 外部中断0服务子程序 RETIINT T0 定时器0服务子程序 RETI INT X1 外部中断1服务子程序 RETI 4 1 3汇编语言程序的基本框架 INT T1 定时器1服务子程序 RETIINT S 串口中断服务子程序 RETI 可以在此处放置子程序END 汇编结束程序框架中包含了5个中断服务 在实际使用中可能只用到其中的部分中断 在0003H处安排了中断服务程序的入口地址表 主程序放在其后 从0100H单元开始执行 4 1 4汇编过程 汇编又分手工汇编和计算机汇编 手工汇编指由汇编者对照指令表 将源程序的每条指令的指令代码分别查出 然后把这些指令代码以字节为单位从源程序的起始地址依次排列形成目标程序 计算机汇编采用系统软件汇编程序来完成 汇编过程采取两次扫描的方式 第一次扫描读取存放在磁盘上的源程序 生成复制程序和符号表 第二次扫描使用机器指令操作代码表 伪指令操作表和符号表读取存放在磁盘上的复制程序 生成目标程序 4 2汇编程序设计方法 4 2 1程序设计步骤用汇编语言编写一个程序的过程可分为以下五个步骤 1 分析问题 确定算法 2 根据算法制定程序流程图 3 确定数据格式 分配系统资源 4 根据流程图编写程序 5 程序调试 4 2 2顺序程序 例4 1将地址为2002H 2001H 2000H的数据存储单元的内容 分别传送到2005H 2004H 2003H存储单元中去 START MOVDPTR 2002HMOVXA DPTR 取2002H单元内容MOVDPTR 2005HMOVX DPTR A 送到2005H单元MOVDPTR 2001HMOVXA DPTR 取2001H单元内容MOVDPTR 2004HMOVX DPTR A 送到2004H单元 4 2 2顺序程序 MOVDPTR 2000HMOVXA DPTR 取2000H单元内容MOVDPTR 2003HMOVX DPTR A 送到2003H单元RET 4 2 2顺序程序 例4 2设内部RAM的40H 41H单元中分别存放着一个字节的二进制数 要求取出这两个单元中的低半字节 合并成一个字节后 存入50H单元中 START MOVR1 40H 设置R1为数据指针 MOVA R1 取出第一个单元中的内容 ANLA 0FH 取第一个数的低半字节 SWAPA 移至高半字节 INCR1 修改数据指针 XCHA R1 取第二个单元中的内容 ANLA 0FH 取第二个数的低半字节 ORLA R1 拼字 MOV50H A 存放结果 RET 4 2 3分支程序 在MCS 51单片机指令系统中 有JZ JNZ CJNE JC JNC 和JB JNB 等丰富的控制转移指令 它们是分支结构程序设计的基础 可以完成各种各样的条件判断 分支 分支结构一般分为单分支和多分支两种结构 4 2 3分支程序 例4 3x y均为8位二进制数 设x在R0中 按照下面的函数关系求出y后存入R1中 START CJNER0 00H SUL1 R0中的数与00比较不等转移MOVR1 00H 相等 R1 0 SJMPSUL2 SUL1 JCNEG 两数不等 若 R0 0 则R1 01H SJMPSUL2 NEG MOVR1 0FFH R0 0 则R1 0FFH SUL2 RET 4 2 3分支程序 例4 43个无符号单字节整数分别存于R1 R2和R3中 找出其中最大数放于R0中 先将R0清零 然后 R1 与 R0 比较 R1 R0 则把 R1 送 R0 否则 R0 保持不变 再将 R0 分别与 R2 和 R3 比较 比较处理的方法与上面相同 这样比较3次后 R0中即为3个数中最大的数 BR2 ORG2500HMOVR0 00H R0清零MOVA R1 第一个数 R1 送AACALLCOMP 比较 R1 与 R0 大小MOVA R2 第二个数 R2 送AACALLCOMP 比较 R2 与 R0 大小 4 2 3分支程序 MOVA R3 第三个数 R3 送AACALLCOMP 比较 R3 与 R0 大小HERE AJMPHERECOMP MOVR4 A R4暂存A的内容CLRC 清进位位CSUBBA R0 A R0 JCM1 A R0 时大数存R0M1 RET 4 2 4循环程序 1 循环程序的组成 1 循环初始化部分 是为了保证程序能正常进行循环操作而做的准备工作 2 循环体部分 需要重复执行的程序段 是循环的主体 3 循环控制部分 用来保证循环程序按规定的次数或特定条件正常循环 按一定规律修改操作数地址及控制变量 以便每次执行循环体时得到新的数据 4 2 4循环程序 2 循环程序的结构常见循环结构有两种 一种是先检查是否满足控制条件 符合则执行循环体 否则退出循环 也称为 当 型循环 另一种是先执行循环体 然后再判断循环是否继续进行 也称为 直到 型循环 4 2 4循环程序 3 循环控制的方法 1 计数控制循环将计数器的初值设置为循环次数 以后每执行一次循环体 使循环计数器减1 并测试计数器是否为0 若为0 则终止循环 这种方法称为计数法 一般用循环指令DJNZ进行编程 2 条件控制法对于循环次数不能预先确定的程序 只能根据循环过程中某个特定条件是否满足来控制循环是继续还是退出 这类通过测试特定条件来实现循环控制的方法称为条件控制法 4 2 4循环程序 例4 5设在内部RAM的BLOCK单元开始处有长度为LEN的无符号数据块 试编一个求和程序 并将和存入内部RAM的SUM单元 设和不超过8位 由于循环的次数确定 采用计数循环控制 循环计数初值设置为LEN即可 START CLRA 清累加器A MOVR2 LEN 数据块长度送R2 MOVR1 BLOCK 数据块首址送R1 LOOP ADDA R1 循环加法 INCR1 修改地址指针 DJNZR2 LOOP 修改计数器并判断 MOVSUM A 存和 RET 4 2 4循环程序 例4 6长度为10H的字符串存放在首地址为inbuf的内部RAM中 将这个字符串向片外RAM的outbuf地址开始的存储单元传送 一直进行到遇见回车符 ODH 或整个字符串传送完毕 由于字符串长度是10H 采用计数循环控制 题目中要求遇见回车符 ODH 则停止传送 所以同时采用条件控制法控制循环 MOVR7 10H 置转送次数MOVR0 inbuf 送字符串首地址MOVDPTR outbuf 送传送单元起始地址LOOP CJNE R0 0DH NEXT 取字符比较 是回车符则转移SJMPEND 4 2 4循环程序 NEXT MOVA R0 取字符MOVX DPTR A 送字符INCR0 地址加1INCDPTRDJNZR7 LOOP 未送完返回END SJMP RET 4 2 4循环程序 例4 710秒软件延时程序 使用6MHz晶振 一个机器周期为2 s 计算出一条指令以至一个循环所需要的执行时间 给出相应的循环次数 便能达到延时的目的 DELAY MOVR5 100 第一层循环执行100次DEL0 MOVR6 200 第二层循环执行200次DEL1 MOVR7 248 第三层循环执行248次DEL2 DJNZR7 DEL2 DJNZR6 DEL1 DJNZR5 DEL0 RET 4 2 5子程序设计 需要进行一些数值不同而算法相同的操作 这时常常将实现这个算法的操作设计为一个子程序 子程序需要由主程序或子程序调用 子程序调用子程序 称为子程序嵌套 子程序的结构包括子程序名 具体功能程序 子程序返回三部分 子程序返回由RET指令完成 1 子程序编写的原则 1 子程序第一条指令前必须有标号 该标号应以子程序的功能命名 以便阅读时一目了然 2 在给子程序所加的注释中应该说明子程序的功能 并标明子程序的入口参数和出口参数 4 2 5子程序设计 3 子程序执行完成后一定要返回主程序 而子程序是通过RET指令返回到主程序的 4 在子程序在调用和返回时 隐含两次堆栈操作 压栈和弹栈 而且有可能在子程序中再调用子程序 即子程序嵌套 编程时应注意堆栈区的大小要满足要求 5 保护现场和恢复现场必须在子程序执行之前 将使用到一些寄存器或存储单元保护起来 通常是进行压栈操作或改变工作寄存器的物理地址 这种操作称为保护现场 子程序执行完成返回主程序后 再将压栈的内容取出 即弹栈 或恢复原来工作寄存器的物理地址 称为恢复现场 4 2 5子程序设计 2 主程序和子程序之间的参数传递在需要在主程序和子程序之间进行参数传递时 主程序应先把有关的参数存入约定的位置 子程序执行时 可以从约定的位置取得参数 当子程序执行完时 将得到的结果再存入约定的位置 返回主程序后 主程序可以从这些约定的位置取得需要的结果 参数的传递方法主要有以下几种方式 1 用工作寄存器或累加器传递参数 2 利用堆栈传递参数 3 利用操作数地址传递参数 4 2 5子程序设计 例4 8编写子程序实现多字节无符号数的加法 下面子程序入口参数DATA1是被加数的低位地址 DATA2是加数的低位地址 N是相加字节的个数 出口参数DATA2是和数的低位地址 MADD MOVR0 DATA1 置被加数MOVR1 DATA2 置加数MOVR7 N 置字节数CLRC 清进位位LOOP MOVA R0ADDCA R1 求和MOV R1 A 存结果INCR0 修改指针INCR1DJNZR7 LOOP 循环判断RET 4 2 5子程序设计 例4 9把内部RAM某一单元中一个字节的十六进制数转换成两位ASCII码 结果存放在内部RAM的连续两个单元中 假设一个字节的十六进制数在内部RAM的40H单元 而结果存入50H 51H两个单元 一个字节的十六进制数是由两位数字组成 需要两次进行ASCII转换 可以编写子程序完成将1位十六进制数转换成ASCII 然后在主程序中两次调用它 调用过程中可以用堆栈进行参数传递 MAIN MOVSP 30HMOVR1 50H R1为存结果的指针 MOVA 40H A为需转换的十六进制数 SWAPA 先转换高位半字 PUSHACC 压栈 LCALLHEASC 调用子程序HEASC转换低半字节内容 4 2 5子程序设计 POPACC MOV R1 A 存高半字节转换结果 INCR1 PUSH40HLCALLHEASC POPACC MOV R1 A 存低半字节转换结果 END HEASC MOVR0 SP DECR0 DECR0 R0指向十六进制数参数地址 XCHA R0 取被转换参数 ANLA 0FH 保留低半字节 ADDA 2 修改A值 MOVCA A PC 查表 XCHA R0 结果送回堆栈 RET TAB DB30H 31H 32H 4 3综合编程举例 4 3 1算术运算程序1 带符号数的加减运算程序设计例4 10设在BLOCK和BLOCK l单元中有以两个补码形式的带符号单字节数 请编写求两数之和 并把它放在SUM和SUM l两个单元中 低8位在SUM单元 高8位在SUM 1单元 的子程序 SBADD PUSHACCPUSHPSWMOVPSW 08H 保护现场 改变工作寄存器区 MOVR0 BLOCK R0指向一个加数MOVR1 SUM Rl指向和单元MOVR2 00H 高位先令其为零MOVR3 00HMOVA R0 4 3 1算术运算程序 JNBACC 7 POS1 若为正数 则转POS1MOVR2 0FFH 若为负数 则全 1 送R2POS1 INCR0MOVB R0JNBB 7 POS2 若是正数 则转POS2MOVR3 0FFH 若是负数 则全 1 送R3POS2 ADDA B 低8位相加MOV R1 A 存低8位和INCR1MOVA R2ADDCA R3 完成高8值求和MOV R1 A 存高8位和POPPSW 恢复现场POPACCRETEND 4 3 1算术运算程序 2 多字节乘除运算程序设计例4 11将 R2R3 和 R6R7 中双字节无符号数相乘 结果存入R4R5R6R7 NMUL MOVR4 0 初始化 MOVR5 0 CLRC MOVR0 16NMUL1 MOVA R4 CyR4R5R6R7右移一位 RRCA MOVR4 A MOVA R5 RRCA MOVR5 A MOVA R6 RRCA 4 3 1算术运算程序 MOVR6 A MOVA R7 RRC MOVR7 A JNCNMUL2 C为移出乘数最低位MOVA R5 R4R5 R6F7 R4R5 ADDA R3 MOVR5 A MOVA R4 ADDCA R2 MOVR4 A NMUL2 DJNZR0 NMUL1 循环16位 MOVA R4 最后结果再移一位RRCA MOVR4 A MOVA R5 RRCA MOVR5 A MOVA R6 RRCA MOVR6 A MOVA R7 RRCA MOVR7 A RET 4 3 2查表程序 MCS 5l指令系统中有两条专用的查表指令 MOVCA PC指令可用于在 本地 范围内查表 MOVCA A DPTR指令适用于在64KB范围内查表 例4 12在一个温度检测系统中 温度模拟信号由10位A D输入 将A D结果转换为对应温度值 可采用查表方法实现 先由实验测试出整个温度量程范围内的A D转换结果 把A D转换结果000H 3FFH所对应的温度值编制为一个表存储在程序存储器中 那么就可以根据检测到的模拟量的A D转换值查找出相应的温度值 设测得的A D转换结果已存入20H 21H单元中 高位字节在20H中 低位字节在21H中 查表得到的温度值存放在22H 23H单元 高位字节在22H中 低位字节在23H中 4 3 2查表程序 FTMP MOVDPTR TAB DPTR 表首地址 MOVA 21H 20H 21H 2CLRC RLCA MOV21H A MOVA 20H RLCA MOV20H A MOVA 21H 表首地址 偏移量 ADDCA DPL MOVDPL A MOVA 20H ADDCA DPHMOVDPH A CLRA MOVCA A DPTR 查表得温度值高字节MOV22H A CLRA INCDPTR MOVCA A DPTR 查表得温度值低字节MOV23H A RET TAB DW 4 3 3数据排序程序 1 算法说明例如原始数据为顺序50 38 7 13 59 44 78 22第 次冒泡的过程是 50 38 7 13 59 44 78 22 逆序 互换 38 50 7 13 9 44 78 22 逆序 互换 38 7 50 13 59 44 78 22 逆序 互换 38 7 13 50 59 44 78 22 正序 不互换 38 7 l3 50 59 44 78 22 逆序 互换 38 7 13 50 44 59 78 22 正序 不互换 38 7 13 50 44 59 78 22 逆序 互换 38 7 13 50 44 59 22 78 第一次冒泡结束 4 3 3数据排序程序 如此进行 各次冒泡的结果是 第一次冒泡38 7 13 50 44 59 22 78第二次冒泡7 13 38 44 50 22 59 78第二次冒泡7 13 38 44 22 50 59 78第四次冒泡7 13 38 22 44 50 59 78第五次冒泡7 13 22 38 44

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论