第3章__MCS-51系列单片机指令系统.ppt_第1页
第3章__MCS-51系列单片机指令系统.ppt_第2页
第3章__MCS-51系列单片机指令系统.ppt_第3页
第3章__MCS-51系列单片机指令系统.ppt_第4页
第3章__MCS-51系列单片机指令系统.ppt_第5页
已阅读5页,还剩117页未读 继续免费阅读

下载本文档

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

文档简介

第3章MCS 51系列单片机指令系统 本章重点 掌握汇编指令的基本格式 掌握51系列单片机的寻址方式 掌握51系列单片机的各指令 能阅读程序并能编写简单程序 3 1指令系统简介3 2寻址方式3 3MCS 51系列单片机指令系统3 4汇编语言程序设计本章小结 基本概念计算机只能识别二进制码组成的机器码 由机器码组成的语言称机器语言 将代表实际操作功能的二进制码用各种助记符来表示 用助记符表示的语言称为汇编语言 一台计算机所能执行的全部指令的集合称为这个CPU的指令系统 不同型号的计算机 其指令系统是不同的 3 1指令系统简介 汇编语言指令格式 标号 操作码 第一操作数 第二操作数 第三操作数 注释 说明 带有方括号 的部分代表可选项 例 LOOP MOVA 31H 将立即数31H送累加器A中1 标号 指令的符号地址 即该指令机器代码存储单元的地址 通常在子程序入口或转移指令的目标地址处才赋予标号 2 操作码 指明指令功能 指令的核心 不可缺少 3 操作数 指令操作对象 有的指令可以不需要操作数 可以是数据 地址 寄存器名及约定符号 4 注释行 说明指令在程序中的作用 可有可无 操作码和操作数是指令主体 操作码 第一操作数 第二操作数 标号 注释 3 1 1指令的基本格式 机器语言指令格式机器语言指令是一种二进制代码 有单字节 双字节 三字节三种指令格式 汇编语言指令中操作码和操作数是指令主体 称为指令可执行部分 指令表中可查出对应指令代码 1 单字节指令格式 操作码 例 汇编语言指令INCA对应的机器语言是 00000100该指令功能是对累加器内容加1 操作的对象和内容明确 本身隐含了操作数 2 双字节指令格式 操作码操作数 例 汇编语言指令MOVA 74H对应的机器语言是 0111010001110100第一个字节是操作码 代表将下一个机器码作为数据送给累加器A 第二个字节是操作数 3 三字节指令格式 操作码第一操作数第二操作数 例 汇编语言指令MOV30H 7AH对应的机器语言是 011101010011000001010000第一个是操作码 代表将一个操作数送至某存储单元 第二个是操作数的地址 第三个是操作数 3 1 2单片机指令分类 MCS51指令系统共有111条指令 根据指令的操作功能 分为五大类 数据传送指令 是将数据从一个 块 存储地方传送到另一个 块 地方的传送 原存储地方数据不变 共29条 例如常用的MOV指令 算术运算指令 是对数据进行加法 减法 乘法 除法 加1 减1以及十进制调整指令 共24条 例如ADD指令 逻辑运算指令 是对数据进行与 或 异或 非及移位操作 共24条 控制转移指令 是实现程序的转移或子程序的调用 共22条 位操作指令 是对数据的某一位进行操作 包括置1 清零 位传送及位的逻辑运算 共22条 判断下列常用指令属于哪一类指令 MOV move传送XCH exchange交换ANL andlogic与逻辑运算XRL exclusiveor异或运算RR rotateright右循环MUL Multiply乘法SJMP shortjump短转移RET return子程序返回 指令中 一般不直接给出参与传送或运算的操作数本身 而是给出操作数所在的寄存器 存储单元或I O口地址 CPU根据指令给出的地址信息求出操作数的地址 按照求出的地址对操作数进行存取操作 寻址就是寻找操作数的地址 寻找操作数地址的方式 称为操作数地址的寻址方式 简称寻址方式 3 2寻址方式 3 2 1立即寻址方式 立即寻址就是在指令中直接给出操作数的寻址方式 指令中给出的操作数也称立即数 立即数前加 号标志 以区别直接寻址中的直接地址 16位立即数传送指令 MOVDPTR datal6 其中 data16是一个16位立即数 例如 指令MOVDPTR 2030H 将16位立即数2030H传送给16位寄存器数据指针DPTR 例 MOVA 7AH上述指令将数7AH送到A中执行后A 7AH 过程如右图 6DH A 7AH 立即数 3 2 2直接寻址方式 直接寻址方式就是在指令中直接给出操作数所在存储单元的地址 此时 指令中操作数部分是操作数所在地址 例如指令 MOVA 30H 其功能是将片内RAM中30H单元的内容传送至累加器A 直接寻址方式的寻址范围是内部RAM 具体包括 片内RAM的低128个单元 在指令中以直接地址给出 特殊功能寄存器 SFR 既可使用它们的地址 也可使用它们的名字 例如指令 MOVA P1 是把SFR中P1口内容送到A 它又可以写成 MOVA 90H 其中90H是P1口的地址 直接寻址方式是访问特殊功能寄存器的唯一方法 直接寻址方式 例 设内RAM7AH单元中的内容为6DH 则执行指令MOVA 7AH后 A中的内容为6DH 即A 6DH 43H 14H 7BH 7AH A 6DH 6DH 注意 7AH单元中的数据没有变化 3 2 3寄存器寻址方式 寄存器寻址就是操作数存放在寄存器中 指令中指定的寄存器的内容就是操作数 在寄存器寻址方式中以符号名称来表示寄存器 例如指令 MOVA R0 其功能是把寄存器R0的内容传送至累加器A中 寄存器寻址方式的寻址范围包括 通用工作寄存器 有4组共32个通用工作寄存器 每组名称都为R0 R7 但是寄存器寻址只能使用当前寄存器组 部分特殊功能寄存器 累加器A 寄存器B DPTR寄存器 例 如果R1 56H 则执行指令MOVA R1后 累加器A 56H 93H 14H 6BH A3H R4 R3 R2 R1 A 56H 56H R1中的内容没有变 3 2 4寄存器间接寻址方式 寄存器间接寻址是把指定寄存器的内容作为操作数地址 该地址所指定的单元内容作为操作数 为了区分寄存器寻址和寄存器间接寻址 在寄存器间接寻址中 所用到的寄存器的前面要加间接寻址符 通过间接寻址寄存器R0 R1和数据指针DPTR可以作为间接寻址寄存器 寻址范围 通过R0 R1可寻址片内低128B单元内容或者是片外RAM256B的内容 通过数据指针DPTR 可寻址外部数据存储器64KB空间 93H 例 如果R0 30H 30H B3H 则执行指令MOVA R0后 A B3H 指令MOVA R0的工作过程示意点击页面 14H B3H 30H 31H 30H R0 A 变址寻址是以DPTR或者PC作为基址寄存器 其内容为基地址 以累加器A作为变址寄存器 其内容为变址 并将两个寄存器内容也就是基址和变址相加 形成16位操作数地址 然后在程序存储器中找到该地址所对应的单元 其内容即为操作数 为访问程序存储器中的数据表格设计的 例 如果A 30H DPTR 2000H 2030H 93H 执行指令MOVCA A DPTR是将累加器A中的内容与DPTR中的内容相加 其和作为程序存储器的地址 找到程序存储器中该地址所对应的单元 将该单元中的内容送累加器A中 3 2 5变址寻址方式 30H 00H 00H 20 上例指令MOVCA A DPTR的工作过程点击页面 20H 30H DPH DPL A 2030H 3DH B5H 2031H 202FH 20H 00H 93H 93H 93H A ROM 3 2 6相对寻址方式 相对寻址方式是将当前的PC值加上指令中规定的偏移量rel而形成程序转移的目的地址 这里所说的PC的当前值是执行完本指令后的PC值 PC相对偏移量rel用补码表示 其范围为 128 127 相对寻址只出现在相对转移指令中 用于程序存储器 以修正PC的方式来控制程序的转移目的 一般将相对转移指令操作码所在地址称为源地址 转移后的地址称为目的地址 于是有 目的地址 源地址 相对转移指令本身字节数 rel 3 2 6相对寻址方式 例 如果当前PC 2030H 则执行双字节指令SJMP0A3H后 PC 2030H 2 0A3H 补码 其值是负的 1FD5H即程序转到1FD5H处取指 执行 注意 在相对寻址方式时 在rel为正数和负数两种不同情况下 目的地址PC的求法可以用下列不同的公式求 当rel为正数时 PC目的 PC当前 当前指令字节数 rel当rel为负数时 PC目的 PC当前 当前指令字节数 rel 100H在人工汇编时 往往知道PC目的和PC当前 需要求rel 如果PC目的 PC当前 采用第一个公式 如果PC目的 PC当前 采用第二个公式 3 2 7位寻址方式 8051单片机可以对数据存储器中的某一位进行单独操作 位寻址就是对内部RAM和特殊功能寄存器的可寻址位的内容进行操作的寻址方式 位寻址指令给的是位地址 即片内RAM某一单元的一位 单片机片内RAM进行位寻址的两个区域 具体如下 内部RAM中的位寻址区 该区共有16个单元 单元地址是20H 2FH 一共有128位 位地址为00 7FH 特殊功能寄存器的可操作位 有11个单元地址能被8整除的寄存器 它们都可以进行位寻址 实际可寻址位为83个 可寻址位在指令中的表示方式 直接使用位地址 例 PSW寄存器的第5位可表示为D5H 20H单元的第7位可表示为07H 用位名称表示 例 PSW寄存器的第5位可表示为F0 单元地址加位号表示 例 PSW寄存器的第5位可表示为D0H 5 20H单元的第7位可表示为20H 7 可以用寄存器名称加位号表示 例 PSW寄存器的第5位可表示为PSW 5 位寻址方式 例 如果A 74H 则执行指令SETBACC 3位置位指令后 A 7CH 见下图 执行前A 执行后A 寻址空间表 寻址方式中常用符号注释 Rn n 0 7 当前选中的工作寄存器组R0 R7 它在片内数据存储器中的地址由PSW中的RSl和RS0确定 可以是00H 07H 第0组 08H 0FH 第1组 10H 17H 第2组 或18H 1FH 第3组 Ri i 0 1 当前选中的工作寄存器组中可以用于寄存器间接寻址的的两个工作寄存器R0 R1 它在片内数据存储器中的地址由RSl RS0确定 分别有01H 02H 08H 09H 10H 11H和18H 19H data 8位立即数 即包含在指令中的8位操作数 data16 16位立即数 即包含在指令中的16位操作数 direct 8位片内RAM单元 包括SFR 的直接地址 addr11 11位目的地址 用于ACALL和AJMP指令中 addr16 16位目的地址 用于LCALL和LJMP指令中 rel 补码形式的8位地址偏移量 以下条指令第一字节地址为基值 地址偏移量在 128 127范围内 bit 片内RAM或SFR的直接寻址位地址 间接寻址方式中 表示间接寻址的符号 位操作指令中 表示对该位先取反再参与操作 但不影响该位原值 指令中数据的传送方向 将箭头右边的内容送入箭头左边的单元 3 3MCS 51系列单片机指令系统3 3 1数据传送指令1 内部RAM中一般数据传送指令这类数据传送指令的格式为 MOV目的操作数 源操作数该指令的功能将源操作数传送到目的操作数中 而源操作数中的数据保持不变 即 目的地址 源地址 或立即数数据传送指令对PSW一般没有影响 但如果目的单元为A 则影响PSW中的P标志位 1 以累加器 为目的的数据传送指令1 MOVA Rn A Rn n 0 72 MOVA Ri A Ri i 0 13 MOVA direct A direct 4 MOVA data A data 93H 1 指令 MOVA Rn A Rn n 0 7功能 该指令是将寄存器Rn中的内容送到累加器 中 Rn中的内容保持不变 例 如果当前R0 56H A 93H 则执行指令 MOVA R0结果 A 56H 14H 6BH A3H 56H R3 R2 R1 R0 A 56H 93H 2 指令 MOVA Ri A Ri i 0 1功能 该指令是将寄存器Ri中的内容作为数据存储器的地址 将该地址对应单元中的内容送到累加器 中 该单元及Ri中的内容保持不变 例 如果当前R0 30H 30H 0B3H A 93H 执行指令 MOVA R0结果 B3 14H B3H 30H 31H 30H R0 A B3H 43H 3 指令 MOVA direct A direct 功能 该指令是将数据存储器地址为direct单元中的内容送到累加器 中 该单元中的内容保持不变 例 如果当前 40H 6DH A 43H 则执行指令 MOVA 40H结果 6D 14H 6DH 41H 40H A 6DH 43H 4 指令 MOVA data A data功能 该指令是将立即数data送到累加器 中 注意 与MOVA direct的形式与功能的区别 例 如果当前A 43H 则执行指令 MOVA 40H结果 A 40H 14H 6DH 41H 40H A 40H 立即数 2 以寄存器Rn为目的的数据传送指令1 MOVRn A Rn A n 0 72 MOVRn direct Rn direct 3 MOVRn data Rn data A3H 93H 1 指令 MOVRn A Rn A n 0 7功能 该指令是将累加器 中的内容送到寄存器Rn中 中的内容保持不变 例 如果当前R1 A3H A 93H 则执行指令 MOVR1 A结果 R1 93 14H 6BH 56H R3 R2 R1 R0 A 93H 6DH B3H 2 指令 MOVRn direct Rn direct 功能 该指令是将数据存储器地址为direct单元中的内容送到Rn中 该单元中的内容保持不变 例 如果当前 41H 73H R1 6DH 则执行指令 MOVR1 41H结果 R1 73 14H 6DH 78H R2 R1 R0 42H 73H 41H A3H 40H 73H 6DH B3H 3 指令 MOVRn data Rn data功能 该指令是将立即数data送到寄存器Rn中 例 如果当前 41H 73H R1 6DH 则执行指令 MOVR1 40H结果 R1 40 14H 6DH 78H R2 R1 R0 42H 40H 41H A3H 40H 73H 立即数 3 以直接地址为目的的数据传送指令1 MOVdirect A direct A2 MOVdirect Rn direct Rn3 MOVdirect Ri direct Ri 4 MOVdirect data direct data5 MOVdirect1 direct2 direct1 direct2 B3H 93H 1 指令 MOVdirect A direct A功能 该指令是将累加器 的内容送到地址为direct的数据存储器单元中 累加器 中的内容保持不变 例 如果当前内存情况如图所示 执行指令 MOV30H A结果 30H 93H 14H 30H 31H 30H R0 A 93H B3H 2 指令 MOVdirect Rn direct Rn n 0 7功能 该指令是将寄存器Rn的内容送到地址为direct的数据存储器单元中 寄存器Rn中的内容保持不变 例 如果当前内存情况如图所示 执行指令 MOV30H R0结果 30H 30H 14H 30H 31H 30H R0 30H 3 指令 MOVdirect Ri direct Ri i 0 1功能 该指令是将寄存器Ri的内容作为地址 该地址所对应内存单元中的数据送到地址为direct的内存单元中 例 如果当前内存情况如图所示 执行指令 MOV31H R0结果 31H 0B3H 14H B3H 31H 30H R0 30H B3H 73H B3H 4 指令 MOVdirect data direct data功能 该指令是将立即数data送到地址为direct的内存单元中 例 如果当前 41H 73H 则执行指令 MOV41H 40H结果 41H 40 42H 40H 41H A3H 40H 立即数 5 指令 MOVdirect1 direct2 direct1 direct2 功能 该指令是将内存单元地址为direct2的单元中的数据送到地址为direct1的内存单元中 例 如果当前内存情况如图所示 执行指令 MOV31H 30H结果 31H 0B3H 14H B3H 31H 30H R0 30H B3H 4 以寄存器间址 Ri为目的的数据传送指令1 MOV Ri A Ri A i 0 12 MOV Ri direct Ri direct 3 MOV Ri data Ri data B3H 93H 1 指令 MOV Ri A Ri A i 0 功能 该指令是将累加器 的内容送到以寄存器 i中的数据作为地址对应的数据存储器单元中 累加器 中的内容保持不变 例 如果当前R0 30H 30H 0B3H A 93H 则执行指令 MOV R0 A结果 R0 93H即 30H 93H而R0 30H 14H 30H 31H 30H R0 A 93H B3H 2 指令 MOV Ri direct Ri direct 功能 该指令是将数据存储器地址为direct单元中的内容送到以寄存器 i中的数据作为地址对应的数据存储器单元中 原单元中的内容保持不变 例 如果当前R0 30H 30H 0B3H 31H 14H 则执行指令 MOV R0 31H结果 R0 14H即 30H 14H而R0 30H 14H 30H 31H 30H R0 14H 73H B3H 3 指令 MOV Ri data Ri data功能 该指令是将立即数data送到以寄存器 i中的数据作为地址对应的数据存储器单元中 例 如果当前R1 41H 41H 73H 则执行指令 MOV R1 40H结果 R1 40 即 41H 40H而 R1 41H 41H 78H R1 R0 42H 40H 41H A3H 40H 立即数 2 16位数据传送指令MOVDPTR data16 DPTR data16功能说明 该指令是将16位数据送到数据指针DPTR中 其中数据的高8位送到DPH中 而数据的低8位送到DPL中 例 如果当前DPTR 2000H 执行指令 MOVDPTR 236BH结果 DPTR 236BH即 DPH 23H DPL 6BH 3 累加器与外部数据存储器的数据传送指令 1 以Ri为间址寄存器1 MOVXA Ri A Ri 外RAM2 MOVX Ri A Ri 外RAM A说明 第一条指令是将Ri中的8位数据作为低8位地址所对应的外RAM单元中的内容送到累加器A中 第二条指令是将累加器A中的内容送到Ri中的8位数据作为低8位地址所对应的外RAM单元中 由于外RAM一般由16位地址构成 因此应用上述两条指令时 需要先将高8位地址通过P2口送出 然后执行上述两条指令 Ri中的数据作为低8位地址 通过P0口送出 2 以DPTR为间址寄存器1 MOVXA DPTR A DPTR 外RAM2 MOVX DPTR A DPTR 外RAM A说明 第一条指令是将DPTR中的16位数据作为地址 其所对应的外RAM单元中的内容送到累加器A中 第二条指令是将累加器A中的内容送到DPTR中的16位数据作为地址所对应的外RAM单元中 DPTR提供的是16位数据 其中高8位通过P2口送出 低8位通过P0口送出 例 如果要将内存30H单元中的数据送到外RAM3000单元中 请编写指令 MOVP2 30HMOVA 30HMOVR0 00HMOVX R0 A或者MOVA 30HMOVDPTR 3000HMOVX DPTR A 例 如果要将外RAM2340H单元中数据读到内存50H单元中 请编写指令 MOVP2 23HMOVR0 40HMOVXA R0MOV50H A或者MOVDPTR 2340HMOVXA DPTRMOV50H A 4 访问程序存储器指令 1 以DPTR作为基址寄存器MOVCA A DPTR A A DPTR ROM 2 以PC作为基址寄存器MOVXA A PC PC PC 1 A A PC ROM说明 上述两条指令是将A中的8位无符号数与DPTR或PC中的16位无符号数相加形成16位地址 将该地址单元中的数据读到累加器A中 如果访问外部程序存储器 具体视EA及地址大小而定 则高8位地址通过P2口送出 低8位地址通过P0口送出 例 执行下面程序 则A为多少 ORG2000H 伪指令 定义下列程序从2000H开始存放MOVA 02HMOVDPTR DATAMOVCA A DPTRRETDATA 11H 12H 13H由于在程序第一条赋给A的值是02H 第二条指令赋给DPTR的值是2007H 所以形成的地址是2009H 因此结果A 13H 例 执行下面程序 则A为多少 ORG2000H 伪指令 定义下列程序从2000H开始存放MOVA 02HMOVCA A PCRETDATA 11H 12H 13H 14H 15H由于在程序第一条赋给A的值是02H 第二条指令PC值为2002H 加1后PC为2003H再加A中的值02H 所以形成的地址是2005H 因此结果A 12H 5 堆栈操作指令 1 入栈指令PUSHdirect SP SP 1 SP direct 2 出栈指令POPdirect direct SP SP SP 1说明 堆栈指令主要用于现场保护 使用时必须遵循先进后出原则 8CH 3AH 60H 58H 例 当前数据状态如图所示 点击页面 可以演示执行指令PUSH时数据变化过程 MOVSP 70HPUSHAPUSHR0 33H 45H 3AH 58H R0 A 71H 73H 07H SP 70H 71H 72H 70H 72H 3AH 8CH 58H 33H 60H 例 当前数据状态如图所示 点击页面 可以演示执行指令POP时数据变化过程 MOVSP 73HPOPAPOPR0 33H 45H 8CH R0 A 71H 73H 07H SP 73H 72H 71H 70H 72H 注意 堆栈指令用于现场保护时 要成对出现 并遵循先进后出的规则 例 下列就是对A R0进行现场保护的中断服务子程序 PUSHAPUSHR0 POPR0POPARETI 成对 呈嵌套 6 数据交换指令 1 字节交换指令1 XCHA Rn ARn2 XCHA direct A direct 3 XCHA Ri A Ri 例 当前数据状态如图所示 点击页面 可以演示执行指令XCH时数据变化过程 1 XCHA R02 XCHA 40H3 XCHA R1 R0 A 3AH 58H 40H A 5BH 3AH 43H 5BH XCHA R0示意图 XCHA 40H示意图 R1 3DH 30H 30H A 7CH XCHA R1示意图 3DH BH 6 数据交换指令 2 半字节交换指令1 XCHDA Ri A3 0 Ri 3 02 SWAPA A7 4A3 0 XCHDA R0示意图 SWAPA示意图 A 7H 40H 6 4 BH R0 40H A B 1101 0101 7 4 3 0 3 3 2算术运算指令1 加法指令注意 加法指令将影响PSW中的Cy AC OV P标志位 1 不带进位位加法指令1 ADDA Rn A A Rn2 ADDA Rn A A Ri 3 ADDA direct A A direct 4 ADDA data A A data 例 设当前A 7CH R0 30H R1 0D3H 30H 5BH 分别执行下列指令后 累加器A 标志位Cy AC OV P分别为多少 1 ADDA R12 ADDA R03 ADDA 30H4 ADDA 30H解 1 A 7CH 0D3H 4FH 进位 Cy 1 AC 0 OV 0 P 1 2 A 7CH 5BH 0D7H Cy 0 AC 1 OV 1 P 0 3 A 7CH 5BH 0D7H Cy 0 AC 1 OV 1 P 0 4 A 7CH 30H 0ACH Cy 0 AC 0 OV 1 P 0 2 带进位位加法指令1 ADDCA Rn A A Rn Cy2 ADDCA Rn A A Ri Cy3 ADDCA direct A A direct Cy4 ADDCA data A A data Cy注意 带进位位加法指令必须加上Cy 因此必须考虑在程序执行过程中Cy状态的变化情况 例 设当前A 7CH R0 30H R1 0D3H 30H 5BH Cy 1 执行下列程序后 累加器A 标志位Cy AC OV P为多少 ADDCA R1ADDCA R0ADDCA 30HADDCA 30H解 第一条指令 A 7CH 0D3H Cy 4FH 1 50H Cy 1第二条指令 A 50H 5BH Cy 0ABH 1 0ACH Cy 0第三条指令 A 0ACH 5BH Cy 07H 0 07H Cy 1第四条指令 A 07H 30H Cy 37H 1 38H所以结果 A 38H Cy 0 AC 0 OV 0 P 1 2 减法指令注意 减法指令影响标志位Cy AC OV P 减法指令只有带进位标志位的减法指令 1 SUBBA Rn A A Rn Cy2 SUBBA Rn A A Ri Cy3 SUBBA direct A A direct Cy4 SUBBA data A A data Cy 例 设当前A 7CH R0 30H R1 0D3H 30H 5BH Cy 1 执行下列程序后 累加器A 标志位Cy AC OV P为多少 SUBBA R1 A 7CH 0D3H Cy 0A9H 1 0A8H Cy 1SUBBA R0 A 0A8H 5BH Cy 4DH 1 4CH Cy 0SUBBA 30H A 4CH 5BH Cy 0F1H 0 0F1H Cy 1SUBBA 73H A 0F1H 73H Cy 7EH 1 7DH解 所以结果 A 7DH Cy 0 AC 1 OV 1 P 0 注意 读结果采用倒读法 3 乘法指令注意 乘法指令影响标志位OV P 当结果B中的数据不为0时 OV 1 否则OV 0 MULAB BA A B 例 设当前A 03H B 05H 则执行指令MULAB后 A B OV P分别为多少 解 所以 A 0FH B 00H OV 0 P 0 例 设当前A 33H B 37H 则执行指令MULAB后 A B OV P分别为多少 解 所以 A 0F5H B 0AH OV 1 P 0 4 除法指令注意 除法指令影响标志位OV P 当除数B中的数据为0时 OV 1 否则OV 0 DIVAB A A B 商 B A B 余数 例 设当前A 33H B 05H 则执行指令DIVAB后 A B OV P分别为多少 解 所以 A 0AH B 01H OV 0 P 0 5 加1 减1指令注意 除 INCA 和 DECA 两条指令影响P标志位外 其余均不影响标志位 1 加1指令1 INCA A A 12 INCRn Rn Rn 13 INC Ri Ri Ri 14 INCdirect direct direct 15 INCDPTR DPTR DPTR 1 2 减1指令1 DECA A A 12 DECRn Rn Rn 13 DEC Ri Ri Ri 14 DECdirect direct direct 1注意 对于数据指针DPTR 只有加1指令 没有减1指令 6 BCD码调整指令DAA说明 该指令用于BCD码加法运算后进行调整 紧跟在ADD和ADDC指令后面 例 设当前A 35H 执行下列程序 A MOVR0 48H R0 48HADDA R0 A 35H 48H 7DHDAA A 7DH 06H 83H 调整 所以 A 83H 3 3 3逻辑运算指令1 逻辑与运算指令1 ANLA Rn A A Rn2 ANLA Rn A A Ri 3 ANLA direct A A direct 4 ANLA data A A data5 ANLdirect A direct direct A6 ANLdirect data direct direct data注意 逻辑与运算要逐位相与 遵守 有0为0 全1为1 规则 例 执行下列程序后 A MOVA 7BH A 7BHMOVR0 40H R0 40HMOV40H 0D9H 40H 0D9HANLA R0 A 01111011B 11011001B 01011001BANLA 6FH A 01011001B 01101111B 01001001BANLA R0 A 01001001B 01000000B 01000000B所以 A 40H 2 逻辑或运算指令1 ORLA Rn A A Rn2 ORLA Rn A A Ri 3 ORLA direct A A direct 4 ORLA data A A data5 ORLdirect A direct direct A6 ORLdirect data direct direct data注意 逻辑与运算要逐位相或 遵守 有1为1 全0为0 规则 例 执行下列程序后 A 40H MOVA 7BH A 7BHMOVR0 40H R0 40HMOV40H 0D9H 40H 0D9HORLA R0 A 01111011B 01000000B 01111011BORLA 63H A 01111011B 01100011B 01111011BORL40H A 40H 11011001B 01111011B 11111011B所以 A 7BH 40H 0FBH 3 逻辑异或运算指令1 XRLA Rn A A Rn2 XRLA Rn A A Ri 3 XRLA direct A A direct 4 XRLA data A A data5 XRLdirect A direct direct A6 XRLdirect data direct direct data注意 逻辑与运算要逐位相异或 遵守 相同为0 不同为1 规则 4 清零和取反指令1 对累加器A清零指令CLRA A 00H2 对累加器A取反指令CPLA A A注意 对累加器A取反要逐位取反 1 取反为 0 0 取反为 1 5 循环移位指令1 循环左移 RLA2 带Cy循环左移 RLCA3 循环右移 RRA4 带Cy循环右移 RRCA 3 3 4转移与调用返回指令1 子程序调用和返回指令1 绝对调用指令ACALLaddr11 PC PC 2 SP SP 1 SP PC7 0 SP SP 1 SP PC15 8 PC10 0 addr11 PC15 11保持不变说明 本指令的操作数为8位操作数 作为addr11中的低8位 而addr11中的高3位隐含在操作码中 注意 本指令只能在2KB范围内调用 在ROM允许情况下 建议不要使用本指令 2 长调用指令LCALLaddr16 PC PC 3 SP SP 1 SP PC7 0 SP SP 1 SP PC15 8 PC addr16说明 本指令可以在整个64KBROM范围内调用 使用灵活方便 不会出错 在ROM允许情况下 建议使用本指令 60H 8CH 20H 例 当前PC 2000H 执行指令LCALL3000H 数据状态变化如图所示 点击页面可以演示 LCALL3000H 70H 33H 45H 00H PC 71H 73H SP 72H 71H 70H 72H 03H 03H 20 3000H 3 子程序返回指令RET PC15 8 SP SP SP 1 PC7 0 SP SP SP 1说明 本指令作为子程序最后一条指令 其目的在子程序完成后能返回原程序断点处 与调用指令对应 4 中断返回指令RETI PC15 8 SP SP SP 1 PC7 0 SP SP SP 1说明 本指令作为中断服务程序的最后一条指令 其目的在处理完中断服务程序后返回原程序断点处 与中断响应对应 2 转移指令 1 无条件转移指令1 绝对转移指令AJMPaddr11 PC PC 2 PC10 0 addr11 PC15 11保持不变说明 本指令的操作数为8位操作数 作为addr11中的低8位 而addr11中的高3位隐含在操作码中 注意 本指令只能在2KB范围内转移 在ROM允许情况下 建议不要使用本指令 本指令与ACALLaddr11指令不同在于 它不保存当前PC值 因为转移不需要返回 2 长转移指令LJMPaddr16 PC PC 3 PC addr16说明 本指令可以在整个64KBROM范围内转移 使用灵活方便 不会出错 在ROM允许情况下 建议使用本指令 注意 本指令与LCALLaddr16不同之处 它不需要保存当前PC值 因为不需要返回 3 短转移指令SJMPrel PC PC 2 PC PC rel说明 rel为偏移量 是用补码表示的8位数 有正负之分 当为正数时 向下 高地址 转移 当rel为负数时 向上 低地址 转移 在当前指令的 126 129地址范围内转移 针对rel不同情况 正数或负数 可以采用下列公式 当rel为正数 80H 时 PC目的 PC原 2 rel当rel为负数 80H 时 PC目的 PC原 2 rel 100H 例 当前PC 2356H 执行SJMPrel后 1 如果PC为2347H 则rel为多少 2 如果PC为2379H 则rel为多少 解 1 因为PC目的 PC原 所以采用公式PC目的 PC原 2 rel 100Hrel PC目的 PC原 2 100H 2347H 100H 2356H 2 0EFH 2 因为PC目的 PC原 所以采用公式PC目的 PC原 2 relrel PC目的 PC原 2 2379H 2356H 2 021H 例 当前PC 2356H 执行SJMP0BCH后 1 SJMP0BCH 2 SJMP36H后 PC分别为多少 解 1 因为rel为负数 所以采用公式PC目的 PC原 2 rel 100H 2356H 2 0BCH 100H 2314H 2 因为rel为正数 所以采用公式PC目的 PC原 2 rel 2356H 2 36H 238EH 注意 使用SJMPrel指令 在人工汇编时在知道当前PC和目的PC后 求rel 对于偏移量的计算必须要求掌握 后面的条件转移指令均涉及到偏移量问题 在求rel时 是减2还是减3要根据指令的字节数而定 如果指令的字节数为2 则减2 如果指令的字节数为3 则减3 4 间接转移指令JMP A DPTR PC A DPTR说明 A中的值为无符号数 注意 此处 A DPTR不代表间址的概念 即不是这样功能 PC A DPTR 例 ORG2000HMOVA 20H A 20HMOVDPTR 3200H DPTR 3200HJMP A DPTR PC 3220H即执行JMP A DPTR后 将转到3220H处执行 注意 JMP A DPTR可以根据A中的值实现多分支选择转移 例 2 条件转移指令条件转移指令就是当条件满足时发生转移 如果条件不满足则执行下一条指令 1 判零转移指令JZrel 若A 0 则PC PC rel 2 若A 0 则PC PC 2说明 即A为零则转移 否则执行紧跟JZrel的下一条指令 JNZrel 若A 0 则PC PC rel 2 若A 0 则PC PC 2说明 即A不为零则转移 否则执行紧跟JNZrel的下一条指令 JNZrel的流程图 A 0 YES转移 NO往下执行 JZrel的流程图 A 0 YES转移 NO往下执行 例 阅读程序 结果R0 ORG2000HSTART MOVR0 00HMOVA 20HLOOP SUBBA 04HINCR0JNZLOOPRET结果 R0 08H 例 要求从内存30H开始寻找关键字0AAH 找到第一个0AAH后停止寻找 且将该地址存放在A中 试编程 ORG2000HSTART MOVR0 30HLOOP1 CLRCMOVA 0AAHSUBBA R0JZLOOP2INCR0SJMPLOOP1LOOP2 MOVA R0 2 判Cy转移指令JCrel 若Cy 1 则PC PC rel 2 若Cy 0 则PC PC 2JNCrel 若Cy 0 则PC PC rel 2 若Cy 1 则PC PC 2说明 上述两条指令的条件刚好相反 第一条指令是进位标志位Cy为1时转移 否则不转移 第二条指令是进位标志位Cy为0时转移 否则不转移 JNCrel的流程图 Cy 1 往下执行 Y JCrel的流程图 Cy 0 N Y N 转移 转移 往下执行 例 阅读程序 A B ORG2000HSTART MOVR0 00HMOVA 11HMOVB 05HLOOP1 SUBBA BJCLOOP2INCR0SJMPLOOP1LOOP2 ADDA BMOVB AMOVA R0结果 A 03H B 02H 本例的功能是什么 例 采用JNCrel指令 上例可以实现同样功能 ORG2000HSTART MOVR0 00HMOVA 11HMOVB 05HLOOP1 SUBBA BINCR0JNCLOOP1DECR0ADDA BMOVB AMOVA R0 上述两例就是一个除法程序 3 判位变量转移指令JBbit rel 若 bit 1 则PC PC rel 3 若 bit 0 则PC PC 3JNBbit rel 若 bit 0 则PC PC rel 3 若 bit 1 则PC PC 3说明 上述两条指令是根据位地址bit这位的1或0的情况来转移或不转移 第一条指令是当这位为1时转移 为0时不转移 执行下一条指令 第二条指令与第一条指令的条件刚好相反 JNBbit rel的流程图 bit 1 N Y JBbit rel的流程图 bit 0 N Y 转移 转移 往下执行 往下执行 例 如图为一个锅炉的简单控制图 编制控制程序 控制主程序ORG1000HST MOVA P0ST0 JBACC 0 LP0 高压ST1 JBACC 1 LP1 低压ST2 JBACC 2 LP2 高温ST3 JBACC 3 LP3 低温ST4 JBACC 4 LP4 高水位ST5 JBACC 5 LP5 低水位ST6 SJMPST 控制子程序ORG1020HLP0 SETBP1 0 开蒸汽阀SJMPST2LP1 CLRP1 0 关蒸汽阀SJMPST2LP2 CLRP1 1 关加热器SJMPST4LP3 SETBP1 1 开加热器SJMPST4LP4 CLRP1 2 关供水阀SJMPSTLP5 SETBP1 2 开供水阀SJMPST 4 判位变量并清零转移指令JBCbit rel 若 bit 1 则PC PC rel 3且bit 0 若 bit 0 则PC PC 3 bit 1 N Y bit 0 转移 往下执行 例 将前例中的JBbit rel指令改为JBCbit rel指令 ORG1000HST MOVA P0ST0 JBCACC 0 LP0 高压ST1 JBCACC 1 LP1 低压ST2 JBCACC 2 LP2 高温ST3 JBCACC 3 LP3 低温ST4 JBCACC 4 LP4 高水位ST5 JBCACC 5 LP5 低水位ST6 SJMPST ORG1020HLP0 SETBP1 0 开蒸汽阀SJMPST2LP1 CLRP1 0 关蒸汽阀SJMPST2LP2 CLRP1 1 关加热器SJMPST4LP3 SETBP1 1 开加热器SJMPST4LP4 CLRP1 2 关供水阀SJMPSTLP5 SETBP1 2 开供水阀SJMPST 5 比较转移指令CJNE第一操作数 第二操作数 rel具体指令格式为 CJNEA direct relCJNEA data relCJNERn data relCJNE Ri data rel说明 第一操作数与第二操作数比较 若二者相等 则不转移 若不等 则转移 且当第一操作数小于第二操作数时 对Cy置1 否则清零 例 判断内存30H单元中内容是否为AAH 若是则置40H单元为FFH 若

温馨提示

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

评论

0/150

提交评论