




已阅读5页,还剩123页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第二章 MCS 51单片机指令系统 2 1概述 2 2寻址方式 2 3数据传送指令 2 4算逻运算和移位指令 2 5控制转移和位操作指令 另补充 常用伪指令 P121页 2 1 MCS 51指令系统的概述 MCS 51共有111条指令 指令的长度和执行时间因不同的指令而各不相同 2 1 1指令格式2 1 2指令的三种表示形式2 1 3指令的字节数2 1 4指令的分类 2 1 1指令格式 指令格式 既指令的结构形式 操作码 操作数或操作数地址 由操作码和操作数 或操作数地址 构成指令的结构 举例 MOVA 0FFHADDA R0 指令的表示形式是识别指令的标志 1 二进制的表示形式 以 累加器的内容 08H 为例 00100100B操作码OP 加法 00001000B操作数DATA 08H 特点 能被CPU直接识别 运行的形式 也称机器码 汇编语言的目标代码 缺点 不便于阅读 记忆和调试修改 2 1 2指令的三种表示形式 2 十六进制表示方式 它是对二进制形式的一种简化 00100100B24H00001000B08H在实验室等少数环境下 可以将这种形式作为输入程序的一种辅助手段 但是 这种形式的指令格式必须由对应的监控程序把它们翻译成二进制的 机器码 后存入程序存储器并运行 二进制表示的形式十六进制表示的形式 3 指令的 助记符 方式 也称 汇编格式 00100100B24H00001000B08HADDA 08H1 这是一种由英文单词或字母 数字来表征指令功能的形式 是一种便于阅读 书写和交流的表示形式 2 这种 汇编 格式的指令必须把它 翻译 为二进制形式 机器码 后才能为CPU所识别和执行 3 三种不同的表示方法适用于不同的场合 本章内容都以汇编的形式介绍指令系统 二进制表示形式十六进制表示汇编格式 2 1 3指令的字节数 在MCS 51单片机的指令系统中 因指令操作码和操作数的不同 指令 在存储器中 长度也各不相同 分为单字节 双字节和三字节 单字节指令 49条 分无操作数 有操作数两种 无操作数 如INCDPTR10100011BINCA00000100B 特点 操作数隐含在操作码中 含有操作数寄存器名称的单字节指令 如 MOVA R011101000BMOVA R111101001B 特点 寄存器名以三位数代码的形式在指令的后三位 双字节指令 46条 指令的操作码和操作数各占一个字节 如 MOVA data01110100Bdata很明显 8位的操作数本身占据一个字节 n n 1 mova data 双字节指令在程序存储器的存放示意图 三字节指令 16条 指令中的操作数为双字节 如 MOVDPTR data161001000B data15 8 data7 0或者 指令中分别包含1个字节的操作数和1个字节的操作数地址 如 MOVdirect data举例 MOV20H 0FFH MOVdptr data16 MOVdirect data 三字节指令在存储器中存放的方式示意图 指令的字节数与指令的运行时间 指令的字节多是否意味着指令周期就长 从表中可见 指令的字节数与指令周期不是对等的关系 2 1 4指令的分类 MCS 51单片机的指令如果按功能划分可以分为五类 1 数据传送类指令 完成数据在单片机内部之间的传送 分为8位数和16位两种 除了奇偶位外 指令的执行对PSW无影响 2 算术运算指令 用于操作数之间的加 减 乘除运算 特点 多数情况下 操作数之一在累加器A中 结果也保留在A中 运算结果要影响PSW 进位标志 奇偶和溢出标志等 3 逻辑操作和循环移位指令 操作数之间的逻辑加 逻辑与 取反和异或等操作 多数情况下一个操作数在A中 结果也存于A 移位指令分为左移 右移和带进位和不带进位几种情况 与算术类指令相比逻辑类指令基本不影响PSW的内容 4 控制转移类指令 条件转移 无条件转移 调用和返回 特点 通过修改程序指针PC的内容 使CPU转到另一处执行 从而改变程序的流向 5 位操作指令 位传送 位置位 位运算和位控制转移等操作 特点 按位操作而不是按字节的操作 位控转移的判断不是检测某一个字节而是对某一个位进行检测并决定是否进行程序转移 这类指令基本不影响PSW的内容 2 2寻址方式 在指令的操作数位置上 用于表征 寻找操作数的方式定义为 寻址方式 正确的理解 掌握寻址方式 是学习 使用指令的关键 在MCS 51单片机中 共使用了七种寻址方式 它们分别是 1 寄存器寻址5 变址寻址 2 直接寻址6 相对寻址 3 立即数寻址7 位寻址 4 寄存器间接寻址 2 2 1寄存器寻址 当所需要的操作数在内部某一个寄存器Rn中时 将此寄存器名Rn直接写在指令的操作数的位置上 如 MOVA R7 将寄存器R7中的内容送累加器A中 MOV20H R0 将寄存器R0中的数据送内存20H单元INCR1 将寄存器R1中的内容加一ADDA R3 A的内容与寄存器R3的内容相加送A寄存器寻址方式的指令大多是单字节指令 指令本身并不带有操数 而是含有存放操作数的寄存器的3位代码 以MOVA Rn为例 使用R7寄存器 所以rrr 111 既指令的机器码为 0EFH 11101rrr 操作码 寄存器代码 E8H EFH MOVA Rn 2 2 2直接寻址 指令本身含有操作数的8位或16位地址 既指令直接给出了操作数的地址 如 MOVA 30H 将RAM30H单元内容送累加器这里30H是操作数在RAM中的地址 很明显 直接寻址的指令长度是两个或三个字节 n n 1 30H 累加器A 直接寻址示意图 使用直接寻址应注意的三个问题 1 指令助记符中direct是用16进制数表示的操作数地址 当地址恰好在SFR区域时 指令也可以用寄存器名来表示 如 MOVA 80H可以写成MOVA P0后者用SFR中寄存器的名字取代它的物理地址80H 很明显 后者更容易阅读和交流 所以我们提倡使用SFR中寄存器名称来代替直接地址 如 MOVA SBUF 串口数据缓冲器数据送AMOVIE 00H 初始化中断允许寄存器MOVTH1 0FEH 为定时器1赋初值尽管使用SFR的寄存器名称来取代直接地址 可以带来程序的可读性 但是在汇编时 仍要将寄存器名字转换为直接地址 2 当直接地址时在工作寄存器区中时 可以使用两种寻址方式来访问 如 MOVA 00H 将RAM中00H单元数据送累加器AMOVA R0 将工作寄存器R0的内容送累加器A这里使用了不同的寻址方式 其指令的结构也不相同 前者是 11100101 0E5H 00000000 00H 双字节 后者的机器码是 11101000 0E8H 单字节 在物理结构上 R0与RAM的00H单元恰好是同一单元 所以不同的指令而执行结果是一样的 类似的还有累加器A INCA寄存器寻址方式 单字节 INCACC直接寻址方式 双字节 INC0E0H直接寻址方式 双字节 3 在指令系统中 字节地址与位地址是完全不同的概念 前者用direct表示 而后者用bit表示 但在指令中都是用16进制表示的数 如 MOVA 20H 将RAM的20H单元内容送AMOVC 20H 将位寻址区中的位地址为20H位内容送PSW中的Cy中 片内RAM 20H 2FH 中的位寻址区结构图 2FH 20H 字节地址 24H 位地址 返回前一次 2 2 3立即寻址 指令本身直接含有所需要的8位或16位的操作数 将此数称为 立即数 使用 标明 如 MOVA 30H 将 8位 立即数送累加器AMOVDPTR 2000H 16位立即数送DPTR积存器 注意 MOVA 30HMOVA 30H两者的区别 立即数寻址的指令长度为2或3个字节 n n 1 ROM 累加器A MOVA 30H指令执行流程 ROM DPTR MOVDPTR 2000H指令的存储和执行 返回 2 2 4寄存器间接寻址 指令中含有保存操作数地址的寄存器Ri MOVA Ri i 0 1 CPU首先根据指令中寄存器名Ri找到操作数地址 然后再从该地址中找到操作数x 如 MOVR0 30H 立即数送R0寄存器MOVA R0 从RAM的H单元取数送累加器A 注意 MOVA R0和MOVA R0指令的区别 30H R0 00H 累加器A 1 2 3 使用寄存器间址指令时应注意的三个问题 1 间址寄存器Ri只能使用R0 R1寄存器 i 0 1 2 间址方式不仅用于片内RAM 同样也适用于片外RAM 对于片内RAM使用Ri寄存器 寻址范围为00H FFH 对于片外RAM 可以使用Ri 也可以使用DPTR做间址寄存器 两者区别在于后者寻址范围为0000H FFFFH 两者都可以RAM和ROM 3 间址方式的指令不能访问SFR中的单元 如下面的程序是错误的 MOVR1 80HMOVA R1 因为80H为SFR的物理地址 MCS 51片内 片外数据存储器示意图 特殊功能寄存器SFR 通用数据存储器 80H7FH 00H FFH 片内数据存储器片外数据存储器256B个字节64KB个字节 片外数据存储器64KB 0000H FFFFH 注意 1 访问片内RAM20H存储单元 MOVA 20H2 访问片外RAM存储单元 MOVR0 20HMOVXA R03 尽管片内与片外的RAM单元的00H FFH地址相重叠但由于指令的不同不会发生地址混乱 2 2 5变址寻址 指令使用DPTR或PC中的内容作为基地址 再与累加器A的内容相加 其和作为操作数地址 如 MOVXA A PC PC内容与A的内容相加得操作数地址并将此操作数送AMOVXA A DPTR DPTR内容与A的内容相加得操作数地址并将此操作数送A使用变址指令时 要事先分别为A DPTR赋值 以便获得操作数得地址 变址指令只适用于对ROM存储器得访问 如查表等 举例 已知ROM中0302H单元有一个数x 现要把它送到累加器A中 试编程 MOVDPTR 0300H 立即数送DPTRMOVA 02H 立即数送累加器AMOVCA A DPTR 从ROM的00302单元取数送A 变址寻址示意图 02H 0300H ALU 0302H 累加器A DPTR 0300H 02H0302H MOVCA A DPTR 2 2 6相对寻址 转移指令中使用的一种寻址方式 MCS 51单片机的指令系统中 有两类转移指令 相对转移 2个或3个字节 绝对转移 3个字节 在绝对转移指令中 指令直接给出转移的目标地址 2字节地址 执行时将目标地址直接送给PC 从而控制程序转移 而相对转移指令在执行中是将PC值与指令中的8位偏移量进行相加 形成指令要转移的目标地址 SJMPrel由指令中有一个8位偏移量rel为带符号位的补码 所以控制程序转移的范围为 127 128 54H 2002H ALU 2056H 累加器A PC 2002H 54H2056H 操作码 偏移量 例如 SJMP54H 80H 54H 2000H 2002H LOOP1 相对寻址使用中应注意的问题 与绝对寻址相比 相对寻址具有很好的 浮动性 因此是编程人员普遍使用的一种寻址方式 使用时 要注意3点 1 CPU进行地址计算时 PC取值是执行本指令后的地址值 以上面的例子说明 指令本身的首地址是2000H 执行完后变为2002H 既下一条指令的首地址 如果使用三字节的相对转移指令 则PC PC 3 2 偏移量的计算 rel 目标地址 源地址 2 2字节指令 或 rel 目标地址 源地址 3 3字节指令 结果用补码的形式书写 为了减少计算偏移量的计算 汇编程序允许使用 符号地址 的方式代替偏移量 如 SJMPloop1汇编程序在翻译时 自动计算并将结果替换符号地址 3 如果转移地址的范围超过相对寻址的范围 如 127 128 时 就要采用别的方式法 否则在编译时 提示出错 2 2 7位寻址 在位寻址指令 位操作指令 中使用的位地址 在一般的情况下 系统的数据都是按字节 8位 来存放 处理 单片机在控制 检测的应用中 系统的输入 输出数据有很多属于开关量信号 这些开关量信号以bit 位 的形式进行各种运算 处理和存储的 MCS 51单片机控制 检测系统 驱动器 电动机 外设1 外设2 状态信号 状态信号 控制信号 在MCS 51单片机的硬件设计上充分考虑了这种 布尔 变量的处理 不仅在指令系统中设计了 位操作 指令 而且在片内RAM区中还专门开辟了一个 位寻址区 这样 布尔变量可以向字节数据一样进行存储 寻址 除了位寻址区外 RAM中的大多SFR都可以按位寻址 换句话 SFR除了有自己的字节地址外 在寄存器内的每一位还有其位地址 举例 SETB20H 将位地址为20H的位置一SETB90H 将P1口的d0位置一同字节寻址中的直接寻址一样 为了增加程序的可读性 凡在SFR中的位地址都可以使用符号地址来替代 如第二例中 完全可以使用下面的指令格式 MOVP1 0 将P0口的d0位置一类似还有 MOVC ACC 7 将累加器中的d7位送PSW的cy这种指令在汇编程序进行翻译时 还是要先将符号地址转换为真正的位地址 2 3数据传送指令 2 3 0传送指令的特点2 3 1内部数据传送类指令2 3 2外部数据传送类指令2 3 3堆栈操作指令2 3 4数据交换指令 数据传送是编程中使用最多 最主要的操作 它的功能是将数据在累加器 片内的RAM SFR及片外ROM RAM之间进行传送 在传送类指令中 必须指定被传送数据的源地址和目标地址 在传送过程中 源地址的内容不被改变 传送类指令除了以累加器A为目标的传送对PSW的P有影响外 其余的传送类指令对PWS一概无影响 举例 MOVA R0 将R0寄存器中的数据送累加器A中 注意寻址方式 指令通式 MOV 2 3 0传送指令的特点 2 3 1内部数据传送类指令 特点 指令的源操作数和目的操作数都在单片机内部 1 立即寻址型传送指令 2 直接寻址型传送指令 3 寄存器寻址型传送指令 4 寄存器间址型传送指令 5 内部数据传送类指令的使用 1 立即寻址型传送指令 特点 原操作数字节是立即数 处在指令的第二或第三字节 所以这类指令都是多字节指令 这类指令有如下4条 MOVA data Adata 双字节指令 MOVRn data Rndata 双字节指令 MOV Ri data Ri data 双字节指令 MOVdirect data directdata 三字节指令 这类指令多用于程序的初始化 如 MOVR0 20HMOVA 00H 立即寻址指令举例 已知 R0 20H 试问单片机执行如下指令后 累加器A R7 20H和21H单元中的内容是什么 MOVA 18H 立即数18H送累加器AMOVR7 28H 立即数28H送寄存器R7MOV R0 38H 立即数38H送内存20H单元MOV21H 48H 立即数48H送内存21H单元 2 直接寻址型传送指令 特点 指令中至少含有一个源操作数或目的操作数的地址 很明显 这也是2个或3个字节的指令格式 其中直接地址在第2或第3个字节上 这类指令有如下5条 MOVA directMOVdirect AMOVRn directMOV Ri directMOVdirect2 direct1 注意 direct为内部寄存器 RAM和SFR的地址 换句话说 direct适用于片内所有的地址 寄存器 SFR和RAM 直接寻址指令举例 MOVA 30H 内存RAM30h单元数据送AMOV50H A A中内容送RAM的50h单元MOVR6 31H RAM的30h内容送R6寄存器MOV Ri 30H RAM30h内容送Ri指定的RAM单元MOVP1 32H RAM32h内容送P1口 p1 符号地址 MOV90H 32H 同上 试比较两种表示方法 3 寄存器寻址型传送指令 指令中含有存放操作数的寄存器名Rn其中 n 0 1 2 3 4 5 6 7 共有如下三条 MOVA RnMOVRn AMOVdirect Rn 4 寄存器间接寻址型传送指令 指令特点 指令中Ri中存放的不是操作数本身 而是操作数在RAM中的地址 i 0 1 格式如下 MOVA RiMOV Ri AMOVdirect Ri 注意 Ri中存放操作数的地址是有所选择的 只有非SFR的RAM单元才能使用这种寻址方式 寄存器间接寻址指令举例 已知 40h 11h 41h 22h R0 40h和R1 41h 试问 下面的指令执行后 累加器A 40h 41h和42h单元中的内容是什么 MOVA R0 RAM40h单元内容11h送AMOV R1 A A中的11h送RAM的41h单元MOV42H R1 RAM的41h单元内容11h送RAM42h中 5 内部数据传送类指令的使用 1 在使用传送指令时 可以根据实际情况选用恰当寻址方式 上面给出的各种类型的传送指令是INTEL公司在设计MCS 51的硬件时就已经确定下来 编程人员只能像查字典一样去查找 使用 不能根据主观意愿去 创造 指令 例如 要将R0中的数据传送到R1中 如何使用指令去完成上面的操作 movr1 r0是否可以 回答是否定的 因为在MCS 51的指令系统中没有此条指令 只能使用 1 mova r0或 2 mov01h 00hmovr1 a因此 必须从MCS 51的指令表中选择使用指令 MCS 51内部数据传送类指令方式图 累加器A direct直接寻址 Ri间址 Rn寄存器 Data立即数 2 以累加器A为目的寄存器的传送指令会影响PSW中的奇偶位P 而其余的指令对PSW均无影响 3 要会正确地估计指令的字节 凡是指令中包含有立即数 直接地址的指令 都应当在原有的基础上加1 举例 mova Ri 个字节mova direct 个字节movdirect data 个字节movdirect2 direct1 个字节 4 对于同一问题可以有不同的编程方法 使用不同的方法虽然都可以实现题目的要求 但从指令长度 运行时间和可阅读性上等综合因素考虑 不同的方法就有合理和不合理 优化和繁杂之分 所以 在学习指令系统和编程时开始就要养成一个好的 合理的编程习惯 5 注意给程序进行正确的注释 这对于阅读 编写和修改程序都是非常重要的 下面就是一些注释的例子 MOVA 30H 30h AMOVA R0 R0 AMOV40H 30H 30h 40hMOVA Ri Ri A 内部传送类指令举例 试编出把30h和40h单元内容进行交换 MOVA 30H 30h AMOV30H 40H 40h 30hMOV40H A A 40h 累加器A 30H 40H 2 3 2外部数据传送类指令 1 16位数传送指令 2 外部ROM的字节传送 3 外部RAM的字节传送指令 1 16位数传送指令 MCS 51指令系统中唯一的一条16位数据传送类指令 MOVDPTR data16DPTR是单片机内部SFR中的两个寄存器DPH DPL组合而成 其中DPH为高八位 DPL为低八位 DPTR是一个专门用于访问外部存储器的间址寄存器 寻址能力为64K 0 65535 2 外部ROM的字节传送指令 这类指令有两条 都属于变址寻址指令 MOVCA A DPTR A A DPTR MOVCA A PC PC PC 1 A A PC 该指令也称为 查表 指令 在ROM中建立一个数据表 可以使用DPTR PC作为数据表格的基地址 在第一条指令中 用DPTR作为基地址 使用前 先将数据表的首地址送入DPTR中 累加器A作为偏移量 由两者数据相加得到待查的表中数据地址并取出 第二条指令是以程序计数器PC为基地址 由于PC的内容与该指令在ROM中的位置有关 所以一旦该指令在程序中的位置确定 其PC的值也就确定 外部ROM的字节传送指令举例 已知累加器A中存有0 9范围内的数 试用查表指令编写出查找出该数平方的程序 1 采用DPTR作基址寄存器 设平方表的首地址为2000h 累加器A中的内容恰好是查表的偏移量 首先将表的起始地址2000h送入DPTR中 MOVDPTR 2000H 指针赋值MOVCA A DPTR 平方值送A 2000h 2009h 2008h 2007h 2006h 2005h 2004h 2003h 2002h 2001h 2 采用PC作基址寄存器 与DPTR不同 使用PC作为基地址时 必须对累加器A的数据进行修正 以保证 a pc恰好找到待查的平方值地址 ORG1FFBH1FFBH74dataADDA data data 02h1FFDH83HMOVCA A PC PC 1FFE1FFEH80FEHSJMP 2000H00HDB0 平房表首址2001H01HDB12002H04HDB42003H09HDB92004H10HDB162005H19HDB25 2009H51HDB81ENDdata为MOVC指令首地址与表头地址之间的单元数 2000h 2009h 2008h 2007h 2006h 2005h 2004h 2003h 2002h 2001h 1FFFh 1FFEh 1FFDh 1FFCh 1FFBh 3 外部RAM的字节传送指令 实现外部RAM和累加器A之间的数据传送 只有寄存器间接寻址的指令 MOVXA Ri使用Ri寄存器间址寻址范围0 255hMOVX Ri A在硬件电路中P0口输出8位地址数据 MOVXA DPTR使用DPTR间址 寻址范围0 65535hMOVX DPTR A在硬件电路中 使用P0口输出低8位 P2口输出高8位外部RAM地址 外部RAM的字节传送指令举例 已知外部RAM的88H单元有一个数x 试编程将x送外部RAM的1818H单元 解 外部RAM中的数据是不能直接传送的 因此必须使用两次MOVX指令完成此操作 ORG2000HMOVR0 88H 为8位指针赋值MOVDPTR 1818H 为16位指针赋值MOVXA R0 取x到累加器AMOVX DPTR A x送RAM的1818h单元SJMP 停机END 2 3 3堆栈操作指令 堆栈操作是一种特殊的数据传送指令 堆栈 一个用来保存程序断点 数据的特殊的存储区域 在MCS 51单片机中 栈区是占用片内RAM的存储空间 具体栈位置由指针SP来确定 系统上电时 SP 07h 1 进栈操作 pushdirect sp 1 sp direct sp 2 出栈操作 popdirect sp direct sp 1 sp 注意 寻址方式为直接寻址 所以pusha是错误的 应当是pushacc或push0E0h 同理 pushr0也是错误的 进栈是堆栈向上 生长 的过程 即sp 1 出栈则相反 系统上电时 sp 07h SP的值可以根据需要进行修改 以适应具体编程的需要 在确定栈区位置时要考虑对数据区的影响 以避免数据区与栈区冲突 堆栈操作指令举例 一 下面是一个BCD码转换为二进制的子程序BCDB中有关堆栈操作的例子 在这里 进栈操作是为了保护主程序中相关寄存器中的数据 因为子程序要使用这些寄存器 org0800hbcdb pushpswpushaccpushb popbpopaccpoppswret SP 堆栈操作指令举例 二 堆栈操作指令除了可以在子程序的设计中 对主程序的数据进行保护 还可以根据堆栈操作的特点完成一些特殊的操作 举例 设片内RAM的30h单元存有x 40h单元存有y 试将两个单元内容互换 push30hpush40hpop30hpop40h SP 07h 40h 30h 2 3 4数据交换指令 为提供一种方便的累加器和寄存器或RAM之间的数据交换 避免了使用一般mov传送指令完成交换时的不便 格式 xcha Rn a Rnxcha direct a direct xcha Ri a Ri xchda Ri a3 0 Ri 3 0举例 已知 片外RAM20h单元 内部RAM20h单元分别有数x和y 试编程互将两数相交换 movR1 20h 指针赋初值movxa R1 x axcha R1 交换a 20h y amovx R1 a y 20h 片外RAM 数据交换指令举例 一 举例 已知 片外RAM20h单元 内部RAM20h单元分别有数x和y 试编程互将两数相交换 movR1 20h 指针赋初值movxa R1 x axcha R1 交换a 20h y amovx R1 a y 20h 片外RAM y x 20h 20h 累加器A 1 2 3 数据交换指令举例 二 已知RAM50h单元有一个0 9的数 试编程将它变成相应的ASCII码 解 0 9的ASCII码是30h 39h 两者相差30h 方法一 对50h单元的数据高四位组装一个30h movr0 50h 指针赋值mova 30h 30h Axchda r0 A3 0 r0 3 0 在A中组成ASCII码mov r0 a A中的ASCII送回50h单元 50h 00110101 A 30h 交换后A 35h 1 2 2 4算逻运算和移位指令 功能 完成算术运算 逻辑运算和循环移位三大功能 特点 大多指令都要由累加器A来存放一个源操作数 并把操作结果放回累加器A中 2 4 1 算术运算指令 2 4 2 逻辑运算指令 2 4 3 移位指令 2 4 1 算术运算指令 不带进位的加法指令 ADD 1 加法指令 带进位的加法指令 ADC 加1指令 INC 编程举例 2 减法指令 带进位的减法指令 SUBB 减1指令 DEC 3 十进制调整指令 DAA 4 乘法和除法指令 MULDIV 加法指令 一 不带进位的加法指令 格式 ADDA Rn A Rn AADDA direct A direct AADDA Ri A Ri AADDA data A data A 注意 1 参加运算的数据都应当是8位的 结果也是8位并影响PSW 2 根据编程者的需要 8位数据可以是无符号数 0 255 也可以是有符号数 127 128 3 不论编程者使用的数据是有符号数还是无符号数 CPU都将它们视为有符号数 补码 进行运算并影响PSW 不带进位的加法指令举例 一 试分析执行下列指令后累加器A和PSW中各标志的变化 MOVA 19HCy 0 ADDA 66HAC 0OV CP CS 025A 00011001BP 1 102data 01100110B127001111111B1 若两数都是无符号数 则因Cy 0无溢出 25 102 127 2 若两个数是有符号数 则因OV 0无溢出 cy 000CPCSAC 不带进位的加法指令举例 二 试分析执行下列指令后累加器A和PSW中各标志的变化 MOVA 5AHCy 0 ADDA 6BHAC 0 OV CP CS 190A 01011010BP 0 107data 01101011B197011000101BCPCSAC1 若两数是无符号数 因Cy 0无溢出 90 107 1972 若两数是有符号数 因OV 1 故有溢出 两个正数相加后变为负数 很明显结果是不正确的 加法指令 二 带进位的加法指令 格式 ADDCA Rn A Rn Cy AADDCA direct A direct Cy AADDCA Ri A Ri Cy AADDCA data A data Cy A 注意 这里的Cy是指令执行前的Cy 对PSW的影响同ADD指令 加1指令 格式 INCA 累加器A加一INCRn Rn 1 RnINCdirect 内存单元数据加一INC Ri 内存单元数据加一INCDPTR dptr 1 dptr 注意 1 除了第一条对PSW的P有影响外 其余对PSW均无影响 2 由于上面的原因 INC指令不能作为一般的数据算术运算使用 INC主要用于修改数据指针等控制 循环语句中使用 编程举例 已知M1 M2单元中存有两个16位无符号数x1 x2 低位在前 试写出x1 x2 并将结果放入M1 M1 1单元 低8位在M1单元 设两数之和不会超过16位 65535 解 MOVR0 M1 x1指针赋初值MOVR1 M2 x2指针赋初值MOVA R0 取x1低8位送AADDA R1 x1与x2低8位相加MOV R0 a 低8位和送m1单元INCR0INCR1 修改指针MOVA R0 取x1的高8位送AADDCA R1 x1与x2的高8位和Cy相加MOV R0 A 结果送M1 1单元 M1 M1 1 M2 M2 1 减法指令 带进位的减法指令 在MCS 51单片机的指令系统中 只有 带进位的减法SUBB 减一DEC两种指令 1减法指令 格式 SUBBA Rn A Rn Cy ASUBBA direct A direct Cy ASUBBA Ri A Ri Cy ASUBBA data A data Cy A 使用减法指令要注意的几个问题 1 在单片机内部 减法指令实际上是采用补码的加法实现的 但要判定减法结果编程者可以按二进制减法法则验证 2 无论相减两数是无符号数还是有符号数 减法操作总是按有符号数来处理 影响PSW中相关的标志 详见举例 3 在MCS 51的指令系统中没有不带Cy的减法 所以在使用SUBB指令前必须使用一条清除Cy的指令 CLRC 减法指令应用举例 试分析执行下列指令后累加器A和PSW中各标志的变化 CLRCMOVA 52H01010010B 82SUBBA 0B4H10110100B 7682a 01010010 76data 10110100158110011110 62H 98手工计算CPCSAC101 分析 CPU的计算得 98 很明显答案是错误的 原因是OV 1 既产生了溢出 所以 对于符号数的减法在运算后一定要检测OV 1 减一指令 格式 DECA 累加器A减一DECRn Rn 1 RnDECdirect 内存单元数据减一DEC Ri 内存单元数据减一 注意 1 除了第一条对PSW的P有影响外 其余对PSW均无影响 2 由于上面的原因 DEC指令一般不作为数据算术运算使用 因为不能对PSW的OV等位产生影响 它主要用于修改数据指针在控制 循环语句中使用 十进制调整指令 在CPU进行BCD码运算时 必须在运算后进行十进制调整 这是因为 CPU在运算时 并不知道数据是二进制还是BCD码 格式 DAA 若AC 1或A3 0 9 则A 06h A 若Cy 1或A7 4 9 则A 60h A 注意 1 DAA指令必须紧跟在加法指令之后 2 DAA指令只适用于加法指令的调整 十进制调整指令应用举例 一 1 BCD加法运算 试写出完成85 59的BCD码的加法程序 MOVA 85HADDA 59HDAASJMP 85a 10000101B 59dtat 01011001低4位 9 所以加06h 00000110B11100100B高4位 9 所以加60h01100000B101000100B结果为144h 1包含在Cy 注意 144H是用16进制数来表示十进制 既BCD码 十进制调整指令应用举例 二 2 BCD减法运算 由于DAA指令只能对BCD码的加法进行调整 所以遇到BCD码的加法时就要将其减法变为加法运算 然后再使用DAA指令进行调整 减法变加法就是使用BCD码的补码运算法则 将被减数 减数变为被减数 减数的补码 减数的补码 BCD码的模 减数其中BCD码的模为100H 99H 01H 9AH 已知 在M1 M2中分别存有被减数91和减数36 试编程求19 36并将结果存入M3单元 解 1 算法 91 36 91 100 36 91 9A 36 2 编程 CLRC 清除CyMOVA 9AH BCD码的模100送ASUBBA M2 计算减数的补码 结果在A中 ADDA M1 被减数 减数的补码 结果在A中 DAA 十进制调整MOVM3 A 结果送M3单元CLRC 清除进位位 不要Cy 请同学自己验证一下 乘法和除法指令 这是MCS 51单片机唯一的一类单字节4周期指令 它相当于4条加法指令的运行时间 格式 MULAB a b ba b存高8位 a存低8位 DIVAB a b a b a存商 b存余数 注意 指令对标志的影响 1 在乘法指令中对PSW的影响有Cy OV 和P 具体如下 Cy 0 P取决于A中 1 的个数 OV表明积的大小 当积超过255 B 0 时 OV 1 2 在除法指令中 Cy P与乘法相同 在执行除法指令时 若B 0时OV 1 表示除数 0除法无意义 其余情况下OV被复位 2 4 2 逻辑运算指令 功能 对2个8位二进制数进行逻辑与 或 非和异或操作 特点 除了以累加器A为目标寄存器的指令影响PSW的P位外 其余指令对PSW均无影响 1 逻辑与运算指令 ANL 2 逻辑或运算指令 ORL 3 逻辑异或指令 XRL 4 累加器清零和取反指令 CLR CPL 逻辑与运算指令 格式 ANLA Rn A Rn AANLA direct A direct AANLA Ri A Ri AANLA data A data AANLdirect A direct A directANLdirect data direct data direct上面的指令也可以分为两类 1 以累加器A为目标寄存器的逻辑运算指令 2 以内存单元为目标的逻辑运算指令 应用举例 一 已知R0 30H和 30H 0AAH 试问执行下列指令后累加器A和30H单元中的内容是什么 1 MOVA 0FFH2 MOVA 0FHANLA R0ANLA 30H A 30H 30H 0AAH A 0AH 30H 0AAH 3 MOVA 0F0H4 MOVA 80HANLA R0ANL30H A A 0A0H 30H 0AAH A 80H 30H 80H 很明显 ANL操作可以从某个存储单元中取出某几位 而把其它的为屏蔽掉 清零 应用举例 二 已知 M1单元有一个9的ASCII码39H 试编程将其变为BCD码 解 1 使用ANLdirect data的指令 ANLM1 0FH解 2 使用ANLA data指令 MOVA M1ANLA 0FHMOVM1 A 逻辑或运算指令 格式 ORLA 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 以累加器A为目标寄存器的逻辑运算指令 2 以内存单元为目标的逻辑运算指令 应用举例 设累加器A 0AAH P1口 0FFH 试编程将累加器A中的第四位送P1口的低四位 而P1口的高四位不变 解 MOVR0 A 累加器A中的数据暂存ANLA 0FH 屏蔽A的高4位ANLP1 0F0H 屏蔽P1口的低4位ORLP1 A 在P1口组装MOVA R0 恢复累加器A的数据 小结 与运算可以 屏蔽 某些位 或运算可以 置位 某些位 逻辑异或运算指令 格式 XRLA Rn A Rn AXRLA direct A direct AXRA Ri A Ri AXRLA data A data AXRLdirect A direct A directXRLdirect data direct data direct特点 按位运算 相同时为0 不同时为1 使用异或可以实现将某个字节的数据或将数据的某几位变反 举例 已知 外部RAM的30H单元中有一个数AAH 现要将其高4位不变 低4位取反 试编程 解1 利用MOVXA Ri指令 MOVR0 30H10101010MOVXA R0 00001111XRLA 0FH10100101MOVX R0 A解2 利用MOVXA DPTRMOVDPTR 0030HMOVXA DPTRXRLA 0FHMOVX DPTR A 累加器清零和取反指令 用传送指令可以实现对累加器A的清零和取反操作 但是它们都是双字节指令 在MCS 51的指令系统中专门设计了单字节 单周期对累加器清零和取反的指令 格式 CLRA 累加器清零CPLA 累加器取反取反指令可以方便的实现求补操作 举例 已知30H单元中有一个数x 写出对它求补的程序 MOVA 30HCPLAINCAMOV30H A 逻辑运算指令应用举例 设X Y和Z分别存在X Y和Z单元 试编出能实现此电路功能的程序 并将结果送入F单元 解 MOVA XANLA Y X Y AMOVR1 A 送R1暂存MOVA YXRLA Z Y Z ACPLA A取反ORLA R1 X Y Y Z AMOVF A A F 2 4 3 移位指令 虽然MCS 51只有5条移位指令 但它可以处理所有移位问题 格式 RLARRARLCARRCASWAPA 注意 只能对累加器A进行移位 A7 A0 A7 A0 A7 A0 Cy Cy A7 A0 举例 一 已知 在M1和M1 1单元有一个16位数 M1存低8位 试编程将其扩大2倍 设结果小于65535 解 扩大2倍可以用左移一位来实现 M1M1 1 1001110 1 0101101 0 程序清单 CLRC 清除Cy位MOVR1 M1 指针赋值MOVA R1 取低8位数据RLCA 循环左移 Cy进低位 高位进CyMOV R1 A 移位后数据回送INCR1 指针加一MOVA R1 取高8位数据RLCA 循环左移Cy进低位MOV R1 A 数据回送 举例 二 已知 M1 M2单元中有2个BCD码 试编程将其紧缩为一个字节并存入M1单元 解 MOVR1 M1MOVA R1SWAPAINCR1ORLA R1MOVM1 A M1M1 1 BCD10000 BCD1BCD2 0000BCD1 累加器A 2 5控制转移和位操作指令 2 5 1控制转移指令1 无条件转移指令2 条件转移指令3 子程序调用和返回4 空操作指令2 5 2 位操作指令1 位传送指令 2 位置位和位清零指令 3 位运算指令 4 位控制转移指令 1 无条件转移指令 格式 LJMPaddr16长转移指令 寻址范围65535 AJMPaddr11绝对转移 寻址范围2K SJMPrel短转移 转移范围 127 128 JMP A DPTR变址转移 寻址范围65535 LJMP指令 三字节 AJMP指令 双字节 SJMP指令 双字节 JMP指令 单字节 长转移指令 三字节双周期指令 指令执行时 将指令码中的addr16送入PC中 使程序无条件的转向addr16所指向的新地址执行程序 举例 已知某单片机的监控程序地址为A080H 试问用什么方法使单片机开机后自动的转向该监控程序 解 因为单片机上电时 PC 0000H 所以在0000H单元存放一条LJMP0A080H的指令即可 ROM 0000H0001H0002H0003H 绝对转移指令 双字节 双周期指令 将AJMP指令中的11位转移地址替换掉原来PC中16位地址中的低11位地址 指令中的11位地址 确定了地址的转移范围在2K以内 所以AJMP也称 页内转移 指令 A10a9a8操作码a7 a0 AJMP指令 PC程序计数器 MCS 15的ROM系统是以2K为一页来划分程序存储器 这样对于4K的片内ROM存储器可以分为2页 片外64K的ROM可以分为32页 在执行AJMP指令时 PC的高5位决定了ROM中的页地址 而AJMP指令的低11位地址用来选择页内地址 在一般情况下 AJMP指令应当与目标地址在同一页内 更具体的说 目标地址应当与AJMP指令取出后的PC值 PC PC 2 在同一页内 否则转移将会出现错误 ROM的64K存储空间的页面 部分 划分表 ROM的64K存储空间的页面示意图 AAA MOVA R0MOVR1 A AJMPAAA 0100H 07FEH 00000111111111111110 PC值 00001000000000000000 PC 2值 00001001000000000000 AJMP指令中的11位地址 原本AJMP指令要转到本页的0100H单元但是由于PC的高5位页面地址发生了变化使AJMP指令实际转到下一页0900H单元 最后PC值 发生跨页错误 AJMP转一指令是用来做页内2K范围的转移 如果使用不当 会发生错误的 跨页 操作 产生跨页的原因是AJMP指令处于每一页的最后两个单元的结果 所以避免这种现象的方法就是不要在每一页的最后两个单元使用AJMP指令 如果目标地址与AJMP地址不再同一页内 建议使用LJMP指令替代AJMP 使用AJMP指令时 11位的绝对地址可以用符号地址取代 正确使用AJMP转移指令 短转移SJMP指令 格式 SJMPrelrel为偏移量 127 128 rel 偏移量 的计算公式 rel 目标地址 源地址 2 其中 2为SJMP指令的长度 例1 如图 要转到0116H时 rel 0116H 0110H 2 04H 例2 要转到0109H时 rel 0109H 0110H 2 F7H 9 实际编程时 使用符号地址取代rel以简化计算 在汇编时由汇编程序来计算rel PC PC 2 0109H 0110H 0116H 变址转移指令 格式 JMP A DPTR单字节操作码为73H特点 转移地址由累加器A的内容与DPTR相加形成 用途 用来制作一个多分支的转移结构 举例 MOVDPTR TABLE 指针赋表头地址JMPA DPTR 转移地址由A DPTR产生TABLE AJMPROUT0 多分支转移表AJMPROUT1AJMPROUT1AJMPROUT2 2 条件转移指令 1 累加器A判零转移指令 双字节指令 JZrel 若A 0 则PC PC 2 rel 若A 0 则PC PC 2JNZrel 若A 0 则PC PC 2 rel 若A 0 则PC PC 2 2 比较条件转移指令 3字节 a data时 PC 3 PC Cy 0CJNEA data rela data时 PC 3 rel Cy 0CJNERn data relaY时 若Cy 1则X Y 3 若参加比较的是有符号数时 无法直接用Cy来判断 必须事先对符号进行判断 再根据四种情况具体处理 a 当x y均 0时 同无符号数相同 b 当x y均0 yy d 当x0时 x y X 0 Y 0 Y 0 Cy 0 X Y X Y Y N Y Y Y N N N 3 减一条件转移指令 1 DJNZRn rel Rn 1 Rn 若Rn 0则PC 2 rel PC若Rn 0则PC 2 PC2 DJNZdirect rel direct 1 direct 若 direct 0则PC 3 rel PC若 direct 0则PC 3 PC注意 第一条指令为双字节 第二条指令为三字节 指令本身先做一个带回送的减一运算操作 然后根据运算的结果是否为零作为转移的条件 应用举例 令片内RAM中DATA为起始地址的数据块中连续10个无符号数相加 并把和送到SUN单元 设其和小于256 ORG1000HSTART MOVR2 0AH 数据块长度10送计数器R2MOVR0 DATA 数据块起始地址送指针R0CLRA 累加器清零LOOP ADDA R0 累加部分和INCR0DJNZR2 LOOP 若R2 1 0则转LOOP继续MOVSUN A 存累
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 技术支持与服务保障协议书内容
- 2025山东人才发展集团有限公司招聘8人备考考试题库附答案解析
- 2025年甘肃省定西仁济堂中西医结合医院影像(超声)医师招聘备考考试题库附答案解析
- 2025年安庆太湖县部分县属国有企业公开招聘工作人员23名考试模拟试题及答案解析
- 2025江苏南通市通州区水务有限公司所属刘桥分公司招聘1人备考考试试题及答案解析
- 2025重庆巴南区鱼洞二小招聘教师6人考试参考题库及答案解析
- 2025年职业资格助听器验配师二级-二级参考题库含答案解析(5卷)
- 2025下半年四川雅安天全县中医医院(雅安市骨科医院)招聘编外人员5人备考模拟试题及答案解析
- 2025年特种作业类特种作业煤矿安全作业煤矿采煤机(掘进机)操作作业-煤矿井下爆破作业参考题库含答案解析(5卷)
- 2025年特种作业类特种作业煤矿安全作业煤矿瓦斯抽采作业-煤矿提升机操作作业参考题库含答案解析(5卷)
- 当代世界经济与政治第二章课件
- 国际投资学(investment)讲义课件
- 施工机具进场检查验收记录
- 二年级健康成长上册教案
- 民俗学概论 第一章 概述课件
- 时代邻里4度°服务美学品质关怀体系
- 供水公司主要安全风险公告栏(总)
- 《农产品贮藏与加工》课件第三章稻谷精深加工
- 外研版五年级上册英语(全册)单元教材分析
- 【课件】音响的感知课件-高中音乐湘教版(2019)音乐鉴赏
- 华为-计划、预算和核算
评论
0/150
提交评论