第3章 单片机汇编程序设计_第1页
第3章 单片机汇编程序设计_第2页
第3章 单片机汇编程序设计_第3页
第3章 单片机汇编程序设计_第4页
第3章 单片机汇编程序设计_第5页
已阅读5页,还剩130页未读 继续免费阅读

下载本文档

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

文档简介

第3章单片机汇编程序设计 第2章单片机基本原理 1 第3章单片机汇编程序设计 主要内容 3 1单片机汇编指令格式及标识3 2单片机的寻址方式3 3单片机指令系统3 4单片机汇编程序常用伪指令3 5单片机汇编程序设计 3 1单片机汇编指令格式及标识 MCS 51单片机有111条指令其中单字节指令49条 双字节指令45条 三字节指令17条 其中有64条是单机器周期指令 45条双机器周期指令 2条四机器周期指令 若系统时钟为12M时 大多数指令执行时间仅需1 S 3 1单片机汇编指令格式及标识 数据传送类指令28条算术运算类指令24条逻辑操作类指令25条位操作类指令17条控制转移类指令17条 3 1单片机汇编指令格式及标识 3 1 1指令格式指令的格式 LOOP MOVA R0 将R0的内容送A 标号 操作码第一操作数第二操作数 注释 目的操作数 源操作数 注 黑色的内容不是必须的 3 1单片机汇编指令格式及标识 标号 表示该指令的符号地址操作码 它规定了指令的操作功能操作数 是指参加操作的数据或数据的地址注释 是为该条指令作的说明 便于阅读MCS 51单片机指令系统中的指令字节长度有单字节 双字节 三字节三种 其格式如下 单字节 RETI32H双字节 MOVA 0FFH74HFFH三字节 MOV74H 0FFH75H74HFFH 指令字节越长 所占的内存单元越多 但执行时间的长短只取决于执行该指令需要多少机器周期 3 1单片机汇编指令格式及标识 3 1 2指令中用到的标志符 Ri i 0 1 当前选中的工作寄存器区中可作为地址指针的两个工作寄存器R0和R1 在工作寄存器组中 只有R0和R1既能存放数据又能作为地址指针若在R0和R1前加 表示作为地址指针 若不加 则表示存放数据 这点对数据指针DPTR同样适用 Rn n 0 7 当前选中的工作寄存器R0 R7 它在片内RAM的地址由PSW中的RS1 RS0确定 3 1单片机汇编指令格式及标识 data 8位立即数 即包含在指令中的8位常数 data16 16位立即数 即包含在指令中的16位常数 direct 8位片内RAM单元 包括SFR 的直接地址 addr11 11位目的地址 用于ACALL和AJMP指令 目的地址必须在从下一条指令地址开始的2KB程序存储器地址内 3 1单片机汇编指令格式及标识 addr16 16位目的地址 用于LCALL和LJMP指令 目的地址可以在64KB程序存储器地址空间内 rel 补码形式的8位地址偏移量 以下一条指令第一字节地址为基值 偏移范围 128 127 即包含在指令中的8位常数 bit 片内RAM或SFR的直接寻址位地址 间接寻址方式中 间址寄存器前的符号 3 1单片机汇编指令格式及标识 11 在位操作指令中 表示对该位先求反再参加操作 但不影响该位的原值 12 X 表示X中的内容 13 X 表示X所指的地址单元中的内容 14 指令操作流程 将箭头左边的内容送入到右边的单元中 3 4单片机汇编程序常用伪指令 汇编程序中提供了一套伪指令 支持汇编的运行 伪指令作用 在汇编过程中起控制作用 不产生可执行目标代码 仅用来指定目标程序或数据存放的起始地址 给一些指定的标号赋值 在内存中预留工作单元 表示源程序结束等 与机器指令也无对应关系 只能被汇编识别 汇编后 目标程序中不出现伪指令故又称软指令 1起点命令ORG 例 ORG8000HSTART MOVA 00H 表明该程序的起始地址为8000H单元 该命令的要求 ORG定义的空间要从小到大 定义的空间不能重叠 格式 ORG16位地址 例 ORG3000HMOVA 30HMOVB 50HORG2700HMOVR1 56H定义从大到小的错误 例 ORG2000HMOVA 20HORG2001HMOVB 12H定义重叠的错误 1起点命令ORG 若源程序开始无ORG命令 则机器汇编时从0000H单元开始存放目标程序 2定义字节命令DB 格式 DB字节常数或ASCII字符串 该命令的功能是从指定单元开始存储若干个数据或ASCII字符 例 ORG2000HSTR DB07H 76HDB 1 2 汇编后 2000H 07H 2001H 76H 2002H 31H 2003H 32H 3定义字命令DW 格式 DW字常数或ASCII字符串 该命令把DW后的字常数从当前地址连续存放 先存放高8位 后存放低8位 例 ORG2000HTAB DW1234H 56H 汇编后 2000H 12H 2001H 34H 2002H 00H 2003H 56H 4定义存储空间命令DS DefineStorage 格式 DS表达式 该命令的功能是从指定地址开始预留一个存储区 以备后用 例 ORG2000HTEMP DS08HDB30H 40H 汇编后 从2000H开始预留8个单元 然后从2008H单元开始给内存赋值 即 2008H 30H 2009H 40H 5赋值命令EQU 格式 字符名称EQU数或汇编符号 该命令是把数或汇编符号赋给字符名称 用EQU赋过值的符号名可以用作数据地址 代码地址 位地址 因此它可以是8位的 也可以是16位的 例 ABEQUR1MOVA AB这里AB就代表工作寄存器R1 例 B18EQU11HDELYEQU07E8HMOVA B18LCALLDELY这里B18当作片内RAM的一个直接地址 而DELY定义了一个16位的地址 6位地址符号命令BIT 格式 字符名BIT位地址 该命令是把位地址赋值给字符名 例 A1BITP1 0A2BIT08H 这样 P1口的第0位地址90H就赋给A1 位地址08H就赋给A2 7汇编结束命令END 格式 标号END 该命令通知汇编程序结束汇编 在END之后所有的汇编语句均不被处理 3 2单片机的寻址方式 操作数用于给指令的操作提供数据 数据的地址或指令的地址 操作数往往用相应的寻址方式指明 MCS 51单片机指令系统的指令按操作数的多少可分为无操作数 单操作数 双操作数和三操作数四种情况 3 2单片机的寻址方式 寻址方式就是指操作数或操作数的地址的寻找方式 MCS 51单片机的寻址方式按操作数的类型 可分为数的寻址和指令寻址 数的寻址有 常数寻址 立即寻址 寄存器数寻址 寄存器寻址 存储器数寻址 直接寻址方式 寄存器间接寻址方式 变址寻址方式 和位寻址 指令的寻址有绝对寻址和相对寻址 3 2 1常数寻址 立即寻址 在这种寻址方式中 指令多是双字节的 一般第一个字节是操作码 第二字节是操作数 该操作数直接参与操作 所以又称立即数 数前用 表示 寻址空间 程序存储器 例 ORG2000HMOVA 0E1H E1H A指令代码为74HE1H 在MCS 51的指令系统中 仅有一条指令操作数是16位的立即数 其功能是向数据指针DPTR传送16位立即数 立即数的高8位送DPH中 低8位送DPL中 例 ORG2000HMOVDPTR 3FA6H指令代码为 90H 3FH A6H 3 2 1常数寻址 立即寻址 3 2 2寄存器寻址 寄存器寻址是对工作寄存器R0 R7 累加器A 寄存器B 数据指针寄存器DPTR等中的数进行操作 其中R0 R7由操作码的低三位表示 而其它寄存器是隐含在操作码中的 例 MOVA R5 R5 A指令代码为 EDH 11101101 低3位中的101表示操作数是R5 现假设RS1RS0 01 则R5的地址是0DH 又假设0DH中存放了数4AH 则指令执行后 4AH就被送到A中 1 R0 R7 区由RS1和RS2决定2 A B DPTR 3 2 3存储器数寻址 存储器数寻址针对的数据是存放在存储器单元中 或存储器单元的内容提供数据存放单元的地址 根据存储器单元地址的提供方式 存储器数的寻址方式有 直接寻址 寄存器间接寻址 变址寻址 1直接寻址 直接寻址就是指令中直接给出操作数所在存储单元的地址 它可以访问片内RAM的128个单元以及所有特殊功能寄存器 SFR 对SFR既可以用它们的地址也可以使用它们的名字 例 MOVA 69H 69H A指令代码为 E5H 69H 1 内部RAM的低128字节2 SFR 唯一方式 1直接寻址 例 MOVA P0 P0 A指令代码为 E5H 80H 2寄存器间接寻址 在这种寻址方式中 操作数所指定的寄存器中存放的不是操作数本身 而是操作数的地址 可用来做间接寻址的寄存器有R0 R1和DPTR 使用时在其前面加 表示间址 在执行压栈 PUSH 和出栈 POP 操作时 采用堆栈指针SP作间址寄存器 一般当访问片内RAM或片外RAM低256字节存储空间时 用R0或R1作间址寄存器 这时用操作码的最低位指明是R0还是R1 现假设工作寄存器为0组 R1中存放的数是50H 而片内RAM50H单元中的数是30H 则执行该指令后 数30H就送入了累加器A中 如下图所示 例 MOVA R1 R1 A指令代码为 E7H 11100111 注意最低位是1 表明使用的是R1 2寄存器间接寻址 3变址寻址 这种寻址方式是以DPTR或PC作为基址寄存器 累加器A为变址寄存器 变址寻址时 把两者的内容相加 所得的结果作为操作数的地址 这种方式常用于查表操作中 例 MOVCA A DPTR指令代码为 93H 现假设该指令存放在2040单元 ACC中原存放值为E0H DPTR中的值为2000H 则A DPTR形成的地址为20E0H 若20E0H单元中内容为47H 则执行该指令后 ACC中的E0H被47H所取代 例 MOVCA A DPTR指令代码为 93H 47H 3变址寻址 3 2 4位寻址 位寻址是指对片内RAM区的可位寻址区间和某些可位寻址的SFR进行位操作时的寻址方式 在进行位操作时 借助进位位C作为操作累加器 操作数直接给出该位的地址 然后根据操作码的性质对其进行位操作 位地址与直接寻址中的字节地址形式完全一样 主要由操作码来区分 例 SETB3DH指令代码为 D2H3DH 3DH这一位是片内RAM中27H单元的第五位 若假设27H中原内容为00H 则执行该指令后 27H中的内容变为20H 3 2 5指令寻址 指令寻址用在控制转移指令中 它的功能是得到转移的目的位置的地址 因此操作数用于提供目的位置的地址 两种寻址方式 绝对寻址相对寻址 1绝对寻址 绝对寻址是在指令的操作数中直接提供目的位置的地址或地址的一部份 在MCS 51系统中 长转移和长调用提供目的位置的16位地址 绝对转移和绝对调用提供目的位置的16位地址的低11位 它们都为绝对寻址 2相对寻址 相对寻址是将PC中的当前值 它实际是本指令之后的字节地址 与指令第二字节给出的偏移量相加 其结果作为跳转指令的转移地址 指令第二字节给出的偏移量有正 负号 它在指令中以补码的形式给出 所转移的范围为 127 128 例 JC06H指令代码为 40H06H 该指令表示若进位位C 0 则不跳转 若C 1 则以PC中的当前值为基地址 加上偏移量06H 所得结果为该转移指令的目的地址 现假设该指令存放在2000H单元 且C 1 执行示意图如下 2相对寻址 3 3单片机指令系统 3 3 1数据传送指令 29条 传送类指令是指令系统中最基本 使用最多的一类指令 其主要用于数据的传送 保存和交换等 普通传送类指令数据交换指令堆栈操作指令 片内数据存储器传送指令片外数据存储器传送指令程序存储器传送指令 以累加器A为目的操作数的指令 4条 1片内数据存储器传送指令 以Rn为目的操作数的指令 3条 1片内数据存储器传送指令 以直接地址为目的操作数的指令 5条 1片内数据存储器传送指令 以间接地址为目的操作数的指令 3条 1片内数据存储器传送指令 1片内数据存储器传送指令 以DPTR为目的操作数的指令 3条 累加器A与片外RAM传送指令 4条 2片外数据存储器传送指令 查表指令 2条 3程序存储器传送指令 数据交换指令 5条 堆栈操作指令 2条 传送类指令举例 传送类指令举例 例3 若R0的内容为30H 片内RAM30H单元的内容为23H 累加器A的内容为45H 则执行XCHA R0 30H A 若继续执行SWAPA A 45H 23H 32H 注意 区分各种寻址方式的涵义 正确取得传送的数据例 R0 30H 30H 50HMOVA R0 A 30HMOVA R0 A 50HMOVA 30H A 30H 50HMOVA 30H A 30H所有传送指令都不影响标志位 应用举例1 MOVP1 0FEH 11111110B可以使P1 0上的发光二极管点亮MOVP1 0F0H 11110000B可以使P1口上的上面4个发光二极管点亮 5v 8段数码管显示 MOVP1 00H 显示8 MOVP1 0F8H 显示7MOVP1 88H 显示A 应用举例2 一个引脚的高低电平 可以通过 光电耦合器 控制继电器 从而以 弱电 控制 强电 0 1 3 3 2算术运算指令 算术运算类指令主要是对8位数进行算术操作 其中包括加法 减法 加1 减1以及乘法和除法运算 借助溢出标志 可对带符号数进行2的补码运算 借助进位标志 可进行多精度加减运算 也可以对压缩BCD进行运算 算术运算类大多要影响到PSW中的相关位 PSW 1加法指令 4条 在加法运算中 若第7位有进位 则进位位C 1 否则C 0 若第3位向高位有进位 则半进位位AC 1 否则AC 0 若看作是两个带符号数相加 还要考虑溢出位OV 若OV 1 表示产生溢出 1加法指令 4条 例1 A AEH R1 81HADDA R1则 结果 A 2FHC 1OV 1AC 0P 1 例1中 若AEH和81H看作是无符号数 则结果为2FH 此时不考虑OV 若上述两值看作是带符号数 则得到两个负数相加得正数的错误结论 此时OV 1 表示溢出错误 1加法指令 4条 例2 A 18H R0 1BH即 A 10011000 R0 10011011 执行ADDA R0 再对其求补码得 A 10110011 33H 溢出标志OV取决于带符号数运算时的第6位和第7位 若有一个产生进位 而另一个不产生进位 则OV 1 否则OV 0 结果 对 A R0 求补得 A 11101000H R0 11100101 此时OV 0 1加法指令 4条 2带进位加法指令 4条 利用ADDC指令可进行多字节加法运算 3带借位减法指令 4条 上述指令中 C 1表示有借位 C 0表示无借位 OV 1表示带符号的数相减时 从一个正数中减去一个负数结果为负数 或从一个负数中减去一个正数结果为正数的错误情况 和加法类似 溢出标志也由运算时第6 7位的借位位的 异或 而得 3带借位减法指令 4条 例1 A C9H R3 54HC 1执行SUBBA R3 01110100 结果 A 74HC 0OV 1AC 0P 0 3带借位减法指令 4条 若在进行单字节或多字节减法运算前不知道借位位C为何值 则应在运算前对C清0 例3 设进行双字节相减 被减数存放在20H 21H单元 减数存放在30H 31H单元 相减后的差存放在40H 41H单元 3带借位减法指令 4条 SUB1 MOVA 20H 被减数低位字节送ACLRC 清CSUBBA 30H 低位字节相减MOV40H A 将结果送40H单元MOVA 21H 被减数高位字节送ASUBBA 31H 高位字节相减MOV41H A 将结果送41H单元 3带借位减法指令 4条 4乘法指令 1条 5除法指令 1条 6加1指令 5条 6加1指令 5条 7减1指令 4条 8十进制调整指令 1条 8十进制调整指令 1条 A ECH A 52HC 1 KEIL演示 影响标志的指令 算术运算类指令编程举例 MOVA 34HADDA 78HMOV40H AMOVA 12HADDCA 56HMOV41H A 算术运算类指令编程举例 3 3 3逻辑运算指令 24条 逻辑操作类指令共有24条 有与 或 异或 清零 取反 移位操作 这些指令的执行一般不影响PSW 1 循环移位指令 4条 2 求反指令 1条 3 清0指令 1条 4 逻辑或指令 6条 5 逻辑与指令 6条 6 逻辑异或指令 6条 7 逻辑类指令举例 从上例中可见 逻辑操作是按位进行的 ANL操作 用来屏蔽字节中的某些位 需要保留的位用 1 去与 要清除的位用 0 去与 ORL操作 用来对某些位置 1 要保留的位用 0 去或 要置1的位用 1 去或 XRL操作 用来对字节中的某些位取反 要保留的位用 0 去异或 要求反的位用 1 去异或 7 逻辑类指令举例 例2 设两位用ASCII码表示的数 0 9 分别存放在片内RAM单元的40H和41H单元 试把其转换成两位BCD码 并以压缩形式存放在40H单元 ANL40H 0FH 40H单元的ASCII码变换成BCD码MOVA 41HANLA 0FH 41H单元的ASCII码变换成BCD码SWAPA A中高低4位交换ORL40H A 压缩结果送40H单元 7 逻辑类指令举例 这一类指令的功能主要是控制程序转移到新的PC地址上 利用16位地址的长调用 长转移指令可对64K程序存储器的任何一个单元进行访问 利用11位的绝对调用和绝对转移指令 可以访问2KB的空间 另外还有访问一页范围的短相对转移指令以及条件转移指令 3 3 4控制转移类指令 1 无条件转移指令 4条 2 条件转移指令 8条 3 调用子程序及返回指令 4条 3 调用子程序及返回指令 4条 4 空操作指令 1条 5 控制转移类指令举例 5 控制转移类指令举例 5 控制转移类指令举例 MCS 51单片机的特色之一就是具有丰富的位处理功能 位操作指令共有17条 均以位为操作对象 分别完成位传送 位状态控制 位逻辑运算和位条件转移等功能 3 3 5位操作指令 在进行位操作时 位累加器C即为进位位标志C 在汇编语言中 位地址的表达方式有以下4种 1 直接位地址方式 如91H P1 1 2 字节地址位数方式 如P1 0 90H 3 位名称方式 如RS1RS0 4 用户用伪指令事先定义过的符号地址方式 1 位数据传送指令 2条 2 位状态控制指令 6条 2 位状态控制指令 6条 3 位逻辑运算指令 4条 4 位条件转移指令 5条 4 位条件转移指令 5条 4 位条件转移指令 5条 5 位操作指令举例 3 5MCS 51单片机汇编程序设计 3 5 1运算程序例1 多字节无符号数加法设从片内RAM30H单元和40H单元有两个16字节数 把它们相加 结果放于30H单元开始的位置处 设结果不溢出 处理过程 用R0作指针指向30H单元 用R1作指针指向40H单元 用R2为循环变量 初值为16 在循环体中用ADDC指令把R0指针指向的单元与R1指针指向的单元相加 加得的结果放回R0指向的单元 改变R0 R1指针指向下一个单元 循环16次 在第一次循环前应先将CY清零 程序流程图和程序如下 3 5MCS 51单片机汇编程序设计 ORG1000HMOVR0 30HMOVR1 40HMOVR2 16CLRCLOOP MOVA R0ADDCA R1MOV R0 AINCR0INCR1DJNZR2 LOOPEND 3 5MCS 51单片机汇编程序设计 3 5 2数据的拼拆和转换例1 设在30H和31H单元中各有一个8位数据 30H x7x6x5x4x3x2x1x0 3lH y7y6y5y4y3y2y1y0现在要从30H单元中取出低5位 并从31H单元中取出低3位完成拼装 拼装结果送40H单元保存 并且规定 40H y2y1y0 x4x3x2x1x0利用逻辑指令ANL ORL RL等来完成数据的拼拆 处理过程 将30H单元的内容高3位屏蔽 31H单元内容的高5位屏蔽 高低四位交换 左移一位 然后与30H单元的内容相或 拼装后放到40H单元 3 5MCS 51单片机汇编程序设计 ORG0100HMOVA 30HANLA 00011111BMOV30H AMOVA 31HANLA 00000111BSWAPARLAORLA 30HMOV40H AEND 40H y2y1y0 x4x3x2x1x0 A 000 x4x3x2x1x0 A 00000y2y1y0 A 0y2y1y00000 A y2y1y000000 3 5MCS 51单片机汇编程序设计 例2 设片内RAM的20H单元的内容为 20H x7x6x x4x x2x1x0把该单元内容反序后放回20H单元 即为 20H x0 x1x2x3x4x5x6x7可以通过先把原内容右移一位 低位移入CY中 然后将新单元左移一位 CY中的内容移入 通过8次处理即可 由于8次过程相同 可以通过循环完成 移位过程当中必须通过累加器来处理 将20H单元原来的内容先通过R3暂存 结果先通过R4暂存 R2作循环变量 3 5MCS 51单片机汇编程序设计 ORG0200HMOVR3 20HMOVR4 0MOVR2 8LOOP MOVA R3RRCAMOVR3 AMOVA R4RLCAMOVR4 ADJNZR2 LOOPMOV20H R4END另外 由于片内RAM的20H单元在位寻址区 这一问题还可以通过位处理方式来实现 这种方法留给读者自己完成 3 5MCS 51单片机汇编程序设计 例3 在一温度控制系统中 温度0 100C每一个温度值都已经通过温度传感器测得一个两字节的标准电压值 现在R2中给出一个0 100 C的温度值 取得它的标准电压值放于R3 R4中 高字节放在R3中 低字节放在R4中 通过用MOVCA A DPTR查表 两个字节分两次取得 由DPTR指向表首 由放于R2中的温度值得到所查的电压值相对于表首位置的位移量放于累加器A中 由于每一个电压值为两个字节 位移量须用R2中的温度值乘以2得到 第一次取得高字节 第二次位移量加1后查表取得低字节 分别放于R3 R4中 3 5MCS 51单片机汇编程序设计 ORG0300HCHECK MOVDPTR TAB 指向表首MOVA R2 温度值送ARLA 乘2得位移量MOVR1 A 位移量暂存于R1中MOVCA A DPTRMOVR3 A 第一次查得内容送R3MOVA R1 取出暂存的位移量送AINCA 指向高字节MOVCA A DPTRMOVR4 A 第二次查得内容送R4RETTAB DW0056H 0059H 0067H 0076H 电压值表 3 5MCS 51单片机汇编程序设计 3 5 3多分支转移 散转 程序1 用多分支转移指令JMP A DPTR实现的多分支转移程序例1 现有128路分支 分支号分别为0 127 要求根据R2中的分支信息转向各个分支的程序 即当 R2 0 转向OPR0 R2 1 转向OPRl R2 127 转向OPR127 3 5MCS 51单片机汇编程序设计 先用无条件转移指令 AJMP 或 LJMP 按顺序构造一个转移指令表 执行转移指令表中的第n条指令 就可以转移到第n个分支 将转移指令表的首地址装入DPTR中 将R2中的分支信息装入累加器A形成变址值 然后执行多分支转移指令JMP A DPTR实现转移 程序清单如下 MOVA R2RLA 分支信息乘2MOVDPTR TAB DPTR指向转移指令表首址JMP A DPTR

温馨提示

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

评论

0/150

提交评论