单片机原理及应用(C语言版)3.ppt_第1页
单片机原理及应用(C语言版)3.ppt_第2页
单片机原理及应用(C语言版)3.ppt_第3页
单片机原理及应用(C语言版)3.ppt_第4页
单片机原理及应用(C语言版)3.ppt_第5页
已阅读5页,还剩145页未读 继续免费阅读

下载本文档

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

文档简介

单片机原理及应用 C语言版 第3章MCS 51指令系统及汇编程序设计 主编 周国运本章制作 周国运中国水利水电出版社 第3章MCS 51指令系统及汇编程序设计 目录3 1汇编语言概述3 2MCS 51单片机寻址方式3 3MCS 51单片机指令系统3 4MCS 51单片机伪指令3 5汇编语言程序设计举例 本章讨论MCS 51单片机的指令系统及汇编语言程序设计 内容主要包括 汇编语言基本概念 寻址方式 指令系统 伪指令 汇编语言程序举例 本章是单片机程序设计的基础 即便是主要用C语言做设计程序 但对某些要求较高的部分 还是需要用汇编语言来写程序 3 1汇编语言概述 主要内容3 1 1指令和机器语言3 1 2汇编语言3 1 3汇编语言指令格式 3 1 1指令和机器语言 一 指令和指令系统指令 是计算机中CPU根据人的意图来执行某种操作的命令 指令系统 是一台计算机 CPU 所能执行的全部指令的集合 指令系统的强弱 决定了计算机智能的高低 3 1 1指令和机器语言 二 程序和程序设计语言程序 人们编写的 使计算机完成某项工作的指令序列 称为程序 程序设计 编写程序的过程叫程序设计程序设计语言 编写程序的一整套规则 方法 程序设计语言分类 分为机器语言 汇编语言和高级语言等 3 1 1指令和机器语言 三 机器语言机器语言 用二进制编码表示每条指令 是计算机能够直接识别和执行的语言 目标程序 用机器语言编写的程序 例如 13 25 在MCS 51中的机器码为01110100000011010010010000011001用十六进制表示指令码为 74H0DH把13放到累加器A中24H19HA加25 结果仍放回A中 3 1 2汇编语言 汇编语言 用助记符 符号 数字等表示指令的程序语言 例如 上面的 13 25 的例子可写成 汇编语言程序机器语言代码MOVA 0DH74H0DHADDA 19H24H19H相对于机器语言来说 汇编语言容易理解和记忆 汇编语言和机器语言都属于低级语言 3 1 3汇编语言指令格式 一 MCS 51汇编语言指令格式由四部分组成 其一般格式如下 标号 操作码 操作数 注释 方括号中的内容可以没有 即可以没有标号 操作数和注释 至少要有操作码 其操作数部分最多可以是三项 第1操作数 第2操作数 第3操作数 对MOV指令 有两项 第1操作数常称为目的操作数 第2操作数称为源操作数 3 1 3汇编语言指令格式 例如 START MOVA 23H 23H A START 为标号 MOV 为操作码 A 23H 为操作数 23H A 为注释 3 1 3汇编语言指令格式 二 MCS 51汇编指令构成1 单字节指令指令中既包含有操作码 也包含有操作数 有两种情况 1 指令码中隐含着对某个寄存器的操作如 INCA MULAB RLA CLRC INCDPTR 等指令 2 由指令码中的rrr或i指定操作数 3 1 3汇编语言指令格式 这种情况是指令中使用了Rn或Ri如 MOVRn A 编码格式为 11111rrrrrr的取值为 0 7 表示R0 R7又如 MOVA Ri 编码格式为 1110011ii取值为 0 1 表示R0 R1 3 1 3汇编语言指令格式 2 双字节指令一个字节表示操作码 另一个字节表示操作数或操作数的地址 3 三字节指令一个字节表示操作码 另两个字节表示操作数或操作数的地址 3 2MCS 51单片机寻址方式 主要内容3 2 1立即数寻址3 2 2寄存器寻址3 2 3直接寻址3 2 4寄存器间接寻址3 2 5变址寻址3 2 6位寻址3 2 7指令寻址3 2 8寻址空间及指令中的符号 寻址方式 就是指CPU寻找参与运算的操作数的方式 或者寻找数据保存位置的方式 7种寻址方式 立即数寻址 寄存器寻址 直接寻址 寄存器间接寻址 变址寻址 位寻址和指令寻址 寻址方式分两类 操作数寻址和指令寻址 在7种寻址方式中 除了指令寻址之外 其余6种都属于操作数寻址 寻址方式是汇编语言程序设计中最基本的内容之一 必须要十分熟悉 3 2MCS 51单片机寻址方式 3 2 1立即数寻址 立即数寻址也叫立即寻址 常数寻址 其操作数就在指令中 是指令的一部分 紧跟在操作码后面 用 符号作前缀 以区别地址 例如 MOVA 2CH 2CH AMOVA 2CH 2CH A前者表示把2CH这个数送给累加器A 后者表示把片内RAM中地址为2CH单元的内容送给累加器A 3 2 1立即数寻址 立即数也可以是16位的 如 MOVDPTR 1234HMOVTL2 2345HMOVRCAP2L 3456H对于第2条指令 立即数的低8位送给了TL2 高8位送给了TH2 对于第3条指令 立即数的低8位送给了RCAP2L 高8位送给了RCAP2H 3 2 2寄存器寻址 寄存器寻址 就是由指令指出寄存器组R0 R7中某一个或寄存器A B DPTR和C 位处理器的累加器 的内容作为操作数 例如 MOVA R7 R7 AMOV36H A A 36HADDA R0 A R0 A对于工作寄存器组的操作 必须要考虑PSW中RS1 RS0的值 确定当前使用的是哪一组寄存器以及它们的实际地址 3 2 2寄存器寻址 图3 1寄存器寻址方式 INCR3 3 2 3直接寻址 直接寻址 是指操作存放在片内RAM中 指令中给出操作数的地址 例如 MOVA 38H 38H A说明 1 直接寻址方式可以访问片内RAM的低128字节和所有的特殊功能寄存器 2 直接寻址不能够访问片内RAM的高128字节 高128字节只能够间接访问 对于特殊功能寄存器 既可以使用地址 也可以使用SFR名 例如 MOVA P1或MOVA 90H 3 2 4寄存器间接寻址 寄存器间接寻址 是指操作数存放在RAM中 指令中给出存放操作数地址的寄存器 指令执行时 通过寄存器内的地址 间接地访问操作数 存放地址的寄存器称为间址寄存器 在指令中 在寄存器前面加前缀 表示 MCS 51单片机规定 使用Ri i 0 1 即指R0 R1 SP和DPTR作间址寄存器 寄存器间接寻址有以下几种情况 3 2 4寄存器间接寻址 一 使用Ri间接访问片内RAM间接访问的范围 256字节 包括低128字节和高128字节 但不包括特殊功能寄存器 例如 MOVA Ri Ri AMOV Ri A A Ri Ri 表示Ri指向的单元 即单元的地址 Ri 表示Ri指向单元中的数据 操作过程如图3 3所示 3 2 4寄存器间接寻址 对使用SP间接访问片内RAM 在C语言中也可以访问片外RAM 仅用在堆栈操作中 见后面指令系统 3 2 4寄存器间接寻址 二 使用Ri间接访问片外RAM间接访问的范围 片外RAM的64KB全空间 其指令只有两条 MOVXA Ri P2 Ri AMOVX Ri A A P2Ri 注意 1 P2中的值作为高8位地址 Ri中的值作为低8位地址 2 如果P2不改变 则范围为256B 3 这两条指令均为总线操作 相应总线信号有效 高低8位地址 ALE RD或WR 3 2 4寄存器间接寻址 三 使用DPTR间接访问片外RAM间接访问的范围 片外RAM的64KB全空间 其指令也是只有两条 MOVXA DPTR DPTR AMOVX DPTR A A DPTR DPTR为16位地址 3 2 5变址寻址 变址寻址 实为基址加变址的间接寻址 指令中给出存放基址和变址的寄存器 基地址寄存器 DPTR或PC 变址寄存器 累加器A 也在地址寄存器前面加上前缀 例如 MOVCA A DPTR A DPTR A该指令的操作过程如图3 4所示 3 2 5变址寻址 3 2 5变址寻址 变址寻址的空间为程序存储器寻址范围 若使用DPTR为基地址寄存器 寻址范围为64KB 若使用PC为基地址寄存器 寻址空间在PC之后256字节范围内 变址寻址主要用于查表操作 3 2 6位寻址 位寻址 是指操作数是二进制位 位地址位操作数地址范围 片内RAM中20H 2FH SFR中可以按位寻址的位 位地址在指令中用bit表示 例如 SETBbitMOVC bit 3 2 6位寻址 位地址的4种表示方式 1 直接位地址 00H FFH 如32H2 字节地址带位号 如20H 1 表示20H单元的第1位 3 特殊功能寄存器名带位号 如P1 7 表示P1口的第7位 4 位符号地址 具体的 SFR位名 用 BIT 定义的位符号 如 flagBIT01H 如TR0 flag TR0表示定时器 计数器0的运行控制位 flag表示01H位 3 2 7指令寻址 指令寻址 指令中的操作数给出转移的目标地址或目标地址的一部分 指令寻址分为绝对寻址和相对寻址两种方式 指令寻址用于控制转移指令中 3 2 7指令寻址 一 绝对寻址绝对寻址 指令中的操作数给出转移的16位目标地址 寻址范围 64KB全空间 绝对寻址用在长转移和长调用指令中 例如 LJMPSER INT T1 无条件转移到T1中断服务程序LCALLSUB SORT SUB SORT调用排序子程序 SUB SORT为16位目标地址标号 SER INT T1为16位目标地址标号 3 2 7指令寻址 二 相对寻址相对寻址 是以当前程序计数器PC值为基地址 加上指令中给出的偏移量rel 得到目标位置的地址 即 目标地址 PC rel rel 目标地址 PC偏移量rel为8位补码 其值为 128 127 rel 0表明目标地址小 源地址大 程序向回跳转 rel 0 程序向前跳转 3 2 7指令寻址 例如 JZFIRST A 0 跳转到FIRSTDJNZR7 LOOP R7 1 0 跳转到LOOP说明 1 在实际编程中 不需要计算rel rel由编译器自动计算 2 当跳转范围超出了rel范围 编译器会提示 对程序做适当调整即可 3 2 8寻址空间及指令中的符号注释 3 2 8寻址空间及指令中的符号注释 二 指令中常用符号Rn n 0 7 当前选中的工作寄存器R0 R7 Ri i 0 1 当前选中的工作寄存器组中可作为地址指针的R0和R1 data 8位立即数 data16 16位立即数 direct 8位片内RAM单元地址 包括低128B和SFR 但不包括高128B addr16 程序存储空间的16位地址 3 2 8寻址空间及指令中的符号注释 rel 补码形式的8位地址偏移量 以下面指令的第一个字节为基地址 地址偏移量在 128 127 bit 片内RAM或SFR中的直接寻址位地址 间址寄存器的前缀符号 表示间接寻址 3 2 8寻址空间及指令中的符号注释 表示 中的内容 表示由 中指向的地址单元中的内容 逻辑与 逻辑或 逻辑异或 指令操作流程 将内容送到箭头指向的地方 3 3MCS 51单片机指令系统 主要内容3 3 1数据传送指令3 3 2算术运算指令3 3 3逻辑运算指令3 3 4控制程序转移指令3 3 5位操作指令 3 3MCS 51单片机指令系统 指令概述MCS 51单片机指令系统有111条指令 分类如下 1 按字节分类单字节指令 49条 双字节指令 45条三字节指令 17条2 按执行时间分类单周期指令 64条 双周期指令 45条四周期指令 2条 乘 除指令 3 3MCS 51单片机指令系统 3 按功能分类 分为5大类 数据传送指令 29条算术运算指令 24条逻辑运算指令 24条控制程序转移指令 17条位操作指令 17条MCS 51指令没有复杂的寻址方式 并且助记符只有42种 所以单片机指令容易理解 容易记忆 容易掌握 3 3 1数据传送指令 数据传送是使用最频繁的一类指令 所谓传送 就是把源地址单元的内容传送到目的地址单元中去 而源地址单元中的内容不变 数据传送指令可以分为三组 普通传送指令 数据交换指令 堆栈操作指令 这类指令一般不影响程序状态字 只有目的操作数是累加器A时 影响标志位P 3 3 1数据传送指令 一 普通传送指令普通传送指令以助记符MOV为基础 分为 片内数据存储器传送指令 用MOV片外数据传送指令 用MOVX程序存储器传送指令 用MOVC 3 3 1数据传送指令 1 片内数据存储器传送指令MOV格式 MOV目的操作数 源操作数源操作数 可以是A Rn Ri direct data目的操作数 可以是A Rn Ri direct DPTR以目的操作数的不同可以分为五个小组 共16条指令 3 3 1数据传送指令 1 以A为目的操作数MOVA Rn Rn AE8 EFMOVA direct direct AE5directMOVA Ri Ri AE6E7MOVA data data A74data工作寄存器Rn R0 R7Ri间接寻址寄存器 R0或R1本组4条指令都影响PSW中的P标志位指令字节数 1 2 1 2 3 3 1数据传送指令 2 以Rn为目的操作数MOVRn A A RnMOVRn direct direct RnMOVRn data data Rn本组指令都不影响PSW中的标志位 指令字节数 1 2 2 3 3 1数据传送指令 3 以直接地址direct为目的操作数MOVdirect A A directMOVdirect Rn Rn directMOVdirect2 direct1 direct1 direct2MOVdirect Ri Ri directMOVdirect data data direct本组指令都不影响PSW中的标志位指令字节数 2 2 3 2 3 3 3 1数据传送指令 4 以间接地址 Ri为目的操作数MOV Ri A A RnMOV Ri direct direct RnMOV Ri data data Rn本组指令都不影响PSW中的标志位 3 3 1数据传送指令 5 以DPTR为目的操作数MOVDPTR data16 dataH DPH dataL DPL该指令不影响PSW中的标志位 例3 1设片内RAM中 30H 40H 40H 10H 分析以下程序执行后各单元及寄存器中的内容 3 3 1数据传送指令 MOVR0 30H 30H R0MOVA R0 R0 AMOVR1 A A R1MOVB R1 R1 BMOV10H 20H 20H 10H执行上述指令后的结果为 R0 30H R1 A 40H B 10H 10H 20H 3 3 1数据传送指令 2 片外数据存储器传送指令MOVXMOVXA Ri P2 Ri AMOVX Ri A A P2 Ri MOVXA DPTR DPTR AMOVX DPTR A A DPTR 第1和第3条指令是执行总线读操作 读控制信号RD有效 第2和第4条指令是执行总线写操作 写控制信号WR有效 这组指令中第1 3两条指令影响P标志位 其它2条指令不影响任何标志位 3 3 1数据传送指令 例3 2设片外RAM空间 0203H 6FH 分析执行下面指令后的结果 MOVDPTR 0203H 0203H DPTRMOVXA DPTR DPTR AMOV30H A A 30HMOVA 0FH 0FH AMOVX DPTR A A DPTR 执行结果为 DPTR 0203H 30H 6FH 0203H A 0FH 3 3 1数据传送指令 3 程序存储器传送指令MOVC该类指令又称为查表指令 经常用于查表 这类指令只有以下2条单字节指令 MOVCA A DPTR A DPTR AMOVCA A PC A PC A前者叫远程查表指令 64KB全空间 后者叫近程查表指令 PC处256B 这两条指令都影响P标志位 3 3 1数据传送指令 地址偏移量 的计算方法使用第2条指令的关键 是准确计算从本指令到数据所在处的地址偏移量 将 分为两段 表首偏移和表内偏移地址偏移量 表首偏移量 表内偏移量表首偏移量为 表首偏移量 表首地址 PC 3 3 1数据传送指令 例3 3从程序存储器2000H单元开始存放0 9的平方值 以PC作为基址寄存器 执行查表指令得到6的平方值 并且送到片内RAM中的30H单元 设MOVC指令所在的地址为1FA0H 则表首偏移量 2000H 1FA0H 1 5FH 表内偏移量为6 相应的程序为 MOVA 5FH 表首偏移送AADDA 06H 计算总偏移 MOVCA A PC 读表中数据MOV30H A 3 3 1数据传送指令 用以DPTR为基址寄存器的查表指令 其程序如下 MOVDPTR 2000HMOVA 6MOVCA A DPTRMOV30H A通过本例对两条查表指令比较可以看出 以DPTR为基址寄存器的查表指令使用简单 方便 3 3 1数据传送指令 二 数据交换指令数据交换指令中数据作双向传送 传送后 前一个操作数传送到了后一个操作数所保存的地方 后一个操作数传送到了前一个操作数所保存的地方 数据交换指令要求第一个操作数必须为累加器A 共5条指令 分为字节交换和半字节交换两个类型 3 3 1数据传送指令 1 字节交换指令XCHA Rn A Rn XCHA direct A direct XCHA Ri A Ri 这3条指令都影响P标志位2 低半字节交换指令XCHDA Ri A0 3 Ri 0 3 这条指令影响P标志位3 A自身半字节交换指令SWAPA A0 3 A4 7 这条指令不影响任何标志位 3 3 1数据传送指令 例3 4设 R0 30H 30H 4AH A 28H 则分别执行 XCHA R0 XCHA R0 XCHDA R0 SWAPA 后各单元的内容 执行 XCHA R0 后 A 30H R0 28H执行 XCHA R0 后 A 4AH 30H 28H执行 XCHDA R0 后 A 2AH 30H 48H执行 SWAPA 后 A 82H 30H 4AH 3 3 1数据传送指令 三 堆栈操作指令堆栈操作有进栈和出栈两条指令 常用于保存和恢复现场 PUSHdirect 先 SP 1 SP 后 direct SP POPdirect 先 SP direct 后 SP 1 SPPUSH为进栈操作 POP为出栈操作 当操作数是累加器A时 影响P标志位 3 3 1数据传送指令 例3 5若在程序存储器中2000H单元开始的区域依次存放着0 9的平方值 用查表指令读取3的平方值并存于片内RAM中30H单元 要求操作后保持DPTR中原来的内容不变 为了使用DPTR 并且保持原来的内容不变 应该在使用DPTR前使其进栈 使用后再出栈恢复其原来内容 程序如下 3 3 1数据传送指令 注意 1 进栈与出栈必须成对使用 2 先进栈的必须后出栈 后进栈的必须先出栈 否则会出现DPL与DPH内容互换 PUSHDPHPUSHDPLMOVDPTR 2000HMOVA 3MOVCA A DPTRMOV30H APOPDPLPOPDPH 3 3 2算术运算指令 指令内容 包括加 减 乘 除 BCD码调整等指令 共有24条 CPU的运算能力 只能执行无符号二进制整数运算 可以借助于溢出标志位 实现有符号数的补码运算 借助于进位标志 可以实现多精度加 减运算 对标志位的影响 结果会影响进位标志CY 半进位标志AC 溢出标志OV 奇偶标志位P 但加1和减1指令不影响这些标志位 3 3 2算术运算指令 指令中的操作数 多数以累加器A作为第一操作数 第二操作数可以是工作寄存器Rn 直接地址数据 间接地址数据和立即数 即第一操作数 多为A第二操作数 Rn direct Ri data为了便于讨论 将其分为5个类型 3 3 2算术运算指令 一 加法指令分为不带进位加法 带进位加法和加1指令1 不带进位加法指令ADDADDA Rn A Rn AADDA direct A direct AADDA Ri A Ri AADDA data A data A这组指令影响标志位CY AC OV和P 溢出标志OV只对有符号运算有意义 3 3 2算术运算指令 2 带进位加法指令ADDCADDCA Rn A Rn CY AADDCA direct A direct CY AADDCA Ri A Ri CY AADDCA data A data CY A这组指令影响标志位CY AC OV和P 溢出标志OV只对有符号运算有意义 3 3 2算术运算指令 例3 7试编写程序 把R1R2和R3R4中的两个16位数相加 结果存放在R5R6中 思路 先对两个低字节相加 再对两个高字节相加 1 低字节R2和R4相加 使用ADD 其和存放于R6中 2 高字节R1和R3相加 使用ADDC 其和存放于R5中 程序段如下页 3 3 2算术运算指令 程序段如下 MOVA R2 R2 AADDA R4 A R4 AMOVR6 A A R6MOVA R1 R1 AADDCA R3 A R3 CY AMOVR5 A A R5 3 3 2算术运算指令 3 加1指令INCINCA A 1 AINCRn Rn 1 RnINCdirect direct 1 directINC Ri Ri 1 Ri INCDPTR DPTR 1 DPTR这组指令除了第一条影响标志位P之外 其它指令不影响标志位 3 3 2算术运算指令 二 减法指令减法指令分为带借位减法指令和减1指令 1 带借位减法指令SUBBSUBBA Rn A Rn CY ASUBBA direct A direct CY ASUBBA Ri A Ri CY ASUBBA data A data CY A这组指令影响标志位CY AC OV和P 溢出标志OV只对有符号数运算有意义 3 3 2算术运算指令 由于MCS 51单片机没有不带借位的减法指令 对于不带借位的减法运算 可以先对CY清0 然后再用SUBB命令操作 例3 8试编写实现 R2 R1 R3 功能的程序 程序段如下 MOVA R2CLRC 对CY清0SUBBA R1MOVR3 A 3 3 2算术运算指令 1 减1指令DECDECA A 1 ADECRn Rn 1 RnDECdirect direct 1 directDEC Ri Ri 1 Ri 这组指令除了第一条影响标志位P之外 其它指令不影响标志位 3 3 2算术运算指令 三 乘法指令MUL在MCS 51单片机中 乘法指令只有一条 MULAB A B B 高字节 A 低字节 操作 把累加器A和寄存器B中两个8位无符号数相乘 所得的16位积的高字节存放在B中 低字节存放在A中 对标志位的影响 若乘积大于0FFH OV置1 说明高字节B中不为0 否则OV清0 影响P标志位 对CY总是清0 3 3 2算术运算指令 例设 A 50H B 0A0H 分析执行指令 MULAB 后的结果 指令执行后的结果为 B 32H A 00H即乘积为3200H Cy 0 OV 1 3 3 2算术运算指令 四 除法指令DIV在MCS 51单片机中 除法指令只有一条 DIVAB A B 商 A 余 B操作 A的内容除以B的内容 均为无符号整数 所得结果的整数商存放在A中 余数存放在B中 对标志位的影响 如果除数 B 0 则标志位OV置1 否则清0 影响P标志位 CY总是被清0 3 3 2算术运算指令 五 十进制调整指令DA十进制调整指令只有一条 DAA 调整A内容为BCD码调整方法 若A的低 高 4位为十六进制的A F 或者标志位AC CY 为1 则A的内容加06H 60H 调整 适用场合 用于ADD或ADDC指令后 且只能用于压缩的BCD码相加结果的调整 对标志位的影响 影响CY AC和P 但不影响OV 3 3 2算术运算指令 例3 9试编写程序 对两个十进制数76 58相加 并且保持其结果为十进制数 把结果存于R3中 程序段如下 MOVA 76HADDA 58HDAAMOVR3 A程序执行后 R3中的内容为34H 进位标志CY为1 则最后结果为134 编程时 注意对BCD码的写法 要按十进制数格式写 然后在其后面加上H 3 3 3逻辑操作指令 逻辑操作指令包括与 或 异或 清0 求反 移位等操作指令 共有24条 指令中的操作数 A Rn direct Ri data对标志位的影响 一般不影响标志位 如果累加器A为目的操作数 会影响奇偶标志P 如果带进位位作移位操作 会影响进位标志CY 为了便于讨论 将其分为5组进行讨论 3 3 3逻辑操作指令 一 逻辑与指令ANLANLA Rn A Rn AANLA direct A direct AANLA Ri A Ri AANLA data A data AANLdirect A direct A directANLdirect data direct data direct逻辑与操作往往用于使某些位清0 这组指令的仅前4条只影响奇偶标志位P 3 3 3逻辑操作指令 二 逻辑或指令ORLORLA Rn A Rn AORLA direct A direct AORLA Ri A Ri AORLA data A data AORLdirect A direct A directORLdirect data direct data direct逻辑或操作往往用于使某些位置1 这组指令的仅前4条只影响奇偶标志位P 3 3 3逻辑操作指令 三 逻辑异或指令ORLXRLA Rn A Rn AXRLA direct A direct AXRLA Ri A Ri AXRLA data A data AXRLdirect A direct A directXRLdirect data direct data direct逻辑异或操作往往用于使某些位取反 用1异或使对应位取反这组指令的仅前4条只影响奇偶标志位P 3 3 3逻辑操作指令 例3 10写出完成以下各功能的指令 1 只对累加器A中的1 3 5位清0 2 只对A中的2 4 6位置1 3 只对A中的0 1 6 7位取反 对应指令如下 ANLA 11010101BORLA 01010100BXRLA 11000011B 3 3 3逻辑操作指令 四 累加器A清0和求反指令CLRA 0 ACPLA A A前一条指令是对A清0 该指令影响奇偶标志位P 后一条指令是对A求反 不影响任何标志位 3 3 3逻辑操作指令 四 循环移位指令A循环左移 RLA A循环右移 RRA A带进位循环左移 RLCA A带进位循环右移 RRCA 说明 1 这4条指令 每执行一次只移动1位 2 左移一次相当于乘以2 右移一次相当于除以2 对标志位影响 仅后两条指令影响CY和P 3 3 4控制程序转移指令 计算机功能的强弱 主要取决于转移类指令的多少与功能 特别是条件转移指令 MCS 51单片机有17条转移类指令 包括无条件转移指令 条件转移指令 子程序调用及返回指令等 对标志位影响 只有比较转移指令影响进位标志CY 其它指令不影响标志位 为了便于讨论 将其分为4组进行讨论 3 3 4控制程序转移指令 一 无条件转移指令无条件转移指令 当程序执行该指令后 程序无条件地转移到指定的地址去执行 包括短转移 长转移和间接转移3条指令1 短转移指令SJMP 相对转移指令 SJMPrel PC rel PCrel 相对转移偏移量 有符号数 128 127 负数表示向回跳转 正数表示向前跳转 指令实际写为 SJMP目标地址标号 3 3 4控制程序转移指令 2 长转移指令LJMPLJMPaddr16 addr16 PC由于程序的目标地址是16位 因此程序可以跳转到64KB程序存储器空间的任何地方 指令的实际编写形式为 LJMP目标地址标号 3 3 4控制程序转移指令 3 间接转移指令JMP也叫散转指令 多分支转移指令 JMP A DPTR A DPTR PCDPTR为基址 A为相对偏移 在64KB范围内无条件转移 说明 1 DPTR一般为确定的值 累加器A为变值 根据A的值转移到不同的地方 因此该指令也叫散转指令 2 在使用中 往往与一个转移指令表一起实现多分支转移 3 3 4控制程序转移指令 例3 13分析下面多分支转移程序段 MOVB 3MULAB 开始时 A 0 1 2MOVDPTR TABLE 表首地址送DPTRJMP A DPTR 根据A值转移TABLE LJMPTAB0 A 0时转到TAB0执行LJMPTAB1 A 3时转到TAB1执行LJMPTAB2 A 6时转到TAB2执行 程序中 根据累加器A的开始值 0 1 2 转移到相应的TAB0 TAB2分支去执行 3 3 4控制程序转移指令 一 条件转移指令当指令中条件满足时 程序转到指定位置执行 条件不满足时 程序顺序执行 条件转移指令有三种 判断累加器A转移指令 比较转移指令 循环转移指令 共8条 这类指令都属于相对转移 转移范围均为 128 127 需要注意的是 注释中的PC值 均为下一条指令的地址值 3 3 4控制程序转移指令 1 判断转移指令判断A为0转移 JZrel A 0 PC rel PC A 0 顺序执行判断A非0转移 JNZrel A 0 PC rel PC A 0 顺序执行指令的实际编写形式分别为 JZ目标地址标号 和 JNZ目标地址标号 3 3 4控制程序转移指令 例3 14试编写程序 把片外RAM地址从2000H开始的数据 传送到片内RAM地址从30H开始的单元 直到出现0为止 程序段如下 MOVDPTR 2000HMOVR0 30HLOOP MOVXA DPTR 3 3 4控制程序转移指令 LOOP MOVXA DPTRMOV R0 AINCR0INCDPTRJNZLOOP A 0跳转SJMP 程序停留到此 3 3 4控制程序转移指令 2 比较转移指令CJNE比较转移指令功能较强 共有4条指令 一般格式为 CJNE操作数1 操作数2 rel 目标标号 指令功能 两个操作数做比较 若不等则转移 否则顺序执行 具体形式如下 第一条 CJNEA direct rel 若 A direct 则 PC rel PC 即转移 否则顺序执行且 A direct 0 CY A direct 1 CY 3 3 4控制程序转移指令 第二条 CJNEA data rel 若 A data 则 PC rel PC 即转移 否则顺序执行且 A data 0 CY A data 1 CY第三条 CJNERn data rel 若 Rn data 则 PC rel PC 即转移 否则顺序执行且 Rn data 0 CY Rn data 1 CY 3 3 4控制程序转移指令 第四条 CJNE Ri data rel 若 Ri data则 PC rel PC 即转移 否则顺序执行且 Ri data 0 CY Ri data 1 CY可见这4条指令会影响进位标志CY 3 3 4控制程序转移指令 3 循环转移指令DJNZ循环转移指令共有两条指 DJNZRn rel Rn 1 Rn 若 Rn 0 则 PC rel PC 否则顺序执行DJNZdirect rel Rn 1 direct 若 direct 0 则 PC rel PC 否则顺序执行指令的实际编写形式为 DJNZRn 目标地址标号DJNZdirect 目标地址标号 3 3 4控制程序转移指令 例3 15试编写程序 统计片内RAM中从40H单元开始的20个单元中0的个数 结果存于R2中 用R0作间址寄存器读取数据 用JNZ或CJNE判断数据是否为0 用R2记录0的个数 用DJNZ指令 R7控制循环 程序段一 用JNZ判断数据是否为0 MOVR0 40H R0指向40H单元MOVR7 20 R7控制循环MOVR2 0 R2存放结果 3 3 4控制程序转移指令 MOVR0 40H R0指向40HMOVR7 20 R7控制循环MOVR2 0 R2存放结果LOOP MOVA R0JNZNEXT A 0转INCR2NEXT INCR0DJNZR7 LOOP 3 3 4控制程序转移指令 程序段二 用CJNE判断数据是否为0 MOVR0 40H R0指向40HMOVR7 20 R7控制循环MOVR2 0 R2存放结果LOOP CJNE R0 0 NEXTINCR2NEXT INCR0DJNZR7 LOOP 3 3 4控制程序转移指令 三 子程序调用和返回指令这类指令有3条 一条调用 两条返回 1 子程序调用指令 也叫长调用指令 LCALLaddr16 SP 1 SP PC7 0 SP SP 1 SP PC15 8 SP addr16 PC2 子程序返回指令RET SP PC15 8 SP 1 SP SP PC7 0 SP 1 SP 3 3 4控制程序转移指令 3 中断服务程序返回指令RETI SP PC15 8 SP 1 SP SP PC7 0 SP 1 SP RETI 除了具有 RET 的功能外 还将开放中断逻辑 四 空操作指令NOP 延时一个机器周期常用于延时 3 3 4控制程序转移指令 还有两条指令 以上只有15条指令 这两条指令是 AJMP 和 ACALL 称为绝对转移 短转移 指令和绝对子程序调用 短调用 指令 初识这两条指令 这两条指令的转移范围是绝对划定的2KB 用不好会出现错误 并且其编码也不好理解 见附录B 唯一的优点只是比 LJMP 和 LCALL 少一个字节 在存储器容量大 价格低的今天 其唯一的优点也没有意义 所以没有必要使用这两条指令 3 3 5位操作指令 在进行位操作时 位累加器C即为进位标志CY 位地址区域 1 片内RAM字节地址20H 2FH单元中连续的128个位 位地址为00H 7FH 2 部分SFR中的位 特别是累加器A和寄存器B中的位 与00H 7FH位一样 都可以作软件标志或位变量 3 3 5位操作指令 位地址的4种表示方式 1 直接位地址 00H FFH 如18H 2 字节地址带位号 如20H 0 表示20H单元的第0位 3 特殊功能寄存器名带位号 如P2 3 表示P2口的第3位 4 位符号地址 可以是特殊功能寄存器位名 也可以是用位地址符号命令 BIT 定义的位符号 如flag flag应在这之前定义过 如 flagBIT05H 3 3 5位操作指令 例如 用上述4种方式都可以表示PSW D0H 中的第2位 分别为 D2H D0H 2 PSW 2 OV 位操作指令共有17条 可以将其分成 位数据传送指令 位逻辑操作指令 位控制转移指令三组进行讨论 3 3 5位操作指令 一 位传送指令MOVC bit bit CMOVbit C C bit例3 16编写程序 把片内RAM中07H位的数值 传送到ACC 0位 程序段如下 MOVC 07HMOVACC 0 C注意 位之间不能够直接传送 必须借助于C 3 3 5位操作指令 二 位逻辑操作指令位逻辑操作指令包括位清0 位置1 位取反 位与 位或 共10条指令 1 位清0指令CLRC 0 CCLRbit 0 bit2 位置1指令SETBC 1 CSETBbit 1 bit 3 3 5位操作指令 3 位取反指令CPLC C CCPLbit bit bit4 位与指令ANLC bit C bit CANLC bit C bit C5 位或指令ORLC bit C bit CORLC bit C bit C 3 3 5位操作指令 三 位转移指令位转移指令是判断C或bit为条件的转移指令 共5条指令 1 以C为条件的转移指令JCrel 若 C 1 则 PC rel PC 否则顺序向下执行JNCrel 若 C 0 则 PC rel PC 否则顺序向下执行 3 3 5位操作指令 2 以bit为条件的转移指令JBbit rel 若 bit 1 则 PC rel PC 否则顺序向下执行JNBbit rel 若 bit 0 则 PC rel PC 否则顺序向下执行JBCbit rel 若 bit 1 则 PC rel PC 且0 bit 否则顺序向下执行 3 3 5位操作指令 例3 17编写程序 利用位操作指令 实现下图所示的硬件逻辑电路功能 程序段如下 MOVC P1 1ORLC P1 2CPLCANLC P1 0CPLCMOV0F0H C 3 3 5位操作指令 MOV0F0H C C 0F0H位MOVC P1 3 P1 3 CANLC P1 4 C P1 4 CCPLC ORLC 0F0H C 0F0H CMOVP1 5 C C P1 5 3 4MCS 51单片机伪指令 伪指令的功能 在汇编程序中 用于指示汇编程序如何对源程序进行汇编 对伪指令的处理 不同于指令 在汇编时并不翻译成机器代码 只是在汇编过程进行相应的控制和说明 伪指令的具体作用 通常在汇编程序中用于定义数据 分配存储空间 控制程序的输入 输出等 在MCS 51系统中 常用的伪指令有以下7条 3 4MCS 51单片机伪指令 一 ORG伪指令ORG伪指令称为起始汇编伪指令 常用于汇编语言某程序段的开始或某个数据块的开始 一般格式为 标号 ORG16位地址其标号为可选项 例如 ORG0040HMAIN MOVSP 0DFHMOV30H 00H 3 4MCS 51单片机伪指令 二 END伪指令END伪指令称为结束汇编伪指令 一般格式为 END三 EQU伪指令EQU伪指令称为赋值伪指令 一般格式为符号名EQU项 常数 常数表达式 字符串或地址标号 EQU的功能是将右边的项赋值给左边 3 4MCS 51单片机伪指令 四 DATA伪指令DATA伪指令称为数据地址赋值伪指令 其一般格式为 符号名DATA常数或常数表达式DATA的功能也是将右边的项赋值给左边 该伪指令是用于定义片内数据区变量 与DATA类似的还有一条伪指令XDATA 用于定义片外数据区变量 3 4MCS 51单片机伪指令 五 BIT伪指令BIT伪指令称为位地址符号伪指令 其格式为 符号名BIT位地址BIT伪指令的功能是把右边的地址赋给左边的符号名 位地址可以是前面所述的4种形式中的任一种 例如 FLAGRUNBIT00HFLAGMUSBIT01HFLAGALARBITP1 7 3 4MCS 51单片机伪指令 六 DB伪指令BD伪指令称为定义字节伪指令 其格式为 标号 DB项 字节数据 字节数表或字符 字符串 它的功能是从指定单元开始定义 存储 若干个字节的数据或字符 字符串 字符或字符串需要用引号 单引号或双引号均可 括起来 即用ASCII码表示 例如 TABLE DB32 24H B abcd 3 4MCS 51单片机伪指令 七 DW伪指令BW伪指令称为定义字伪指令 其格式为 标号 DW字数据或字数据表BW伪指令的功能是从指定单元开始定义 存储 若干个字数据 每一个数据都占2个字节 而用DB伪指令定义的数据只占一个字节 其中标号是可选的 例如 ORG1000HTABLE2 DW32 24H 1234H注意 高字节存放在前 低字节存放在后 3 5汇编语言程序设计举例 主要内容3 5 1简单程序设计3 5 2分支程序设计3 5 3循环程序设计3 5 4子程序设计 3 5 1简单程序设计 简单程序 程序的简单和复杂是相对而言的 这里所说的简单程序 是指顺序执行的程序 简单程序的执行情况 简单程序从第一条指令开始 依次执行每一条指令 直到程序执行完毕 之间没有任何转移和子程序调用指令 整个程序只有一个入口和一个出口 简单程序是复杂程序的基础 3 5 1简单程序设计 一 数据拆分例3 19片内RAM的30H单元内存放着一压缩的BCD码 编写程序 将其拆开并转换成两个ASCII码 分别存入31H和32H单元中 高位在31H中 根据数字0 9的ASCII码为30H 39H 因此 将30H中的两个BCD码拆开后 分别加上30H即可 相应程序段如下 3 5 1简单程序设计 MOVR0 30H R0指向30H单元MOVA R0 取原BCD码数据PUSHACC 进栈暂存SWAPA 高低4位数交换ANLA 0FH 截取高位数ORLA 30H 高位转换成ASCIIINCR0 R0指向31H单元MOV R0 A 保存高位ASCII 3 5 1简单程序设计 POPACC 原BCD码出栈ANLA 0FHORLA 30H 低位转换成ASCIIINCR0 R0指向32H单元MOV R0 A 保存低位ASCII码SJMP CPU停留于此处 3 5 1简单程序设计 二 数制转换例3 20片内RAM的30H单元内存放着一8位二进制数 编写程序 将其转换成压缩的BCD码 分别存入30H和31H单元中 高位在30H中 其方法是用除法实现 原数除以10 其余数为个位数 其余数再除以10 其商为百位数 余为十位数 对应程序段如下 3 5 1简单程序设计 MOVA 30H 取数据MOVB 10DIVAB 除后个位在B 百十位在AMOV31H B 个位存31H低4位MOVB 10DIVAB 除后十位在B 百位在AMOV30H A 保存百位MOVA B 十位数送ASWAPA 十位数被交换到高4位ORL31H A 十位数存于31H高4位SJMP 3 5 2分支程序设计 分支程序 程序根据不同的条件 转向不同的处理程序 这种结构的程序称为分支程序 实现分支程序的方法 借助于条件转移指令 比较转移指令和位转移指令 可以实现程序的分支处理 在汇编语言程序中 分支结构是比较麻烦的 初学时应特别小心 3 5 2分支程序设计 一 一般分支程序例3 21片内RAM的30H 31H单元存放着两个无符号数 编写程序比较其大小 将其较大者存于30H中 较小者存于31H单元中 用减法判断 两个数相减后 通过借位标志位CY来判断 程序段如下 3 5 2分支程序设计 MOVA 30HCLRCSUBBA 31HJNCL1 30H 31H 转MOVA 30H 30H 小两数交换XCHA 31HMOV30H AL1 SJMP 3 5 2分支程序设计 例3 22片内RAM的30H单元内存放着一有符号二进制数变量X 其函数Y与变量X的关系为 X 5X 20Y 020 X 10 5X 10编写程序 根据变量值 将其对应的函数值送入31H中 这是一个三分支的条件转移程序 可以使用CJNE JC JNC等指令进行判断 程序流程图如图3 6所示 程序段如下 3 5 2分支程序设计 3 5 2分支程序设计 MOVA 30HCJNEA 10 L1L1 JNCL2 X 10转L2MOV31H 0FBH X 10 Y 5SJMPL4L2 X 10ADDA 5 先按X 20 Y X 5MOV31H ACJNEA 26 L3L3 JNCL4 X 20 转MOV31H 0 20 X 10 Y 0L4 SJMP 3 5 3循环程序设计 循环程序一般由以下几个部分组成 1 循环初始化部分 用于对循环变量 其它变量和常量赋初值 做好循环前的准备工作 2 循环体部分 这一部分由重复执行部分和循环控制部分组成 3 循环结束部分 这一部分用于存放循环结果 恢复所占用寄存器或内存的数据等 循环程序的关键是对循环变量的修改和控制 特别是循环次数的控制 3 5 3循环程序设计 一 单层循环程序例3 23在片内RAM的30H 3FH单元 存放着16个无符号字节数据 编写程序 计算这16个数的和 16个字节数的和不会超过两个字节 将和存于40H 41H中 高字节在40H中 用R0作取加数指针 用DJNZ和R7控制循环 流程图如图3 7所示 程序段如下 3 5 3循

温馨提示

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

评论

0/150

提交评论