




已阅读5页,还剩110页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2章MCS 51单片机指令系统与汇编语言程序设计 主要内容 MCS 51单片机的寻址方式 指令系统 基本程序结构及汇编语言的开发和调试 重点在于寻址方式 各种指令的应用 程序设计的规范 程序设计的思想及典型程序的理解和掌握 难点在于控制转移 位操作指令的理解及各种指令的灵活应用 以及程序设计的基本方法和针对具体的硬件设计出最合理的软件 指令系统 一台计算机所能识别 执行的指令的集合就是它的指令系统 机器语言 指令系统是一套控制计算机执行操作的二进制编码 称为机器语言 机器语言指令是计算机惟一能识别和执行的指令 汇编语言 指令系统是利用指令助记符来描述的 称为汇编语言 计算机的指令系统一般都是利用汇编语言描述的 是由计算机硬件设计所决定的 指令系统没有通用性 单片机一般是空机 未含任何系统软件 因此在第一次使用前 必须对其进行编程 2 1概述 2 1 1汇编语言指令格式与伪指令 1 常用单位与术语位 bit 位是计算机所能表示的最小的 最基本的数据单位 位通常是指一个二进制位 字节 Byte 一个连续的8位二进制数码称为一个字节 即1Byte 8bit 字 Word 通常由16位二进制数码组成 即1Word 2Byte 字长 字长是指计算机一次处理二进制数码位的多少 MCS 51型单片机是8位机 所以说它的字长为8位 MCS 51系列单片机都是以Intel公司最早的典型产品8051为核心 增加了一定的功能部件后构成的 本章以8051为主介绍MCS 51系列单片机 2 汇编语言指令格式 指令格式 指令的表示方式称为指令格式 它规定了指令的长度和内部信息的安排 完整的指令格式如下 标号 操作码 操作数 操作数 注释 其中 项是可选项 标号 指本条指令起始地址的符号 也称为指令的符号地址 代表该条指令在程序编译时的具体地址 操作码 又称助记符 它是由对应的英文缩写构成的 是指令语句的关键 它规定了指令具体的操作功能 描述指令的操作性质 是一条指令中不可缺少的内容 操作数 它既可以是一个具体的数据 也可以是存放数据的地址 注释 注释也是指令语句的可选项 它是为增加程序的可读性而设置的 是针对某指令而添加的说明性文字 不产生可执行的目标代码 伪指令 也称为汇编程序的控制命令 是程序员发给汇编程序的命令 用来设置符号值 保留和初始化存储空间 控制用户程序代码的位置 伪指令只出现在汇编前的源程序中 仅提供汇编用的某些控制信息 不产生可执行的目标代码 是CPU不能执行的指令 1 定位伪指令ORG格式 ORGn其中 n通常为绝对地址 可以是十六进制数 标号或表达式 功能 规定编译后的机器代码存放的起始位置 在一个汇编语言源程序中允许存在多条定位伪指令 但每一个n值都应和前面生成的机器指令存放地址不重叠 例如程序 ORG1000HSTART MOVA 20HMOVB 30H 3 伪指令 2 结束汇编伪指令END格式 标号 END 表达式 功能 放在汇编语言源程序的末尾 表明源程序的汇编到此结束 其后的任何内容不予理睬 3 赋值伪指令EQU格式 字符名称xEQU赋值项n功能 将赋值项n的值赋予字符名称x 程序中凡出现该字符名称x就等同于该赋值项n 其值在整个程序中有效 赋值项n可以是常数 地址 标号或表达式 在使用时 必须先赋值后使用 字符名称 与 标号 的区别是 字符名称 后无冒号 而 标号 后面有冒号 4 定义字节伪指令DB格式 标号 DBx1 x2 xn功能 将8位数据 或8位数据组 x1 x2 xn顺序存放在从当前程序存储器地址开始的存储单元中 xi可以是8位数据 ASCII码 表达式 也可以是括在单引号内的字符串 两个数据之间用逗号 分隔 xi为数值常数时 取值范围为00H FFH xi为ASCII码时 要使用单引号 以示区别 xi为字符串常数时 其长度不应超过80个字符 5 定义双字节伪指令DW格式 标号 DWx1 x2 xn功能 将双字节数据 或双字节数据组 顺序存放在从标号指定地址单元开始的存储单元中 其中 xi为16位数值常数 占两个存储单元 先存高8位 存入低位地址单元中 后存低8位 存入高位地址单元中 6 预留存储空间伪指令DS格式 标号 DSn功能 从标号指定地址单元开始 预留n个存储单元 汇编时不对这些存储单元赋值 n可以是数据 也可以是表达式 7 定义位地址符号伪指令BIT格式 字符名称xBIT位地址n功能 将位地址n的值赋予字符名称x 程序中凡出现该字符名称x就代表该位地址 位地址n可以是绝对地址 也可以是符号地址 8 数据地址赋值伪指令DATA格式 字符名称xDATA表达式n功能 把表达式n的值赋值给左边的字符名称x n可以是数据或地址 也可以是包含所定义的 字符名称x 在内的表达式 但不能是汇编符号 DATA与EQU的主要区别是 EQU定义的 字符名称 必须先定义后使用 而DATA定义的 字符名称 没有这种限制 所以 DATA伪指令通常用在源程序的开头或末尾 2 1 2指令的分类 MCS 51指令系统有111条指令 可按下列几种方式分类 按指令字节数分类单字节指令 49条 双字节指令 46条 和三字节指令 16条 2 按指令执行时间分类单机器周期指令 65条 双机器周期指令 44条 和四机器周期指令 2条 3 按功能分类数据传送指令 29条 算术操作指令 24条 逻辑操作指令 24条 控制转移指令 17条 和位操作指令 17条 2 1 3指令中的常用符号 Rn n 0 7 表示当前工作寄存器R0 R7中的任一个寄存器 Ri i 0或1 表示通用寄存器组中用于间接寻址的两个寄存器R0 R1 data 表示8位直接参与操作的立即数 data16 表示16位直接参与操作的立即数 direct 表示片内RAM的8位单元地址 addr11 表示11位目的地址 主要用于ACALL和AJMP指令中 addr16 表示16位目的地址 主要用于LCALL和LJMP指令中 rel 用补码形式表示的8位二进制地址偏移量 取值范围为 128 127 主要用于相对转移指令 以形成转移的目的地址 DPTR 数据指针 用于寄存器间接寻址方式和变址寻址方式 2 1 3指令中的常用符号 bit 表示片内RAM的位寻址区 或者是可以位寻址的SFR的位地址 A 或ACC B 表示累加器 B寄存器 C 表示PSW中的进位标志位Cy 在间接寻址方式中 表示间接寻址寄存器指针的前缀标志 表示当前的指令地址 在位操作指令中 表示对该位先求反后再参与操作 X 表示由X所指定的某寄存器或某单元中的内容 X 表示由X间接寻址单元中的内容 表示指令的操作结果是将箭头右边的内容传送到左边 表示指令的操作结果是将箭头左边的内容传送到右边 表示逻辑或 与 异或 寻址方式 在计算机中 说明操作数所在地址的方法称为指令的寻址方式 计算机执行程序实际上是在不断寻找操作数并进行操作的过程 每种计算机在设计时已决定了它具有哪些寻址方式 寻址方式越多 计算机的灵活性越强 指令系统也就越复杂 MCS 51单片机的指令系统提供了7种寻址方式 分别为立即寻址 直接寻址 寄存器寻址 寄存器间接寻址 变址寻址 相对寻址和位寻址 一条指令可能含多种寻址方式 2 2MCS 51单片机的寻址方式 2 2 1立即寻址 定义 将立即参与操作的数据直接写在指令中 这种寻址方式称为立即寻址 特点 指令中直接含有所需的操作数 该操作数可以是8位的 也可以是16位的 常常处在指令的第二字节和第三字节的位置上 立即数通常使用 data或 data16表示 在立即数前面加 标志 用以和直接寻址中的直接地址 direc或bit 相区别 2 2 2直接寻址 定义 将操作数的地址直接存放在指令中 这种寻址方式称为直接寻址 特点 指令中含有操作数的地址 该地址指出了参与操作的数据所在的字节单元地址或位地址 计算机执行它们时便可根据直接地址找到所需要的操作数 寻址范围 ROM 片内RAM区 SFR和位地址空间 2 2 3寄存器寻址定义 操作数存放在MCS 51内部的某个工作寄存器Rn R0 R7 或部分专用寄存器中 这种寻址方式称为寄存器寻址 特点 由指令指出某一个寄存器的内容作为操作数 存放操作数的寄存器在指令代码中不占据单独的一个字节 而是嵌入 隐含 到操作码字节中 寻址范围 四组通用寄存器Rn R0 R7 部分专用寄存器 A B DPTR Cy 2 2 4寄存器间接寻址定义 指令给出的寄存器中存放的是操作数据的单元地址 这种寻址方式称为寄存器间接寻址 简称为寄存器间址 特点 指令给出的寄存器中存放的是操作数地址 寄存器间接寻址是一种二次寻找操作数地址的寻址方式 寄存器前边必须加前缀符号 不能用于寻址特殊功能寄存器SFR 寻址范围 内部RAM低128B 只能使用R0或R1作间址寄存器 外部RAM 只能使用DPTR作间址寄存器 对于外部低256单元RAM的访问 除可以使用DPTR外 还可以使用R0或R1作间址寄存器 2 2 5变址寻址定义 操作数存放在变址寄存器 累加器A 和基址寄存器 DPTR或PC 相加形成的16位地址单元中 这种寻址方式称为基址加变址寄存器间接寻址 简称为变址寻址 特点 指令操作码中隐含作为基址寄存器用的DPTR 或PC 和作为变址用的累加器A 在执行变址寻址指令时 MCS 51单片机先把基地址 DPTR或PC的内容 和地址偏移量 A的内容 相加 以形成操作数地址 再由操作数地址找到操作数 并完成相应的操作 变址寻址方式是单字节指令 寻址范围 只能对程序存储器ROM进行寻址 主要用于查表性质的访问 注意 累加器A中存放的操作数地址相对基地址的偏移量的范围为00H FFH 无符号数 MCS 51单片机共有以下三条变址寻址指令 MOVCA A PC A A PC 1MOVCA A DPTR A A DPTR JMP A DPTR PC A DPTR 2 2 6相对寻址定义 将程序计数器PC的当前值 取出本条指令后的PC值 与指令第二个字节给出的偏移量 rel 相加 形成新的转移目标地址 称为相对寻址方式 特点 相对寻址方式是为实现程序的相对转移而设计的 为相对转移指令所使用 其指令码中含有相对地址偏移量 能生成浮动代码 如 SJMPrel PC PC 2 rel相对转移指令的目的地址 指令地址 指令字节数 偏移量寻址范围 只能对程序存储器ROM进行寻址 相对地址偏移量 rel 是一个带符号的8位二进制补码 其取值范围为 128 127 以PC为中间的256个字节范围 2 2 7位寻址定义 指令中给出的操作数是一个可单独寻址的位地址 这种寻址方式称为位寻址方式 特点 位寻址是直接寻址方式的一种 其特点是对8位二进制数中的某一位的地址进行操作 寻址范围 片内RAM低128B中位寻址区 部分SFR 其中有83位可以位寻址 可位寻址的位地址的表示形式如下 1 直接使用位地址形式 如 MOV00H C 00H Cy 其中 00H是片内RAM中20H地址单元的第0位 2 字节地址加位序号的形式 如 MOV20H 0 C 20H 0 Cy 其中 20H 0是片内RAM中20H地址单元的第0位 3 位的符号地址 位名称 的形式 对于部分特殊功能寄存器 其各位均有一个特定的名字 所以可以用它们的位名称来访问该位 如 ANLC P C C P 其中 P是PSW的第0位 C是PSW的第7位 4 字节符号地址 字节名称 加位序号的形式 对于部分特殊功能寄存器 如状态标志寄存器PSW 还可以用其字节名称加位序号形式来访问某一位 如 CPLPSW 6 AC 其中 PSW 6表示该位是PSW的第6位 例题1 指出下列指令的寻址方式MOVA R1 A R1 寄存器寻址ADDA 05H A A 立即数05H立即寻址MOVA R1 A R1 寄存器间接寻址MOV30H 4AH 30H 4AH 直接寻址MOVCA A DPTR A A DPTR 变址寻址SJMPLP PC PC 2 偏移量相对寻址MOV65H C 65H Cy 位寻址 2 3MCS 51单片机的指令系统 MCS 51指令系统使用44种助记符 它们代表着33种功能 可以实现51种操作 指令助记符与操作数的各种可能的寻址方式的结合一共可构造出111条指令 MCS 51单片机指令系统按其功能可分为数据传送类指令 算术运算类指令 逻辑运算和移位类指令 控制转移类指令和位操作类指令五大类 学习指令系统时 应注意 1 指令的格式 功能 2 操作码的含义 操作数的表示方法 3 寻址方式 源 目的操作数的范围 4 对标志位的影响 5 指令的适用范围 6 正确估算指令的字节数 一般地 操作码占1字节 操作数中 直接地址derict占1字节 data占1字节 data16占两字节 操作数中的A B R0 R7 Ri DPTR A DPTR A PC等均隐含在操作码中 2 3 1数据传送指令 CPU在进行算术和逻辑操作时 绝大多数指令都有操作数 所以数据传送是一种最基本 最主要的操作 数据传送指令共29条 可分为内部RAM数据传送 外部RAM数据传送 程序存储器数据传送 数据交换和堆栈操作等五类 寻址范围 累加器A 片内RAM SFR 片外RAM 功能 目的地址 源地址 可表示为 源地址单元的内容不变 对标志位的影响 除以累加器A为目的操作数的数据传送指令对P标志位有影响外 其余均不影响标志位 1 内部RAM数据传送指令 16条 格式 MOV 其中 表示目的操作数 表示源操作数 范围 源 目的操作数均在片内RAM SFR中 指令形式 按目的操作数可将内部数据传送指令分为以下几类 1 以累加器A为目的操作数 4条 MOVA 其中 包括Rn Ri direct data 各个符号的意义见2 1 3节指令中的常用符号 以下同 只影响PSW中的P标志位 不影响其他标志位 2 以工作寄存器Rn为目的操作数 3条 MOVRn 其中 包括A direct data 3 以直接地址单元为目的操作数 5条 MOVdirect 其中 包括A Rn Ri direct data 4 以间址寄存器 Ri为目的操作数 3条 MOV Ri 其中 包括A direct data 5 16位数据传送指令 1条 MOVDPTR data16 注 2 3 4 5 均不影响标志位 内部数据传送指令的传送关系如右图所示 2 外部RAM数据传送指令 4条 CPU与外部数据存储器之间进行数据传送时 必须使用外部传送指令 只能通过累加器A 采用寄存器间接寻址 用R0 R1和DPTR三个间接寻址的寄存器 方式完成 指令格式 MOVXA MOVX A其中 包括 DPTR Ri Ri R0 R1 只能访问片外RAM的低256个单元 DPTR可以访问片外RAM的全部64KB的空间 对标志位的影响 MOVXA 指令只影响PSW中的P标志位 不影响其他标志位 MOVX A指令不影响标志位 3 程序存储器 ROM 数据传送指令 查表指令 2条 程序存储器的数据传送是单向的 并且只能读到累加器A中 这类指令专门用于查表 又称为查表指令 指令格式 MOVCA A DPTP A A DPTR MOVCA A PC PC PC 1 A A PC 两条指令的异同 其功能完全相同 但使用中存在着差异 1 查表的位置要求不同采用DPTR作为基地址寄存器 表可以放在64KB程序存储器空间的任何地址 使用方便 故称为远程查表 采用PC作为基地址寄存器 具体的表在程序存储器中只能在查表指令后的256B的地址空间中 使用有限制 故称为近程查表 2 偏移量的计算方法不同采用DPTR作为基地址寄存器 查表地址为 A DPTR 采用PC作为基地址寄存器 查表地址为 A PC 1 因此偏移量的计算方法不同 采用DPTR作为基地址寄存器 A为欲查数值距离表首地址的值 采用PC作为基地址寄存器 A的值必须预先设置为 A的值 表首地址 当前指令的PC值 14 数据交换指令 5条 数据传输时 若需要保存目的操作数 则经常采用数据交换指令 1 半字节数据交换指令 2条 指令格式 SWAPA A 3 0 A 7 4XCHDA Ri A 3 0 Ri 3 0 2 字节交换指令 3条 指令格式 XCHA 其中 包括Rn Ri direct 5 堆栈操作指令 2条 指令格式 PUSHdirect SP SP 1 SP direct POPderect direct SP SP SP 1特点 堆栈操作指令是一种特殊的数据传送指令 是根据栈指针SP中的栈顶地址进行数据操作 堆栈操作指令的实质是以栈指针SP为间址寄存器的间址寻址方式 堆栈区应避开使用的工作寄存器区和其他需要使用的数据区 系统复位后 SP的初始值为07H 为了避免重叠 一般初始化时要重新设置SP 功能 实现RAM单元数据送入栈顶或由栈顶取出数据送至RAM单元 适用场合 用于执行中断 子程序调用 参数传递等程序的断点保护和现场保护 书写方式 堆栈操作指令是直接寻址指令 直接地址不能是寄存器名 因此应注意指令的书写格式 例如 PUSHACC 不能写成PUSHA POP00H 不能写成POPR0 2 3 2算术运算指令 算术运算指令的两个参与运算的操作数 一个存放在累加器A中 此操作数也为目的操作数 一个存放在R0 R7或 Ri 片内RAM 中 或是 data 立即数 算术运算指令可以分为加法指令 带进位的加法指令 带借位的减法指令 十进制调整指令 加1指令 减1指令 乘除指令 1 加法指令 4条 指令格式 ADDA A A 其中 包括Rn Ri direct data 对标志位的影响 ADD对PSW中的所有标志位均产生影响 2 带进位的加法指令 4条 指令格式 ADDCA A A Cy 其中 包括Rn Ri direct data 对标志位的影响 ADDC对PSW中的所有标志位均产生影响 3 带借位的减法指令 4条 指令格式 SUBBA A A Cy 其中 包括Rn Ri direct data 对标志位的影响 SUBB对PSW中的所有标志位均产生影响 注意 MCS 51指令系统中没有不带借位的减法指令 欲实现不带借位的减法计算 应预先置Cy 0 利用CLRC指令 然后利用带借位的减法指令SUBB实现计算 4 十进制调整指令 1条 功能 跟在加法指令ADD或ADDC后面 对运算结果的十进制数进行BCD码修正 使它调整为压缩的BCD码数 以完成十进制加法运算功能 特点 十进制调整指令也称为BCD码修正指令 这是一条专用指令 两个压缩的BCD码按二进制数相加后必须经本指令调整才能得到压缩的BCD码的和 源操作数只能在累加器A中 结果存入A中 指令格式 DAA注意 十进制调整指令不能对减法指令进行修正 BCD码减法必须采用BCD补码运算法则 变减法为补码加法 被减数 减数的补码 减数的补码 9AH 减数 然后对其进行十进制调整来实现 5 加1指令 5条 功能 加1指令又称为增量指令 其功能是使操作数所指定的单元的内容加1 指令格式 INC 1其中 即是源操作数又是目的操作数 即只有一个操作数 包括A Rn direct Ri DPTR 对标志位的影响 除对累加器A操作影响P标志位外 其他操作均不影响PSW的各标志位 6 减1指令 4条 功能 减1指令又称为减量指令 其功能是使操作数所指定的单元的内容减1 指令格式 DEC 1其中 即是源操作数又是目的操作数 即只有一个操作数 包括A Rn direct Ri 对标志位的影响 同加1指令 7 乘除指令 2条 功能 实现乘法或除法操作 特点 乘除指令在MCS 51指令系统中执行时间最长 均为四周期指令 指令格式 MULAB B A A B DIVAB A A B B 对标志位的影响 乘除指令影响PSW中的Cy OV P标志位 其中 Cy位总是被清0的 P是由累加器A中1的个数的奇偶性决定的 乘法运算中 若乘积大于FFH 则OV标志位置1 否则清0 除法运算中 若除数为0 则OV标志位置1 否则清0 2 3 3逻辑运算和移位指令 对标志位的影响 逻辑运算和移位指令中除了两条带进位的循环移位指令外 其余均不影响PSW中的各标志位 但当目的操作数是累加器A时 影响PSW中的奇偶校验位P 常用的逻辑运算和移位类指令有 逻辑与 逻辑或 逻辑异或 循环移位 清0 求反 非 等24条指令 它们的操作数都是8位的 逻辑运算都是按位进行的 除用于逻辑运算外 还可用于模拟各种数字逻辑电路的功能 进行逻辑电路的设计 1 逻辑与运算指令 6条 功能 实现两个操作数的逻辑与 指令格式 ANLA 其中 包括Rn Ri direct data ANLdirest 其中 包括A data 适用场合 实现逻辑与 主要用于操作数的某些位不变 这些位与 1 某些位置0 这些位与 0 2 逻辑或运算指令 6条 功能 实现两个操作数的逻辑或 指令格式 ORLA 其中 包括Rn Ri direct data ORLdirest 其中 包括A data 适用场合 实现逻辑或 主要用于操作数的某些位不变 这些位或 0 某些位置1 这些位或 1 3 逻辑异或运算指令 6条 功能 实现两个操作数的逻辑异或 指令格式 XRLA 其中 包括Rn Ri direct data XRLdirest 其中 包括A data 适用场合 实现逻辑异或 主要用于操作数的某些位不变 这些位异或 0 某些位取反 这些位异或 1 4 循环移位指令 4条 MCS 51单片机的循环移位指令共有不带进位的循环左 右移位 操作码为RL RR 和带进位的循环左 右移位 操作码为RLC RRC 指令4条 特点 只能对累加器A进行循环移位 指令格式 操作码A 功能 累加器A中的数据逐位左移一位相当于原内容乘2 而逐位右移一位相当于原内容除以2 循环移位指令示意图如右图所示 5 累加器清0与取反指令 2条 指令格式 CLRA A 00HCPLA A 特点 可以节省存储空间 提高程序执行效率 对标志位的影响 CLRA指令只影响PSW的P标志位 CPLA指令不影响PSW各标志位 2 3 4控制转移指令 功能 改变程序计数器PC中的内容 控制程序执行的流向 实现程序分支转向 为了控制程序的执行方向 MCS 51单片机提供了17条控制转移指令 对标志位的影响 除了CJNE影响PSW的进位标志位Cy外 其余均不影响PSW的各标志位 1 无条件转移指令 4条 定义 不规定条件的程序转移称为无条件转移指令 指令格式 长转移指令 LJMPaddr16 PC addr15 0绝对转移指令 AJMPaddr11 PC PC 2 PC10 0 addr11相对 短 转移指令 SJMPrel PC PC 2 rel间接 散 转移指令 JMP A DPTR PC DPTR A 注意 1 使用转移指令时 指令中的地址或偏移量均可采用标号 只有在执行前才被汇编成实际的二进制地址 2 指令的转移范围 在执行当前转移指令后的PC值的基础上 长转移指令LJMP 64KB绝对转移指令AJMP 2KB相对 短 转移指令SJMP 128 127 用补码表示 间接 散 转移指令JMP 64KB 3 相对 短 转移指令SJMPrel中地址偏移量的计算 rel 转移目标地址 转移指令地址 当前PC值 2 4 原地踏步 暂停当前的程序 并不是真的停机 的实现SJMP 或HERE SJMPHERE 5 间接 散 转移指令 JMP A DPTR常用于实现程序的分支转移 散转 DPTR为转移目的的起始地址 A为转移目的的偏移量 6 在编程中 经常使用短转移指令SJMP和相对转移指令AJMP 以便生成浮动代码 并不经常使用长转移指令LJMP 2 条件转移指令 2条 功能 在规定的条件满足时进行程序转移 否则程序往下顺序执行 MCS 51单片机中 条件转移指令实质上是累加器A判零指令 指令格式 JZrel 若 A 0 则转移 PC PC 2 rel若 A 0 则顺序执行 PC PC 2JNZrel 若 A 0 则转移 PC PC 2 rel若 A 0 则顺序执行 PC PC 2指令的转移范围 rel的取值范围是在执行当前转移指令后的PC值基础上的 128 127 用补码表示 可以采用符号地址表示 偏移量rel的计算方法 rel 转移目标地址 转移指令地址 当前PC值 2 3 比较转移指令 4条 指令格式 CJNE目的操作数 源操作数 rel当目的操作数为A时 源操作数为 data direct 当目的操作数为Rn Ri时 源操作数为 data 即 CJNEA direct relCJNEA data relCJNERn data relCJNE Ri data rel功能 把两个操作数进行比较 以比较的结果作为条件来控制程序的转移 若 目的操作数 源操作数 则程序继续执行 PC PC 3若 目的操作数 源操作数 则程序转移 PC PC rel 3 Cy 0若 目的操作数 源操作数 则程序转移 PC PC rel 3 Cy 1 功能 比较两个操作数的大小 对标志位影响 影响Cy标志位 不影响其他标志位 指令的转移范围 rel的取值范围是在执行当前转移指令后的PC值基础上的 128 127 用补码表示 可以采用符号地址表示 注意 比较转移指令的比较是通过两操作数的减法实现的 影响Cy标志位 不保存最后的差值 两个操作数的内容不变 4 循环 减1条件 转移指令 2条 功能 具有减1判非0则转移的功能 主要用于控制程序循环 实现按循环次数控制循环的目的 特点 循环转移指令是一组把减1与条件转移两种功能结合在一起的指令 指令格式 DJNZ rel 1若 0 则转移 PC PC 2 rel若 0 则不转移 PC PC 2注意 条件转移指令均为相对转移指令 因此指令的转移范围十分有限 若要实现64KB范围内的转移 则可以借助于一条长转移指令的过渡来实现 5 子程序调用与返回指令 4条 定义 具有完整功能的程序段定义为子程序 供主程序调用 功能 供主程序在需要时调用 子程序可以在程序中反复多次使用 以简化源程序的书写 特点 子程序可以嵌套 有利于模块化程序设计 主程序与子程序之间的调用关系如下左图所示 两级子程序嵌套的示意图如下右图所示 为了实现主程序对子程序的一次完整调用 必须有子程序调用指令和子程序返回指令 子程序调用指令在主程序中使用 而子程序返回指令则是子程序的最后一条指令 调用与返回指令是成对使用的 子程序调用指令的功能 必须具有自动把程序计数器PC中的断点地址保护到堆栈中 且将子程序入口地址自动送入程序计数器PC中的功能 子程序返回指令的功能 必须具有自动把堆栈中的断点地址恢复到程序计数器PC中的功能 注意 子程序调用时应注意入口参数设置 子程序返回时应注意出口参数的传递 3 子程序返回指令RET PC 15 8 SP SP SP 1 PC 7 0 SP SP SP 1 4 中断返回指令RETI PC 15 8 SP SP SP 1 PC 7 0 SP SP SP 1注 中断服务程序是一种特殊的子程序 它是在计算机响应中断时 由硬件完成调用而进入相应的中断服务程序 RETI指令与RET指令相仿 区别在于RET是从子程序返回 RETI是从中断服务程序返回 无论是RET还是RETI都是子程序执行的最后一条指令 指令格式 1 绝对短调用指令ACALLaddr11 PC PC 2 SP SP 1 SP PC 7 0 SP SP 1 SP PC 15 8 PC 10 0 addr11其中 addr11为11位地址 实际编程时可以用符号地址 并且只能在2KB范围以内调用子程序 2 绝对长调用指令LCALLaddr16 PC PC 3 SP SP 1 SP PC 7 0 SP SP 1 SP PC 15 8 PC 15 0 addr16其中 addr16为16位地址 实际编程时可以用符号地址 可以在64KB范围以内调用子程序 6 空操作指令NOP 1条 指令格式 NOP PC PC 1功能 不执行任何操作 消耗了一个机器周期 常用于软件延时或在程序可靠性设计中用来稳定程序 特点 NOP占据一个单元的存储空间 除了使PC的内容加1外 CPU不产生任何操作结果 只是消耗了一个机器周期 2 3 5位操作指令 位操作 布尔变量操作 操作数不是字节 而是字节中的某个位 每位的取值只能取0或1 指令的寻址范围 片内RAM位寻址区20H 2FH SFR中的11个可位寻址特殊寄存器中的83个可寻址位 特点 以进位标志Cy作为位累加器 可以实现布尔变量的传送 运算和控制转移等功能 指令中的位地址的表达方式 直接地址方式 如0AFH 特殊功能寄存器名 位序号 如PSW 3 字节地址 位序号 如0D0H 0 位名称方式 如F0 和用户定义名称等几种方式 1 位数据传送指令 2条 特点 在可寻址位与位累加器Cy之间进行的 不能在两个可寻址位间直接进行传送 指令格式 MOVC bit Cy bit MOVbit C bit Cy 2 位逻辑操作指令 6条 指令格式 操作码C 其中 操作码包括ANL 逻辑位 与 ORL 逻辑位 或 包括bit bit CPL 其中 CPL表示取反 包括Cy bit 功能 位逻辑操作指令用于位逻辑操作 还可用于对组合逻辑电路的模拟 采用位操作指令进行组合逻辑电路的设计比采用字节型逻辑指令节约存储空间 运算操作十分方便 3 位状态 置位 清0 控制指令 4条 指令格式 CLR 0SETB 1其中 包括Cy bit 4 位条件 控制 转移指令 5条 特点 以位的状态作为实现程序转移的判断条件 指令格式 1 以进位标志位Cy内容为条件的转移指令JCrel 若 Cy 1 则转移 PC PC 2 rel 否则顺序执行JNCrel 若 Cy 0 则转移 PC PC 2 rel 否则顺序执行 2 以位地址bit内容为条件的转移指令指令格式 JBbit rel 若 bit 1 则转移 PC PC 3 rel 否则顺序执行JNBbit rel 若 bit 0 则转移 PC PC 3 rel 否则顺序执行JBCbit rel 若 bit 1 则转移 PC PC 3 rel 且 bit 0 否则顺序执行 2 4汇编语言及程序设计 程序设计 就是编制计算机的程序 即应用计算机所能识别的 接受的语言把要解决的问题的步骤有序地描述出来 程序设计语言的种类 1 机器语言 机器语言是用二进制代码表示的计算机惟一能识别和执行的最原始的程序设计语言 2 汇编语言 利用指令助记符来描述的程序设计语言 3 高级语言 高级语言接近于人的自然语言 是面向过程而独立于机器的通用语言 汇编语言的指令类型 MCS 51单片机汇编语言 包含两类不同性质的指令 1 基本指令 即指令系统中的指令 它们都是机器能够执行的指令 每一条指令都有对应的机器码 2 伪指令 汇编时用于控制汇编的指令 它们都是机器不执行的指令 无机器码 汇编语言的语句格式 汇编语言源程序是由汇编语句 即指令 组成的 典型的汇编语句格式如下 标号 操作码 操作数 操作数 注释 数据的表示方法 1 二进制数 由0 1组成 逢2进1 的数制 如 01011110B 0 1后缀 B b 2 十六进制数 便于读写记忆的二进制数的简写形式 0 9 A F后缀 H h 3 十进制数 可用二进制数表示 也称为BCD码 0 9表示为 0000 1001B 也可用十进制数表示 后缀 D d或无后缀 2 4 1汇编语言程序设计的步骤 汇编语言程序设计 根据任务要求 采用汇编语言编制程序的过程称为汇编语言程序设计 汇编语言程序设计的步骤 1 拟订设计任务书 2 建立数学模型 3 确定算法 4 分配内存单元 编制程序流程图 5 编制源程序进一步合理分配存储器单元和了解I O接口地址 按功能设计程序 明确各程序之间的相互关系 用注释行说明程序 便于阅读和修改调试和修改 6 上机调试 7 程序优化 编制程序流程图 是指用各种图形 符号 指向线等来说明程序设计的过程 国际通用的图形和符号说明如下 椭圆框 开始和结束框 在程序的开始和结束时使用 矩形框 处理框 表示要进行的各种操作 菱形框 判断框 表示条件判断 以决定程序的流向 流向线 流程线 表示程序执行的流向 圆圈 连接符 表示不同页之间的流程连接 各种几何图形符号如下图所示 2 4 2顺序程序设计 特点 顺序结构程序是最简单 最基本的程序 程序按编写的顺序依次往下执行每一条指令 直到最后一条 它能够解决某些实际问题 或成为复杂程序的子程序 例题2 将片内RAM30H单元中的两位压缩BCD码转换成二进制数送到片内RAM40H单元中 解 两位压缩BCD码转换成二进制数的算法为 a1a0 BCD 10 a1 a0程序流程图如右图所示 程序如下 ORG1000HSTART MOVA 30H 取两位BCD压缩码a1a0送AANLA 0F0H 取高4位BCD码a1SWAPA 高4位与低4位换位MOVB 0AH 将二进制数10送入BMULAB 将10 a1送入A中MOVR0 A 结果送入R0中保存MOVA 30H 再取两位BCD压缩码a1a0送AANLA 0FH 取低4位BCD码a0ADDA R0 求和10 a1 a0MOV40H A 结果送入40H保存SJMP 程序执行完 原地踏步 END 例题3 利用查表指令将内部RAM中20H单元的压缩BCD码拆开 转换成相应的ASCII码 存入21H 22H中 高位存在22H 解 BCD码的0 9对应的ASCII码为30H 39H 将30H 39H按大小顺序排列放入表TABLE中 先将BCD码拆分 将拆分后的BCD码送入A 表首址送入DPTR 然后领用查表指令MOVCA A DPTR 查表即得结果 然后存入21H 22H中 程序如下 ORG1000HSTART MOVDPTR TABLEMOVA 20HANLA 0FHMOVCA A DPTRMOV21H A MOVA 20HANLA 0F0HSWAPAMOVCA A DPTRMOV22H ASJMP TABLE DB30H 31H 32H 33H 34HDB35H 36H 37H 38H 39HEND 2 4 3分支程序设计 特点 根据不同的条件 确定程序的走向 它主要靠条件转移指令 比较转移指令和位转移指令来实现 分支程序的结构如右图所示 分支程序的设计要点如下 1 先建立可供条件转移指令测试的条件 2 选用合适的条件转移指令 3 在转移的目的地址处设定标号 解 此题有三个条件 所以有三个分支程序 这是一个三分支归一的条件转移问题 X是有符号数 判断符号位是0还是1可利用JB或JNB指令 判断X是否等于0则直接可以使用累加器A的判0指令 程序流程图如右图所示 例题4 求符号函数的值 已知片内RAM的40H单元内有一自变量X 编制程序按如下条件求函数Y的值 并将其存入片内RAM的41H单元中 1X 0Y 0X 0 1X 0 ORG1000HSTART MOVA 40H 将X送入A中JZCOMP 若A为0 转至COMP处JNBACC 7 POST 若A第7位不为1 X为正数 则程序转到POST处 否则 X为负数 程序往下执行MOVA 0FFH 将 1 补码 送入A中SJMPCOMP 程序转到COMP处POST MOVA 01H 将 1送入A中COMP MOV41H A 结果存入YSJMP 程序执行完 原地踏步 END 2 4 4循环程序设计 特点 程序中含有可以重复执行的程序段 循环体 采用循环程序可以有效地缩短程序 减少程序占用的内存空间 使程序的结构紧凑 可读性好 组成 循环程序一般由下面四部分组成 1 循环初始化 位于循环程序开头 用于完成循环前的准备工作 如设置各工作单元的初始值以及循环次数 2 循环体 循环程序的主体 位于循环体内 是循环程序的工作程序 在执行中会被多次重复使用 要求编写得尽可能简练 以提高程序的执行速度 3 循环控制 位于循环体内 一般由循环次数修改 循环修改和条件语句等组成 用于控制循环次数和修改每次循环时的参数 4 循环结束 用于存放执行循环程序所得的结果 以及恢复各工作单元的初值 循环程序的结构 1 先循环处理 后循环控制 即先处理后控制 如左下图所示 2 先循环控制 后循环处理 即先控制后处理 如右下图所示 循环程序按结构形式 有单重循环与多重循环 1 单重循环程序定义 循环体内部不包括其他循环的程序称为单重循环程序 例题5 已知片内RAM30H 3FH单元中存放了16个二进制无符号数 编制程序求它们的累加和 并将其和数存放在R4 R5中 解 每次求和的过程相同 可以用循环程序实现 16个二进制无符号数求和 循环程序的循环次数应为16次 存放在R2中 它们的和放在R4 R5中 R4存高8位 R5存低8位 程序流程图如右图所示 程序如下 ORG1000HSTART MOVR0 30HMOVR2 10H 设置循环次数 16 MOVR4 00H 和高位单元R4清0MOVR5 00H 和低位单元R5清0LOOP MOVA R5 和低8位的内容送AADDA R0 将 R0与R5的内容相加并产生进位CyMOVR5 A 低8位的结果送R5CLRA A清0ADDCA R4 将R4的内容和Cy相加MOVR4 A 高8位的结果送R4INCR0 地址递增 加1 DJNZR2 LOOP 若循环次数减1不为0 则转到LOOP处循环 否则 循环结束SJMP END 例题6 编制程序将片内RAM的30H 4FH单元中的内容传送至片外RAM的2000H开始的单元中 解 每次传送数据的的过程相同 可以用循环程序实现 30H 4FH共32个单元 循环次数应为16次 保存在R2中 为了方便每次传送数据时地址的修改 送片内RAM数据区首地址送R0 片外RAM数据区首地址送DPTR 程序流程图如右图所示 程序如下 ORG1000HSTART MOVR0 30HMOVDPTR 2000HMOVR2 20H 设置循环次数LOOP MOVA R0 将片内RAM数据区内容送AMOVX DPTR A 将A的内容送片外RAM数据区INCR0 源地址递增INCDPTR 目的地址递增DJNZR2 LOOP 若R2的不为0 则转到LOOP处继续循环 否则循环结束SJMP END 2 多重循环程序 定义 若循环中还包括有循环 称为多重循环 或循环嵌套 例题7 编制程序设计50ms延时程序 解 延时程序与MCS 51指令执行时间 机器周期数 和晶振频率fOSC有直接的关系 当fOSC 12MHz时 机器周期为1 s 执行一条DJNZ指令需要2个机器周期 时间为2 s 50ms 2 s 255 因此单重循环程序无法实现 可采用双重循环的方法编写50ms延时程序 程序如下 ORG1000HDELAY MOVR7 200 设置外循环次数 此条指令需要1个机器周期 DLY1 MOVR6 123 设置内循环次数DLY2 DJNZR6 DLY2 R6 1 0 则顺序执行 否则转回DLY2继续循环 延时时间为2 s 123 246 sNOP 延时时间为1 sDJNZR7 DLY1 R7 1 0 则顺序执行 否则转回DLY1继续循环 延时时间为 246 2 1 1 200 2 1 50 003msRET 子程序结束END 3 循环程序时应注意的问题 1 循环程序是一个有始有终的整体 它的执行是有条件的 所以要避免从循环体外直接转到循环体内部 2 多重循环程序是从外层向内层一层一层进入 循环结束时是由内层到外层一层一层退出的 在多重循环中 只允许外重循环嵌套内重循环 不允许循环相互交叉 也不允许从循环程序的外部跳入循环程序的内部 3 编写循环程序时 首先要确定程序结构 处理好逻辑关系 一般情况下 一个循环体的设计可以从第一次执行情况入手 先画出重复执行的程序框图 然后再加上循环控制和置循环初值部分 使其成为一个完整的循环程序 4 循环体是循环程序中重复执行的部分 应仔细推敲 合理安排 应从改进算法 选择合适的指令入手对其进行优化 以达到缩短程序执行时间的目的 4 排序程序设计 冒泡法 例题7 设MCS 51单片机内部RAM起始地址为30H的数据块中共存有64个无符号数 编制程序使它们按从小到大的顺序排列 解 设64个无符号数在数据块中的顺序为 e64 e63 e2 e1 使他们从小到大顺序排列的方法很多 现以冒泡法为例进行介绍 冒泡法又称两两比较法 它先使e64和e63比较 若e64 e63 则两个存储单元中的内容交换 否则就不交换 然后使e63和e62比较 按同样的原则决定是否交换 一直比较下去 最后完成e2和e1的比较及交换 经过N 1 63次比较 常用内循环63次来实现 后 e1的位置上必然得到数组中的最大值 犹如一个气泡从水低冒出来一样 如下页图所示 图中只画出了6个数的比较过程 第二次冒泡过程和第一次完全相同 比较次数也可以是63次 其实只需要62次 因为e1的位置上是数据块中的最大数 不需要再比较 冒泡后在e2的位置上得到数组中的次大数 如上页图所示 如此冒泡 即大循环 共63次 内循环63 63次 便可完成64个数的排序 实际编程时 可通过设置 交换标志 用来控制是否再需要冒泡 若刚刚进行完的冒泡中发生过数据交换 即排序尚未完成 应继续进行冒泡 若进行完的冒泡中未发生过数据交换 即排序已经完成 冒泡应该停止 例如 对于一个已经排好序的数组 1 2 3 63 64 排序程序只要进行一次循环便可根据 交换标志 的状态而结束排序程序的再执行 这自然可以减少63 1 62次的冒泡时间 冒泡法程序流程图如下页图所示 程序如下 ORG1000HMOVR0 30H 数据区首地址送R0MOVR3 63H 设置外循环次数在R3中LP0 CLR7FH 交换标志位2FH 7清0MOVA R3 取外循环次数MOVR2 A 设置内循环次数MOVR0 30H 重新设置数据区首址LP1 MOV20H R0 数据区数据送20H单元中MOVA R0 20H内容送AINCR0 修改地址指针 R0 1 MOV21H R0 下一个地址的内容送21HCLRC Cy清0SUBBA 21H 前一个单元的内容与下一个单元的内容比较JCLP2 若有借位 Cy 1 前者小 程序转移到LP2处执行 若无借位 Cy 0 前者大 不转移 程序往下执行 MOV R0 20H 前 后内容交换DECR0MOV R0 21HINCR0 修改地址指针 R0 1 SETB7FH 置位交换标志位2FH 7为1LP2 DJNZR2 LP1 修改内循环次数R2 减少 若R2 0 则程序转到LP1处仍执行循环 若R2 0 程序结束循环 程序往下执行JNB7FH LP3 交换标志位2FH 7若为0 则程序转到LP3处结束循环DJNZR3 LP0 修改外循环次数R3 减少 若R3 0 程序转到LP0处 执行仍循环 若R3 0 程序结束循环 往下执行LP3 SJMP 程序执行完 原地踏步 END 2 4 5查表程序设计 查表 根据存放在ROM中数据表格的项数来查找与它对应的表中值 适用场合 主要应用于数码显示 打印字符的转换 数据转换等场合 1 采用MOVCA A DPTR指令查表程序的设计方法 1 在程序存储器中建立相应的函数表 设自变量为
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 湖南省湘潭市雨湖区2024-2025学年四年级下学期期末考试语文试题(无答案)
- 江苏省南京市29中学2026届英语九年级第一学期期末预测试题含解析
- 2026届江苏省南京市临江高级中学高三上学期一模物理试题(无答案)
- 2026届内蒙古自治区通辽市化学九上期中调研模拟试题含解析
- 2026届辽宁省大连市名校英语九年级第一学期期末检测试题含解析
- 广西玉林市北流市2026届化学九上期中监测试题含解析
- 北京海淀人大附2026届九上化学期中考试试题含解析
- 做个有缘人第9课【老师您好】 课件2025-2026学年北师大版(2015)初中心理健康七年级全一册
- 2026届北京顺义化学九上期中检测试题含解析
- 商铺租赁合同签订中的租赁期限与续约规定
- 人教版四年级上册数学《速度、时间和路程》获奖说课稿
- 智联招聘国企笔试题库
- 上海交通大学本科毕业答辩
- 数字货币概论 课件 第5章 稳定币的原理与实现
- 《基金法律法规、职业道德与业务规范》知识点必考必练试题库200题(含详解)
- 计算机网络原理实验教程
- 2024年《企业战略管理》期末考试复习题库(含答案)
- 《火力发电工程安全检查规程》
- 慢性胆囊炎急性发作的护理查房
- 标准化养羊场建设
- 碎石技术供应保障方案
评论
0/150
提交评论