C51的指令系统和程序设计.ppt_第1页
C51的指令系统和程序设计.ppt_第2页
C51的指令系统和程序设计.ppt_第3页
C51的指令系统和程序设计.ppt_第4页
C51的指令系统和程序设计.ppt_第5页
已阅读5页,还剩92页未读 继续免费阅读

下载本文档

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

文档简介

第3章80C51的指令系统和程序设计 学习目的1 了解机器语言 汇编语言和高级语言的特点 汇编语言程序的设计步骤 2 理解80C51的寻址方式及相应的寻址空间 3 熟练掌握80C51的111条指令的应用方法和功能 4 掌握汇编语言指令的基本格式 熟悉机器语言指令的格式 5 掌握汇编语言程序的设计思想和设计方法 6 理解子程序的特点和设计中应注意的问题 学习重点和难点1 80C51的寻址方式及相应的寻址空间 2 80C51的指令系统 3 汇编语言程序的设计思想和设计方法 4 子程序设计 3 1指令概述指令是CPU完成某种操作的命令 指令系统是指计算机能够完成各种功能的指令的集合 总体说 计算机的指令越丰富 寻址方式越多 则其总体功能就越强 80C51的指令系统共有111条 从指令的字节数来说 单字节指令49条 双字节指令45条 三字节指令17条 从指令的执行时间来说 单周期指令64条 双周期指令45条 4周期指令2条 从指令中所含操作数的多少来说 无操作数指令3条 单操作数指令35条 双操作数指令69条 三操作数指令4条 3 1 1指令分类80C51的指令系统按照功能的不同可分为5大类 1 数据传送和交换类指令 29条 包括内部8位数据传送指令15条 内部16位数据传送指令1条 外部数据传送指令4条 交换和查表类指令9条 2 算术运算类指令 24条 包括加法指令8条 减法指令4条 乘法指令1条 除法指令1条 加一减一指令9条 BCD码调整指令1条 3 逻辑运算类指令 24条 包括逻辑运算指令20条 循环移位类指令4条 4 控制转移类指令 17条 包括无条件转移类指令4条 条件转移类指令8条 调用和返回类指令5条 5 位操作类指令 17条 包括位传送指令2条 位置位和位清零指令4条 位运算指令6条 位转移指令3条 判CY标志指令2条 3 1 2指令的格式对于80C51系统 汇编语言的指令格式为 标号 操作码操作数或操作数地址 注释 对指令格式中各项的说明如下 1 标号 标号是程序员根据编程需要给指令设定的符号地址 可有可无 标号由1 8个字符组成 第一个字符必须是英文字母 而不能是数字或其它符号 标号后必须用冒号 在程序中 不可以重复使用 2 操作码 操作码表示指令的操作种类 规定了指令的具体操作 例如 ADD 加法操作 MOV 数据传送操作 3 操作数或操作数地址 操作数或操作数地址表示参加运算的数据或数据的存放地址 如果操作数是以它的地址的形式给出 就要先找到这个地址才能找到需要的操作数 操作数和操作数之间必须用逗号分开 操作数一般有以下几种形式 没有操作数项 操作数隐含在操作码中 如RET指令 只有一个操作数 如RLA指令 有两个操作数 如MOVA 0FFH指令 操作数之间以逗号相隔 其中 0FFH项称为源操作数 累加器A项称为目的操作数 有三个操作数 如CJNEA 00H NEXT指令 操作数之间也以逗号相隔 4 注释 注释是对指令的解释说明 用以提高程序的可读性注释前必须以 和指令分开 注释可有可无 3 1 3指令中的符号意义说明在描述80C51指令系统的功能时 约定了一些用于说明操作数及操作数存放方式的符号 这些符号的意义如表3 1所示 表3 180C51指令中的符号意义说明 3 2寻址方式从指令格式可以发现 一条指令最关键的地方就是操作数部分特别是当操作数不是直接给出 而是间接给出时 CPU就要先行寻找操作数 由于操作数可以用不同的方法给出来 所以寻找操作数地址的方式也就不同 寻找操作数地址的方式 称为寻址方式 在80C51单片机中有7种寻址方式 1 立即数寻址 要在数据前加 号 代表这个数是立即数 2 直接寻址 直接寻址中 操作数的地址是直接给出 可以是20H 30H等等 3 寄存器寻址 寄存器寻址的过程与直接寻址一模一样 唯一不同的就是 操作数这时不是放在某一个单元 而是放在某一个寄存器当中 4 寄存器间接寻址 寄存器间接寻址中 操作数的地址是通过某一个寄存器间接得到 5 变址寻址 变址寻址中 操作数的地址是由两个寄存器中内容相加得到 6 相对寻址 操作数是一个相对距离值 7 位寻址 直接对单片机中的位进行操作 3 2 1立即寻址 立即寻址 是指在指令中直接给出参与操作的数据 立即数 的寻址方式 立即数前加 这种寻址方式主要用于对特殊功能寄存器和指定存储单元赋予初始值 例如 MOVA 30H其功能是将30H这个立即数传送给累加器ACC 30H在这里称为立即数指令的机器代码为74H 30H 双字节指令 指令的执行过程如图3 1 a 所示 再例如 MOVR0 12H 其作用是对R0赋予初始值为12H 在80C51单片机中 当要对片外的RAM和I O端口进行访问 或进行查表操作时 通常要对DPTR赋值 例如 MOVDPTR 3456H功能是将3456H这个立即数传送给数据指针DPTR 其中高字节34H送DPH 低字节56H送DPL 指令的机器代码为90H 34H 56H 3字节指令 指令的执行过程如图3 1 b 所示 此外 在80C51单片机的立即寻址中允许使用符号地址 假设程序中有一表格 TABLE DB00H 01H 02H 0FFH则可以用MOVDPTR TABLE指令获得表格的首地址 00110000 00110100 01010110 3 2 2直接寻址 直接寻址 是在指令中直接给出操作数所在存储单元的地址号该地址指示了参与操作的数据所在的字节地址或位地址 这种寻址方式主要用于对特殊功能寄存器和内部RAM 低128B 的访问 例如 MOVA 30H其功能是将内部RAM30H单元的内容送累加器A中 指令的机器代码为E5H 30H 双字节指令 指令的执行过程如图3 2所示 在直接寻址方式中 可以直接用符号地址代替 例如 MOVA P1表示将P1口 地址为90H 的数据送累加器A 30H 00110000 XX 3 2 3寄存器寻址 寄存器寻址 是在指令中给出存放操作数的寄存器名称 Rn A B DPTR等 被寻址寄存器中的内容就是操作数 由于这种寻址是在CPU内部的访问 所以运算速度最快 例如 MOVA R1其功能是将R1 默认为内部RAM01H单元 的内容送累加器A中 指令的机器代码为E9H 单字节指令 指令的执行过程如图3 3所示 说明 对于指令MOVA Rn指令的机器代码为11101xxxB 其中xxx与n的取值 0 7 对应 11101001 R1 XX 3 2 4寄存器间接寻址 寄存器间接寻址 是以指令中指定寄存器 R0 R1 DPTR 的内容作为操作数的地址 再以该地址对应单元中的内容作为操作数 为了区别于寄存器寻址 因此在寄存器间接寻址中的寄存器名称前加地址符号 在寄存器间接寻址中 当访问内部RAM低128B空间 或者访问外部RAM的页内256B空间时 用当前组工作寄存器R0或R1作地址指针 而当访问外部RAM的整个64KB空间时 用DPTR作地址指针 例如 MOVA R1 其功能是以当前组工作寄存器R1的内容 设 40H 作为操作数的地址 然后将内部RAM40H单元的内容送累加器A中 指令的机器代码为E7H 单字节指令 指令的执行过程如图3 4所示 11100111 40H XX R1 3 2 5变址寻址 变址寻址 是将基址寄存器 DPTR PC 与变址寄存器 A 的内容相加 形成一个16位结果 作为操作数的地址 实现对程序存储器的访问例如 MOVCA A DPTR其功能是把DPTR中的内容作为基地址 把累加器A中的内容作为地址偏移量 两者相加后得到一个16位地址 然后把与该地址对应的ROM单元中的内容送累加器A 指令的机器代码为93H 单字节指令 指令的执行过程如图3 5所示 同样寻址方式的指令还有两条 MOVCA A PCJMP A DPTR该类指令常用于编写查表程序 DPH DPL 10010011 12 00 34 1234H XX 1200H 1200H 3 2 6相对寻址 相对寻址 是以程序计数器PC的当前值与指令中给定的8位偏移量相加 其结果作为跳转指令的目的地址 这种寻址方式常用于相对转移指令中 向指令 SJMPrel 含义为当程序执行到上述语句时 在当前语句位置的基础上向前或向后跳转rel中指定的位移量 例如 SJMP25H 其功能是当程序执行到该语句时 在当前语句位置的基础上向前跳转25H的位移量 继续执行程序 指令的机器代码为80H 25H 双字节指令 指令的执行过程如图3 6所示 XX XX 2327H 3 2 7位寻址 位寻址 是指按二进制位 bit 进行的寻址 可寻址位包括片内RAM的20H 2FH共16字节区域的128位和部分特殊功能寄存器的相关位 位寻址是直接寻址方式的一种 其特点是对8位二进制数中的某一位的地址进行操作 可位寻址的位地址的表示形式如下 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表示该位是PSW的第6位 例如 SETBC 将专用寄存器PSW中的CY位置为1 CLRP1 0 将单片机的P1 0清 0 SETB3CH 将内部RAM27H的第4位置 1 3 380C51的指令系统指令系统是计算机所固有的 是表征计算机性能特性的重要指标 同时它也是汇编语言程序设计的基础 80C51的指令系统按照功能的不同可分为5大类 数据传送和交换类 算术运算类 逻辑运算类 控制转移类和位操作类 学习指令系统时 应注意 指令的格式 功能 操作码的含义 操作数的表示方法 寻址方式 源 目的操作数的范围 对标志位的影响 指令的适用范围 正确估算指令的字节数 一般地 操作码占1字节 操作数中 直接地址direct占1字节 data占1字节 data16占两字节 操作数中的A B R0 R7 Ri DPTR A DPTR A PC等均隐含在操作码中 下面分别予以说明 3 3 1数据传送类指令数据传送类指令是把源操作数传送到指定目的操作数 指令执行后 源操作数的内容不变 而目的操作数的内容被修改 若要求在传送时不丢失目的操作数 则用交换传送类指令 数据传送类指令对程序状态字PSW的Cy Ac OV位不产生影响 数据传送类指令寻址范围 累加器A 片内RAM SFR 片外RAM数据传送类指令功能 目的地址 源地址 1 8位数据传送指令 15条 8位数据传送指令是在80C51内部RAM和特殊功能寄存器SFR间的传送 指令助记符为 MOV 源操作数的寻址方式可以是立即寻址 直接寻址 寄存器寻址和寄存器间接寻址 1 以累加器Acc为目的地址的传送指令其功能是将源操作数的内容送入累加器Acc 指令的表现形式如下 MOVA data A dataMOVA direct A direct MOVA Rn A Rn MOVA Ri A Ri 例3 1 以累加器Acc为目的地址的传送指令应用 设 R1 50H 45H 20H 50H 10H MOVA 45H 立即寻址 将8位立即数45H送入累加器 A 45HMOVA 45H 直接寻址 将RAM中45H单元的内容送入累加器 A 20HMOVA R1 寄存器寻址 将R1的内容送入累加器 A 50HMOVA R1 寄存器间接寻址 将R1指示的内存单元50H中的内容送入累加器 A 102 以直接地址为目的地址的传送指令其功能是将源操作数的内容送入片内RAM存储单元 指令的表现形式如下 MOVdirect data direct dataMOVdirect1 direct2 direct1 direct2 MOVdirect A direct A MOVdirect Ri direct Ri MOVdirect Rn direct Rn 例3 2 以直接地址为目的地址的传送指令应用 设 13H 15H 30H 11H A 12H R2 13H MOV20H 23H 立即寻址 将8位立即数23H送内部RAM20H单元 20H 23HMOV20H 30H 直接寻址 将内部30H单元的内容送内部RAM20H单元 20H 11HMOV20H A 寄存器寻址 将累加器A的内容送内部RAM20H单元 20H 12HMOV20H R2 寄存器寻址 将R2的内容送入内部RAM20H单元 20H 13HMOV20H R2 寄存器间接寻址 将R2指示的内存单元13H中的内容送入内部RAM20H单元 20H 3 以通用寄存器Rn为目的地址的传送指令其功能是将源操作数的内容送入当前工作寄存器区的R0 R7中的某一个寄存器 指令的表现形式如下 MOVRn A Rn A MOVRn direct Rn direct MOVRn data Rn data 例3 3 以通用寄存器Rn为目的地址的传送指令应用 设 A 26H 30H 35H MOVR1 A 寄存器寻址 将累加器A的内容送R1 R1 26HMOVR2 30H 直接寻址 将内部30H单元的内容送R2 R2 35HMOVR5 30H 立即寻址 将8位立即数30H送R5 R5 30H4 以通用寄存器间接地址为目的操作数的传送指令其功能是将源操作数的内容送入以R0或R1为地址指针的内部RAM单元中 指令的表现形式如下 MOV Ri A Ri A MOV Ri direct Ri direct MOV Ri data Ri data 例3 4 以通用寄存器间接地址为目的操作数的传送指令应用 设 R0 30H R1 50H 40H 22H A 66H MOV R0 A 寄存器寻址 将累加器A的内容送R0指示的内存单元 30H 66HMOV R1 40H 直接寻址 将内部40H单元的内容送R1指示的内存单元 50H 22HMOV R1 40H 立即寻址 将8位立即数40H送R1指示的内存单元 50H 40H综合上述内容可以看出 内部数据传送指令的传送关系可表示为如图3 7所示 图3 7MOV指令应用关系图 2 16位数据传送指令 1条 当需要对片外的RAM单元或I O端口进行访问时 或进行查表操作时 必须将16位地址赋给地址指针DPTR 这就必须使用16位数据传送指令 这也是80C51指令系统中唯一的一条16位数据传送指令 指令格式为 MOVDPTR data16 属于立即寻址方式 例如 MOVDPTR 2345H 将16位立即数2345H送入地址 指针DPTR DPH 23H DPL 45H3 外部数据传送指令 4条 当80C51CPU与外部数据存储器或I O端口之间进行数据传送时 只能通过累加器Acc进行 其指令助记符为 MOVX 其中的X表示外部 External 指令的表现形式如下 MOVXA DPTR A DPTR MOVX DPTR A DPTR A MOVXA Ri A Ri MOVX Ri A Ri A 注意 1 使用Ri时 只能访问低8位地址为00H FFH的地址段 2 使用DPTR时 能访问0000H FFFFH的地址段 例3 6 从外部设备的3000H端口读入数据 并将该数据送当前工作寄存器R3 MOVDPTR 3000HMOVXA DPTRMOVR3 A4 查表指令 2条 查表指令也称为ROM数据传送指令 功能是实现从程序存储器ROM中读取数据 其指令助记符为 MOVC 其中的C表示代码 Code 指令的表现形式如下 MOVCA A PC A A PC MOVCA A DPTR A A DPTR MOVCA A PC指令是单字节指令 其功能是以程序计数器PC的当前值 下一条指令的起始地址 作为基地址 以累加器A中的内容作为偏移地址量 两者相加后得到一个16位地址 然后把与该地址对应的ROM单元中的内容送累加器A 该指令的优点是不改变PC的状态 仅根据累加器A的内容即可读取表格中的内容 缺点是表格只能存放在该查表指令后面的256B范围内 因此表格只能被一段程序所用 例3 5 将外部RAM的4000H单元初始化设置为0 MOVA 0MOVDPTR 4000HMOVX DPTR A 例3 7 设在程序存储器ROM中存放了字符0 4的ASCII码表 通过查表找出字符3的ASCII码送入当前工作寄存器R1 MOVA 3 机器码74H 03H 占2BADDA 1 偏移量修整 机器码24H 01H 占2BMOVCA A PC 查表 机器码83H 占1BMOVR1 A 机器码F9H 占1BASC DB30h 31h 32h 33h 34h说明 设上述程序段的存放起点在1000H 由于从查表指令到数据表的首地址之间的距离为1B 所以在执行查表指令前必须有偏移量修整 ASCII码表的起点地址为1006H 从 例3 7 可以看出 MOVCA A PC指令执行后 PC的值不发生变化 仍指向下一条指令 该指令的执行过程可分为四个步骤 1 将所查表格数据的位置号 即数据在表格中的位号 如上例中的33H的位置号是3 送累加器A 2 计算偏移量 rel 查表指令到数据表首地址之间的距离 3 偏移量 rel 表格首地址 PC指针的当前值 表格首地址 MOVC指令所在的地址 1 再将rel作为修整量 加入到累加器A 4 执行查表指令MOVCA A PC 将查表的结果送回到累加器A MOVCA A DPTR指令也是单字节指令 其功能是以DPTR作为基址积存器 存放表格的首地址 以累加器A中的内容作为偏移地址量 两者相加后得到一个16位地址 然后把与该地址对应的ROM单元中的内容送累加器A 该指令的优点是执行结果只和地址指令DPTR及累加器A的内容有关 与该指令在程序中的位置和表格的存放位置无关 因此表格的大小和位置可以在64KB程序存储器中任意安排 且同一表格可供多个程序块使用 例3 8 用MOVCA A DPTR指令解例3 7 MOVA 3 机器码74H 03H 占2BMOVDPTR ASC 或取表格首地址 占3BMOVCA A DPTR 查表 机器码83H 占1BMOVR1 A 机器码F9H 占1B ASC DB30h 31h 32h 33h 34h从 例3 8 可以看出 MOVCA A DPTR指令执行后 DPTR的值不发生变化 其执行过程也可分为三个步骤 1 将所查表格数据的位置号 即数据在表格中的位号 如上例中的33H的位置号是3 送累加器A 2 表格首地址送DPTR 3 执行查表指令MOVCA A DPTR 将查表的结果送回到累加器A 5 堆栈指令 2条 在80C51系统之中 设计了一个先进后出 FILO 或后进先出 LIFO 区域 用于临时保护数据及子程序调用 中断调用时保护现场和恢复现场 该区域称为堆栈 在SFR中有一个堆栈指针SP 用以指出栈顶位置 堆栈操作指令的实质是以栈指针SP为间址寄存器的间址寻址方式 堆栈区应避开使用的工作寄存器区和其他需要使用的数据区 系统复位后 SP的初始值为07H 为了避免重叠 一般初始化时要重新设置SP 指令的表现形式如下 PUSHdirect Acc SP SP 1 SP direct Acc POPdirect Acc direct Acc SP SP SP 1 例3 9 交换片内RAM中40H单元与60H单元的内容 设SP的值是4FH 其实SP的值具体是多少并没有多大关系 这里给出一个具体的数值是便于对程序执行的过程进行分析 程序及执行进程如下 PUSH40H SP 1 50H 50H 40H PUSH50H SP 1 51H 51H 60H POP40H 40H 51H SP 1 50HPOP50H 60H 50H SP 1 4FH 6 其他数据传送指令 5条 若进行数据传送时 要求保存目的操作数 则可采用数据交换指令 指令的表现形式如下 1 整字节交换指令 XCHA Rn A Rn XCHA direct A direct XCHA Ri A Ri 2 半字节交换指令 XCHDA Ri A 3 0 Ri 3 03 累加器A高低半字节的交换指令 SWAPA A 3 0 A 7 4 例3 10 换片内RAM中40H单元与60H单元的内容 MOVA 40H A 40H XCHA 60H A 60H MOV60H A 60H A 3 3 2算术运算类指令算术运算指令有加法 减法 乘法和除法四类 对于加 减运算的两个操作数 一个存放在累加器A中 此操作数也为目的操作数 另一个存放在R0 R7或 Ri 片内RAM 中 或是 data 立即数 除加1和减1指令外 其他所有的指令都将影响程序状态字PSW的标志位 指令的表现形式如下 1 不带进位的加法指令 4条 ADDA Rn A A Rn ADDA direct A A direct ADDA Ri A A Ri ADDA data A A data加法运算影响PSW的标志位 如果D3位有进位 则辅助进位标志AC置位 否则AC为0 不管AC原来是什么值 如果D7位有进位 则进位标志CY置位 否则CY为0 不管CY原来是什么值 如果D6位和D7位中一个有进位而另一个无进位 则OV 1 溢出 例3 11 将内部RAM中40H和41H单元的数相加 再把和送到42H单元 MOVA 40HADDA 41HMOV42H A 2 带进位的加法指令 4条 ADDCA Rn A A Rn CY ADDCA direct A A direct CY ADDCA Ri A A Ri CY ADDCA data A A data CY 该类指令主要用于多字节的加法运算 例3 12 加数存放在内部RAM的41H 高位 和40H 低位 被加数存放在43H 高位 和42H 低位 将它们相加 和存放在46H 44H中 CLRCMOVA 40HADDA 42H 低字节相加MOV44H AMOVA 41HADDCA 43H 高字节相加MOV45H ACLRAADDCA 00H 处理进位MOV46H A 3 加1指令 5条 加1指令又称为增量指令 其功能是使操作数所指定的单元的内容加1 INCA A A 1INCRn Rn Rn 1INCdirect direct direct 1INC Ri Ri Ri 1INCDPTR DPTR DPTR 1注意 以上指令仅影响PSW中的奇偶标志位 例3 13 设 A FFH R0 25H 26H 3AH DPTR 2000H 执行下列程序段后 INCAINCR0INC R0INCDPTR结果为 A 00H R0 26H 26H 3BH DPTR 2001H 4 减1指令 4条 减1指令又称为减量指令 其功能是使操作数所指定的单元的内容减1 DECA A A 1DECRn Rn Rn 1DECdirect direct direct 1DEC Ri Ri Ri 1注意 以上指令仅影响PSW中的奇偶标志位 例3 14 设 A FFH R0 27H 26H 3AH执行下列程序段后 DECADECR0DEC R0结果为 A FEH R0 26H 26H 3BH 5 减法指令 4条 减法运算只有带借位的减法指令 而没有不带借位的减法指令 指令的功能是从累加器中减去不同寻址方式的减数以及进位位CY的状态 其差仍存放在累加器A中 如果需要实现不带借位的减法计算 应预先置CY 0 利用CLRC指令 然后用减法指令SUBB实现计算 SUBB对PSW中的所有标志位均产生影响 SUBBA Rn A A Rn CY SUBBA direct A A direct CY SUBBA Ri A A Ri CY SUBBA data A A data CY 例3 15 设 A C9H R2 54H CY 1 执行指令 SUBBA R211001001 A 01010100 R2 101110100结果 A 74H CY 0 AC 0 OV 1 P 0 6 无符号数乘法指令 1条 无符号数乘法指令完成A与B中两个8位无符号数相乘 16位乘积的低位字节放在累加器A 高位字节放在B中 指令格式为 MULAB B A A B 无符号数乘法指令对PSW标志位的影响 Cy位总是被清0的 P是由累加器A中1的个数的奇偶性决定的 乘法运算中 若乘积大于FFH 则OV标志位置1 否则清0 除法运算中 若除数为0 则OV标志位置1 否则清0 例3 16 若 A 80H 128 B 32H 50 执行指令 MULAB后结果为 B 19H A 00H 表示乘积为 BA 1900H 6400 且OV 1 CY 0 7 无符号数除法指令 1条 无符号数除法指令完成A与B中两个8位无符号数相除 商放入累加器A 余数放入寄存器B中 指令格式为 DIVAB A A B B 无符号数乘法指令对PSW标志位的影响 Cy位总是被清0的 P是由累加器A中1的个数的奇偶性决定的 若除数为0 则OV标志位置1 否则清0 例3 17 设 A 0BFH B 32H 执行指令 DIVAB后结果为 A 03H B 29H CY 0 OV 0 8 十进制调整指令 1条 十进制调整指令也称为BCD码修正指令 这是一条专用指令 跟在加法指令ADD或ADDC后面 对运算结果的十进制数进行BCD码修正 使它调整为压缩的BCD码数 以完成十进制加法运算功能 源操作数只能在累加器A中 结果存入A中 调整原则 若Ac 1或A3 0 9 则A A 06H 若Cy 1或A7 4 9 则A A 60H指令格式为 DAA 例3 18 计算93 38 10010011 93 BCD 00111000 38 BCD11001011 CBH 131由于D3 D0 1011 9 且D7 D4 9 因此必须进行十进制调整 11001011B 01100110B 1 00110001B相应程序 MOVA 93HMOVR2 38HADDA R2DAA执行结果 A 31 Cy 1 0V 0 3 3 3逻辑操作类指令逻辑操作类指令用于对2个操作数按位进行逻辑操作 结果送到A或直接寻址单元 常用的逻辑运算和移位类指令有 逻辑与 逻辑或逻辑异或 清0 求反 非 循环移位等24条指令 它们的操作数都是8位的 逻辑运算都是按位进行的 除用于逻辑运算外 还可用于模拟各种数字逻辑电路的功能 进行逻辑电路的设计 1 逻辑与指令 6条 逻辑与指令的运算符号 运算规则是 0 0 0 0 1 0 1 0 0 1 1 常用于屏蔽字节中的某些位 或者使指定位为 0 指令的表现形式如下 ANLA Rn A A Rn ANLA direct A A direct ANLA Ri A A Ri ANLA data A A dataANLdirect A direct direct A ANLdirect data direct direct data 例3 19 读入P1口的数据 将其低4位清0 高4位保留 再把结果放到内部RAM的40H单元 MOVA P1 读入P1口的数据ANLA 0F0H 屏蔽低4位MOV40H A 保存数据 2 逻辑或指令 6条 逻辑或指令的运算符号 运算规则是 0 0 0 0 1 1 1 0 1 1 1 常用于置位字节中的某些指定位 或者使指定位为 1 指令的表现形式如下 ORLA Rn A A Rn ORLA direct A A direct ORLA Ri A A Ri ORLA data A A dataORLdirect A direct direct A ORLdirect data direct direct data 例3 20 将串口缓冲区SBUF中的数据送到内部RAM40H单元 再将其低7位 D6 D0 全部变成1 MOV40H SBUFORL40H 7FH 3 逻辑异或指令 6条 逻辑异或指令的运算符号 运算规则是 0 0 0 1 1 0 0 1 1 1 0 1 常用于使字节中的某些指定位取反 或者用于判断两个字节中的数据是否相等 指令的表现形式如下 XRLA Rn A A Rn XRLA direct A A direct XRLA Ri A A Ri XRLA data A A dataXRLdirect A direct direct A XRLdirect data direct direct data 例3 21 如果 40H 60H 将PSW中的F0位置1 CLRF0MOVA 40HXRLA 60HJNZOUT A 0转移到OUT标号SETBF0OUT 例3 22 将5CH的高位取反 低位保留 1 0 1 1 1 0 0 0 1 0 0 1 1 0 0 0 1 1 1 1 0 1 1 1 B B B 4 累加器A清0和取反指令 2条 指令格式 CLRA A 00HCPLA A A 特点 可以节省存储空间 提高程序执行效率 例3 23 对某一双字节数求补码 若高8位存于R1 低8位存于R0 补码的结果是高8位仍存于R1 低8位存于R0 MOVA R0 低8位数送ACPLA 取反ADDA 01H 加1得低8位数补码MOVR0 A 低8位补码存于R0MOVA R1 高8位数送ACPLA 取反ADDCA 00H 加低8位进位MOVR1 A 高8位补码存于R1 5 循环移位指令 4条 80C51的循环移位指令只能对累加器A进行循环移位 可分为 不带进位的循环左 右移位 RL RR 和带进位的循环左 右移位 RLC RRC 两类 不带进位的循环左 右移位指令 循环左移RLA Ai 1 Ai A0 A7循环右移RRA Ai Ai 1 A7 A0带进位的循环左 右移位指令 循环左移RLCA Ai 1 Ai Cy A7 A0 Cy循环右移RRCA Ai Ai 1 Cy A0 A7 Cy A 0 A 7 A 0 A 7 A 0 A 7 CY A 0 A 7 CY 3 3 4控制转移类指令为了控制程序的执行方向 80C51提供了17条控制转移指令 可分为无条件转移指令 条件转移指令 子程序调用及返回指令 编程的灵活性取决于控制转移类指令 特别是条件转移指令 转移类指令丰富就能很方便地实现程序的向前 向后跳转 并根据条件分支运行 循环运行 调用子程序等 这些指令功能是通过修改程序计数器PC内容来实现 因为PC的当前值是将要执行的下一条指令的地址 除了CJNE影响PSW的进位标志位Cy外 其余均不影响PSW的标志位 1 无条件转移指令 4条 无条件转移指令是指无需条件的程序转移 当执行到无条件转移指令时 就直接转移到该指令所提供的地址去 在程序设计中使用转移指令时指令中的地址或偏移量均可直接采用标号 因为在执行程序前进行汇编成时 编译系统会给每一个标号赋予一个实际的二进制地址 指令的表现形式如下 1 长转移指令 LJMPaddr16 PC addr16LJMP称为长转移指令 其机器码为 02H a15 a8B a7 a0B 占3B 执行这条指令时就将addr16的内容赋给PC 程序无条件的转移到的程序存储器PC中与addr16对应地址单元执行 跳转范围64KB 例如 在程序存储器0000H单元存放一条指令LJMP0100H 表示上电复位后程序将跳到0100H单元去执行用户程序 但是实际编程时一般会以标号代替addr16 因此 LJMP0100H指令可改写为LJMPMAIN 这里的MAIN为标号 2 绝对转移指令 AJMPaddr11 PC PC 2 PC10 PC0 addr11AJMP称为绝对转移指令 其机器码为 a10a9a800001B a7a6a5a4a3a2a1a0B 占2B 指令中包含11位 2 11 2KB 的转移地址码addr11 a10 a0 转移目标地址必须和AJMP指令的下一条指令首字节处于同一2KB区域内 且转移目标地址为 PC当前值的高5位保持不变低11位用addr11填充 形成新的目标地址 地址形成示意图如图3 10所示 PC高5位 保持不变 PC低11位 程序计数器PC AJMPaddr11 PC 2 PC addr11 PC 10 PC 0 图3 10 3 相对转移指令 SJMPrel PC PC 2 rel相对转移指令的机器码为 80H rel 占2B 由于rel是一个用补码表示的带符号的8位二进制数 所以其相对转移范围为 128 127 共256B区域 转移目标地址为 源地址 2 rel PC当前值 PC 2 rel 若偏移量rel为FEH 2的补码 则转移目标地址就等于源地址即程序始终运行SJMP指令 相当于动态停机 这弥补了80C51没有专用停机指令的遗憾 动态停机的软件实现 HERE SJMPHERE或者写为 SJMP 表示该指令首字节所在的地址 此时可省略标号 4 间接 散 转移指令 JMP A DPTR PC DPTR A JMP为单字节指令 指令的机器码为73H 转移目标地址为由 A DPTR 形成 并直接送入PC 指令对A DPTR和标志位均无影响 本指令可代替众多的判别跳转指令 又称为散转指令 多用于多分支程序结构中 2 条件转移指令 8条 条件转移指令是依据某种特定条件而实现转移的指令 当条件满足时发生转移 相当于执行一条件相对转移指令 当条件不满足时 顺序执行下一条指令 判定条件的方法主要有三种情况 判断累加器的内容是否为0 判断两个数是否相等和判断减1是否为0 在执行条件转移指令时 PC指针已经指向下一条指令的首地址 PC当前值 若条件满足 转移目标地址 PC当前值 偏移量rel若条件不满足 目标地址 PC当前值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指令的转移范围 rel的取值范围是在执行当前转移指令后的PC值基础上的 128 127 用补码表示 范围内 可以采用符号地址表示 偏移量rel的计算方法 rel 转移目标地址 转移指令地址 当前PC值 2 例3 24 根据内部RAM30H单元的内容对寄存器R2赋值 若 30H 0 则R2 40H 否则R2 30H MOVA 30HJZOUT 若 30H 0则转移MOVR2 30H OUT MOVR2 40H 例3 25 将外部数据存储器中ADDR1开始的一个数据块传送到内部数据存储器ADDR2开始的单元中 当遇到传送的数据为零时停止 分析 对外部RAM单元的访问必须使用MOVX指令 其目的操作数为累加器A 即必须首先将外部RAM单元的值读入到累加器A中 然后再写入片内RAM中 根据题意 将外部RAM的值读入累加器A后 需要利用判零条件决定是否要继续读片外RAM的值 参考源程序如下 MOVDPTR ADDR1 外部数据块首址送DPTRMOVR1 ADDR2 内部数据块首址送R1NEXT MOVXA DPTR 读外部RAM数据HERE JZHERE A 0 动态停机MOV R1 A 数据传送至内部RAM单元INCDPTR 修改地址指针 指向下一地址单元INCR1SJMPNEXT 取下一个数说明 从HERE JZHERE看出 当A 0时 程序转移到标号为HERE的地址 但是HERE还是本条语句 实现数据为零停止 2 减1非零转移指令DJNZRn rel Rn Rn 1 若 Rn 0 则转移PC PC 2 rel 若 Rn 0 则程序顺序执行PC PC 2DJNZdirect rel direct direct 1 若 direct 0 则程序顺序执行PC PC 3 若 direct 0 则转移PC PC 3 rel0 例3 26 将内部RAM中30H 3FH的数依次送到70H 7FH单元中 MOVR0 30H 数据源首地址MOVR1 70H 数据存放目标首地址MOVR2 10H 数据个数LOOP MOVA R0 取一个数MOV R1 A 传送一个数INCR0 修改源地址指针INCR1 修改目的地址指针DJNZR2 LOOP 传送完 例3 27 将5000H 501FH开始的外部RAM单元清零 START MOVR0 20H 循环次数MOVDPTR 5000H 数据首地址MOVA 00H A 0LOOP MOVX DPTR A DPTR 0INCDPTR 修改地址指针DJNZR0 LOOP 传送完 3 比较 不相等 转移指令比较转移指令的格式 CJNE rel说明 1 当为A时 可以是 data direct 2 当为Rn Ri时 只能是 data 比较转移指令的比较实质是减法运算 影响Cy标志位 但不保存最后的差值 并且两个操作数的内容不变 比较 不相等 转移指令的机器码占3B 指令的表现形式为 CJNEA data relCJNEA direct relCJNERn data relCJNE Ri data rel若 则程序顺序执行 PC PC 3 CY 0若 则程序转移 PC PC 3 rel CY 0若 则程序转移 PC PC 3 rel CY l 例3 28 如果 A 00H 执行SUB1程序段 如果 A 10H 执行SUB程序段 如果 A 20H 执行SUB3程序段 其功能程序段如下 CJNEA 00H NEXT1SJMPSUB1NEXT1 CJNEA 10H NEXT2SJMPSUB2NEXT2 CJNEA 20H NEXT3SUB3 SUB2 SUB1 NEXT3 3 子程序调用和返回指令 4条 在程序设计中 为了简化程序结构 减少程序所占的存储空间 往往将需要反复执行的某段程序编写成子程序 供主程序在需要时调用 一个子程序可以在程序中反复多次调用 为了实现主程序对子程序的一次完整调用 必须有子程序调用指令和子程序返回指令 子程序调用指令在调用程序中使用 而子程序返回指令则是被调用子程序的最后一条指令 调用与返回指令是成对使用的 当执行调用指令时 自动把程序计数器PC中的断点地址压入到堆栈中 并自动将子程序入口地址送入程序计数器PC中 当执行返回指令时 自动把堆栈中的断点地址恢复到程序计数器PC中 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范围以内调用子程序 3 子程序返回指令RET PC 15 8 SP SP SP 1 PC 7 0 SP SP SP 14 中断返回指令RETI PC 15 8 SP SP SP 1 PC 7 0 SP SP SP 1说明 中断服务程序是一种特殊的子程序 它是在计算机响应中断时 由硬件完成调用而进入相应的中断服务程序 RETI指令与RET指令相仿 区别在于RET是从子程序返回 RETI是从中断服务程序返回 无论是RET还是RETI都是子程序执行的最后一条指令 4 空操作指令 1条 CPU不执行任何操作 消耗了一个机器周期 常用于软件延时或在程序可靠性设计中用来稳定程序 NOP PC PC 1 3 3 5位操作指令位操作又称布尔变量操作 它是以位为单位来进行运算和操作的 80C51系统内设置了一个位处理器 布尔处理机 它有自己的累加器 借用进位标志CY 存储器 位寻址区中的各位 也有完成位操作的运算器等 有一套位变量处理的指令集 1 位传送指令 2条 MOVC bit CY bit MOVbit C bit CY 例3 29 将位地址为20H的内容传送到P1 0 MOVC 20H CY 24H 0 MOVP1 0 C P1 0 CY 2 位置位和位复位指令 4条 对进位标志CY以及位地址所规定的各位进行置位 置1 或复位 置0 操作 SETBC 使CY 1 置位 SETBbit 使指定的位地址等于1 置位 CLRC 使CY 0 复位 CLRbit 使指令的位地址等于0 复位 3 位运算指令 6条 位运算指令中 只有位逻辑与 位逻辑或和位取反运算 对于其它位逻辑运算可以参照布尔代数的运算规则 ANLC bit 位与 CY CY bitANLC bit 位与 CY CY bitORLC bit 位或 CY CY bitORLC bit 位或 CY CY bitCPLC 位取反 CY CYCPLbit 位取反 bit bit 例3 30 设X Y Z表示位地址 请完成Z X Y异或运算 分析 异或运算可表示为 Z X Y XY XYMOVC X CY X ANLC Y CY X Y MOVZ C 暂存结果于Z中MOVC Y CY Y ANLC X CY X Y ORLC Z CY X Y X Y MOVZ C 保存异或结果于Z中 4 位转移指令 3条 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 否则顺序执行 例3 31 假设80C51P2口连接8只发光二极管 若P3 4为 1 全亮 否则全灭 ORG0000HSTART JBP3 4 LED8 若P3 4 1 则全亮MOVA 0 若P3 4 0 则全灭MOVP2 ASJMPSTARTLED8 MOVA 0ffh 全亮MOVP2 ASJMPSTARTEND 仿真链接 5 判CY标志指令 2条 JCrel 若 Cy 1 则转移 PC PC 2 rel 否则顺序执行JNCrel 若 Cy 0 则转移 PC PC 2 rel 否则顺序执行 例3 32 假设80C51P2口连接8只发光二极管 若P3 4为 1 全亮 否则全灭 ORG0000HSTART MOVC P3 4 读P3 4JCLED8 若P3 4 1 则全亮MOVA 0 若P3 4 0 则交叉点亮MOVP2 ASJMPSTARTLED8 MOVA 0ffh 全亮MOVP2 ASJMPSTARTEND 仿真链接 3 3 6常用伪指令80C51单片机的111条汇编指令中 未涉及到变量 常量和数组的定义 也未涉及到存储空间分配的定义 为了解决这些问题 所以80C51单片机提供了伪指令来解决上述问题 伪指令不是真正的指令 没有对应的机器码 在汇编时不产生供CPU直接执行的机器码 即目标程序 只是用来对汇编过程进行某种控制 例如 规定汇编生成的目标程序在程序存储器中的存放区域 给源程序中的符号或标号赋值以及指示汇编的结束等 常用伪指令如下 1 定位

温馨提示

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

评论

0/150

提交评论