第3章MCS51系列单片机的指令系统及汇编语言程序设计_第1页
第3章MCS51系列单片机的指令系统及汇编语言程序设计_第2页
第3章MCS51系列单片机的指令系统及汇编语言程序设计_第3页
第3章MCS51系列单片机的指令系统及汇编语言程序设计_第4页
第3章MCS51系列单片机的指令系统及汇编语言程序设计_第5页
已阅读5页,还剩73页未读 继续免费阅读

下载本文档

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

文档简介

第3章 MCS 51系列单片机的指令系统及汇编语言程序设计 本章要点 MCS 51单片机的7种寻址方式MCS 51单片机的指令系统汇编语言的基本格式程序结构及其设计方法典型应用程序的设计 3 1指令系统概述3 1 1汇编指令格式3 1 2指令描述符号介绍 MCS 51单片机汇编语言指令格式为 2 1 1汇编指令格式 MCS 51单片机汇编语言指令由以下几个部分组成 标号操作码操作数或操作数地址注释 标号标号是程序员根据编程需要 给指令设定的符号地址 可有可无 标号由1 8个字符组成 第一个字符必须是英文字母 不能是数字或其它符号 标号后必须用冒号 在程序中 不可以重复使用 操作码操作码表示指令的操作种类 规定了指令的具体操作 比如 ADD 加操作 MOV 数据的传送操作 操作数或操作数地址操作数或操作数地址表示参加运算的数据或数据的地址 操作数和操作码之间必须用空格分开 有两个以上操作数的操作数之间用逗号分隔 操作数一般有以下几种形式 没有操作数项 操作数隐含在操作码中 如RET指令 只有一个操作数 如CPLA指令 有两个操作数 如MOVA 00H指令 操作数之间以逗号相隔 有三个操作数 如CJNEA 00H NEXT指令 操作数之间也以逗号相隔 注释注释是对指令的解释说明 用以提高程序的可读性 注释前必须以 和指令分开 注释在每条指令后都可以设有 Rn当前工作寄存器中的某一个 即R0 R7 RiR0或者R1Direct单片机内部RAM低128字节 00h 7fh 中的某个字节地址 或者是某个专用寄存器的名字 data8位 1字节 立即数 data1616位 2字节 的立即数Addr1616位目的地址 在LJMP和LCALL的指令中采用Addr1111位目的地址 只在AJMP和ACALL指令中采用Rel相对转移指令中的偏移量 DPTR数据指针 由DPH和DPL构成 Bit内部RAM 包括专用寄存器 中可寻址位的地址或名字 2 1 2指令中符号的意义说明 A累加器ACCBB寄存器 间接寻址标志 加在位地址前 表示对该位状态取反 X 某寄存器或某单元的内容 X 由X间接寻址的单元中的内容 操作数是指令的重要组成部分 指出了参与操作的数据或数据的地址 寻找操作数地址的方式称为寻址方式 一条指令采用什么样的寻址方式 是由指令的功能决定的 寻址方式越多 指令功能就越强 MCS 51指令系统共使用了7种寻址方式 立即寻址直接寻址寄存器寻址寄存器间接寻址位寻址变址寻址相对寻址 3 2MCS 51单片机的寻址方式 MOVA 40H 将40H这个立即数传送给累加器ACC 符号称为立即数符号 40H在这里称为立即数 立即数寻址是指将操作数直接写在指令中 比如 MOVDPTR 6789HMOVR0 23H A XX 40H 3 2 1立即寻址 寄存器寻址是指将操作数存放于寄存器中 寄存器包括工作寄存器R0 R7 累加器A 通用寄存器B 地址寄存器DPTR等 MOVA R0数据存放在R0 R7中的某个通用寄存器内 或者放在某个专用寄存器中 e g MOVA R7ADDA R0 3 2 2寄存器寻址 操作过程 MOVA R0 设R0的值为40H R0 A XX 40H 直接寻址是指把存放操作数的内存单元的地址直接写在指令中 在MCS 51单片机中 可以直接寻址的存储器主要有内部RAM区和特殊功能寄存器SFR区 MOVA 30H 将内部RAM30H单元内的数传送给累加器ACC MOVTMOD 20h TMOD定时器方式控制寄存器 属于SFRADDA 30H 片内RAM30H单元的数据加到累加器ACCINC70H 片内RAM70H单元的数据加1MOV30H 70H 片内RAM70H单元的数据传送到30H单元 DEC50H 片内RAM50H单元的数据减1例如 MOVA 30H 假如 30H 55H 30H XX A 55H 3 2 3直接寻址 3 2 4寄存器间接寻址在51单片机中有两个寄存器可以用于间接寻址 它们是R0和R1 当指向片外的64KB的RAM地址空间时 可用DPTR作间接寄存器 MOVA R0假如R0寄存器中的数据是50H 则以上指令的意思是 将内部RAM中50H单元内的数传送给累加器ACC e g 假如R1内的数是70H 在内部RAM的70H单元中存放的数据是00H 在执行以下指令后 外部RAM中3FFFH单元的内容是00H MOVA R1MOVDPTR 3FFFHMOVX DPTR A 以R0作为间址寄存器方式 MOVA R0 以DPTR作为间址寄存器方式 MOVDPTR 3FFFHMOVXA DPTR 3 2 5变址寻址 EG MOVCA A DPTR指令含义 假设在执行指令前 数据指针DPTR中的数据是1000H 累加器ACC中的数据是50H 则上述指令执行的操作是将 程序存储器1050H单元中的数据传送给累加器ACC 同样寻址方式的指令还有两条 MOVCA A PCJMP A DPTR该类指令常用于编写查表程序 指令 MOVCA A DPTR工作过程 3 2 6相对寻址 在跳转程序中有一种相对寻址方式 程序的书写方式是 SJMPrel程序含义 当程序执行到上述语句时 在当前语句位置的基础上向前或向后跳转rel中指明的位置 范例JZrelCJNEA DATA relDJNZR0 rel 3 2 7位寻址 当单片机要进行某一位二进制数操作时 可采用位寻址 Eg SETBC指令含义 将专用寄存器PSW中的CY位置为1 CLRP1 0 将单片机的P1 0清 0 SETBP1 0 将单片机的P1 0置 1 MCS 51单片机指令系统包括111条指令按功能可以划分为以下5类 数据传送和交换指令 29条 算术运算指令 24条 逻辑运算指令 24条 控制转移指令 17条 位操作指令 17条 3 3MCS 51系列单片机的指令系统 2 2 1数据传送和交换类指令 常用助记符 MOV单片机内部RAM中的数据传递MOVX累加器和单片机外部数据存储器间数据传递MOVC累加器和程序存储器之间的数据传递XCH累加器和某个内部RAM单元进行数据交换XCHD累加器和某个内部RAM单元进行低半字节数据交换PUSH将某个内部RAM单元的数据压入堆栈POP将堆栈内的数据弹出 数据传送和交换类指令主要有以下几种 内部数据传递指令数据指针赋值指令片外数据传送指令ROM数据访问指令栈操作指令数据交换指令 一 内部数据传送指令1 以累加器A为目的操作数的传送指令 4条 MOVA data A dataMOVA direct A direct MOVA Rn A Rn MOVA Ri A Ri Eg MOVA 30H Eg MOVA 10H Eg MOVA R0 Eg MOVA R2 注意 在使用Ri进行间址寻址时 只能够使用R0和R1 2 以通用寄存器Rn为目的的传送指令 3条 MOVRn A Rn A MOVRn direct Rn direct MOVRn data Rn data Eg MOVR2 A Eg MOVR2 30H Eg MOVR2 30H 以直接地址为目的的传送指令 5条 MOVdirect data direct dataMOVdirect1 direct2 direct1 direct2 MOVdirect A direct A MOVdirect Ri direct Ri MOVdirect Rn direct Rn Eg MOV30H 33H Eg MOV30H 31H Eg MOV30H R0 Eg MOV30H A Eg MOV30H R3 以通用寄存器间接地址为目的的传送指令 3条 MOV Ri A Ri A MOV Ri direct Ri direct MOV Ri data Ri data Eg MOV R1 A Eg MOV R1 30H Eg MOV R1 30H 二 数据指针赋值指令 16位数据指针 当要对片外的RAM和I O接口进行访问时 或进行查表操作时 通常要对DPTR赋值 指令为 MOVDPTR data16 Eg 将数据指针DPTR指向存于ROM中的表格首地址 MOVDPTR TABLE Eg 将数据指针DPTR指向外部RAM的2000H单元 MOVDPTR 2000H 三 片外数据传递指令 使用DPTR和Ri进行间接寻址MOVXA DPTR A DPTR 片外MOVXA Ri A Ri 片外MOVX DPTR A DPTR 片外 A MOVX Ri A Ri 片外 A 注意 该指令用于在单片机和外部RAM 扩展I O的数据传送 使用Ri时 只能访问低8位地址为00H FFH地址段 使用DPTR时 能访问0000H FFFFH地址段 应用举例 例 MOVDPTR 2003HMOVA 00HMOVX DPTR A指令执行过程 注意 只有累加器A才能把数据传到外部RAM 或接收从外部数据存储器传回的数据 比如 MOVX20H DPTRMOVX DPTR SBUFMOVX DPTR R2MOVX DPTR R1都是错误的思考 如果要将内部RAM中40H单元中的数据传递到外部RAM的2000H单元中 应如何解决 试写出相应程序 MOVDPTR 2000HMOVA 40HMOVX DPTR A 四 查表指令 指令格式 MOVCA A DPTR A A DPTR MOVCA A PC A A PC Eg MOVDPTR 3000HMOVA 55HMOVCA A DPTR ROM数据传送指令 2条 例 在累加器A中存放有0 9间的某个数 现要求查出该数的7段共阴显示代码 并将代码传回累加器 解决方案 在程序存储器中划出一个区域用于存放0 9的7段共阴显示代码 比如将代码存放在0400H开始的地方 程序如下 MOVDPTR 0400HMOVCA A DPTR ORG0400HDB3FH 0的7段共阴显示代码DB06H 1的7段共阴显示代码DB5BH 2的7段共阴显示代码DB4FH 3的7段共阴显示代码DB66H 4的7段共阴显示代码 注意 我们只能将程序存储器中的数据传出 读出 而不能将数据传入 写入 程序存储器 因此 语句 MOVC A DPTR AMOVC A PC A都是错误的 思考题 MCS 51单片机的运算能力比较差 想想能不能够利用查表方式进行函数y sin x 的运算 五 堆栈操作指令 堆栈操作指令包含入栈 PUSH 和出栈 POP 在使用堆栈之前要首先给堆栈指针SP赋值 指令格式 PUSHdirectPOPdirect注意 先入后出原则程序举例 MOVSP 30HPUSHSBUF SP SP 1 31H SBUF PUSH60H SP SP 1 32H 60H POP60H 60H 32H SP SP 1POPSBUF SBUF 31H SP SP 1 六 字节交换指令 字节交换指令指内部RAM中的某个单元和累加器A之间进行数据交换 可以是整个字节 也可以是半个字节 包含3种交换方式 1 整字节交换指令 XCHA Rn A Rn XCHA direct A direct XCHA Ri A Ri 2 半字节交换指令XCHDA Ri A 3 0 Ri 3 0 3 累加器A高低半字节的交换指令SWAPA 例 假设在执行指令之前 A 70H 则在指令执行完后 A 07H 3 3 2算术运算指令 算术运算指令有加法 减法 乘法和除法四类 除加1和减1指令 其他所有的指令都将影响PSW的标志位 程序状态字PSW 一 加法指令 ADDA Rn A A Rn ADDA direct A A direct ADDA Ri A A Ri ADDA data A A data例 将内部RAM中40H和41H单元的数相加 再把和送到42H单元 MOVA 40HADDA 41HMOV42H A 1 不带进位的加法指令 加法运算对PSW标志位的影响1 在上例中 如果运算结果超出FFH 255 将产生进位 PSW的CY位将被置1 2 若预先说明40H和41H中放置的是有符号数 则在运算指令 ADDA 41H 执行后 还要检查PSW中溢出位OV的状态 如果OV位为1 则运算结果错误 溢出产生的条件 在运算时 如果D6位和D7位中一个有进位而另一个无进位 则OV 1 溢出 即 OverFlow C6 C7OverFlow 1 溢出OverFlow 0 无溢出 溢出发生在有符号数的运算中 同符号数相加或异符号数相减 则可能发生溢出 异号数相加一定不会产生溢出 2 带进位的加法运算 该类指令主要用于多字节的加法运算ADDCA Rn A A Rn CY ADDCA direct A A direct CY ADDCA Ri A A Ri CY ADDCA data A A data CY 如果加数和被加数是无符号数 则在计算后要注意是否产生进位 如果加数和被加数是有符号数 则在计算后要注意是否溢出 只要溢出 则运算结果错误 如果无溢出 则注意是否有进位 例 加数存放在内部RAM的41H 高位 和40H 低位 被加数存放在43H 高位 和42H 低位 将它们相加 和存放在46H 44H中 程序 CLRCMOVA 40HADDA 42HMOV44H AMOVA 41HADDCA 43HMOV45H ACLRAADDCA 00HMOV46H A 3 加1指令 INCA A A 1INCRn Rn Rn 1INCdirect direct direct 1INC Ri Ri Ri 1INCDPTR DPTR DPTR 1注意 以上所有指令不会影响PSW中的各个标志位 例 设 A FFH R0 25H 26H 3AH DPTR 2000H执行程序 INCAINCR0INC R0INCDPTR结果为 A 00H R0 26H 26H 3BH DPTR 2001H 二 减法指令 SUBBA Rn A A Rn CY SUBBA direct A A direct CY SUBBA Ri A A Ri CY SUBBA data A A data CY 如果减数和被减数是无符号数 则在计算后要注意是否产生借位 如果减数和被减数是有符号数 则在计算后要注意是否溢出 只要溢出 则运算结果错误 如果无溢出 则注意是否有借位 1 带借位的减法指令 2 减1指令 DECA A A 1DECRn Rn Rn 1DECdirect direct direct 1DEC Ri Ri Ri 1注意 减1指令也不会影响PSW的各个标志位 思考 设 A FFH R0 27H 26H 3AH执行程序 DECADECR0DEC R0结果 A R0 26H 例 设 A C9H R2 54H CY 1 执行指令SUBBA R21100100101010100 101110100结果 A 74H 借位位 CY 0 三 BCD码调整指令 DAA这条指令用于对BCD编码的十进制数相加结果进行调整 例 10010011 93 BCD 00111000 38 BCD11001011 CBH 131相应程序 MOVR2 93HMOVA 38HADDA R2DAA 四 乘法和除法指令 MULAB指令含义 将 A B 乘积的低位字节放在A中 高位字节放在寄存器B中 对PSW状态位的影响 Cy位被清0乘积大于FFH时 OV位为1 Eg MOVA 87HMOVB 0ABHMULAB则 A 2DH B 5AH OV 1 1 乘法指令 2 除法运算 DIVAB指令含义 将 A B 将商放入A 余数放入寄存器B中 对PSW标志位的影响 Cy位被清0如果除数 B 0 则OV位被置1 表示除法无意义 不能进行 EG MOVA 100MOVB 26DIVAB则 A 03B 22 16H CY 0 3 3 3逻辑运算指令 该类指令包含与 或 非 清0 异或和移位指令等共24条 这些指令都不会影响PSW的各标志位 一 逻辑 与 运算指令ANLA Rn A A Rn ANLA direct A A direct ANLA Ri A A Ri ANLA data A A dataANLdirect A direct A direct ANLdirect data direct direct data 例 A 78H R1 37H 则执行指令ANLA R1后 A 30H A 01111000 R1 00110111 A 00110000程序设计 读入P1口的数据 将其低4位清0 高4位保留 再把结果放到内部RAM的40H单元 MOVP1 0FFH 使P1口置位输入方式 先要写1MOVA P1 读P1口数据到AANLA 0F0H A的高4位和0f与 不变 低4位和0与 清0MOV40H A 把Acc的值写到片内RAM40H单元 二 逻辑 或 运算指令 ORLA Rn A A V Rn ORLA direct A A V direct ORLA Ri A A V Ri ORLA data A A VdataORLdirect A direct A V direct ORLdirect data direct direct Vdata 逻辑或指令也称逻辑加指令 可以用于对累加器A或者RAM单元的内容 特别是对特殊功能寄存器的内容进行变换 使其中的某位置1而其余位不变 或运算举例 假设 A 60H 30H 79H 则执行指令ORLA 30H后 A 79H A 01100000 30H V0111100101111001程序设计举例 将串口缓冲区SBUF中的数据送到内部RAM40H单元 再将其低7位 D6 D0 全部变成1 MOV40H SBUFORL40H 7FH 三 逻辑 异或 运算 XRLA Rn A A Rn XRLA direct A A direct XRLA Ri A A Ri XRLA data A A dataXRLdirect A direct A direct XRLdirect data direct direct data 可以用于对累加器A或者RAM单元的内容 特别是对特殊功能寄存器的内容进行变换 使其中的某位取反而其余位不变 异或运算举例 假设 A 45H 60H 78H 则在执行指令 XRLA 60H后 A 3DH A 01000101 60H 0111100000111101异或指令可用于判断两个字节中的数据是否相等 程序设计 如果 40H 60H 将PSW中的F0位置1 CLRF0MOVA 40HXRLA 60HJNZOUTSETBF0 40h 60h f0 1 out 40h 60h 四 累加器清0和取反指令 累加器清0指令CLRA A 0累加器按位取反指令CPLA A A例 假设 A 89H 在执行指令CPLA后 A 76H89H 10001001取反 01110110 76H 五 移位指令 RLA左环移 累加器A 累加器A Cy 累加器A Cy 累加器A RRCA带进位位右环移 RRA右环移 RLCA带进位位左环移 MCS 51系列单片机中移位指令比较少 移位只能对累加器A进行 共有循环左移 循环右移 带进位的循环左移和右移四种 六 累加器A高4位和低4位互换 1条 SWAPA A3 0 A7 4该指令的功能是将累加器A高4位和低4位相互交换 例3 19设片内RAM的30H 31H单元中连续存放有4个压缩型BCD码数据 试编一程序将这4个BCD码倒序排列 解 一个压缩型BCD码占有4位二进制数 2个字节单元中共有4个BCD码数据 要倒序就必须将两个字节单元中的高四位与低四位互相交换 再将两个字节单元的内容互相交换即可 相应程序如下 MOVA 30H A 30H a0a1SWAPA A7 4 A3 0 A a1a0XCHA 31H A 31H A a2a3 31H a1a0SWAPA A a3a2MOV30H A 30H a3a2 3 3 4位操作指令 17条 1 位数据传送指令MOVC bit C bitMOVbit C bit C 3 位运算指令ANLC bit C C bitANLC bit C C bitORLC bit C C bitORLC bit C C bitCPLC C CCPLbit bit bit 3 3 5控制转移指令 在编写一个略复杂的控制程序时 不免要涉及到程序的跳转和子程序调用 这时就要用到转移类指令 转移类指令包含有条件转移和无条件转移两种一 无条件转移指令组1 长转移指令LJMP目标语句说明 目标语句可以是程序存储器64KB空间的任何地方 2 绝对转移指令AJMP目标语句例 4002HAJMPMM 4600HMM MOVA 00H注意 目标语句必须和当前语句同页 在51单片机中 64KB程序存储器分成32页 每页2KB 7FFH 比如 0000H 07FFH0800H 0FFFH1000H 17FFH1800H 1FFFH 3 短转移指令SJMP目标语句 rel 转移目的地址 PC 2 rel 所以rel 转移目的地址 PC 2但 实际使用中常写成SJMPaddr16 汇编时会自动转换成rel 例 4060HSJMPLOOP 4090HLOOP MOVA 0FFH 注意 短跳转的目标语句地址必须在当前语句向前128 80H 字节 向后127 7FH 字节 否则在进行程序编译时肯定出错 4 间接转移指令JMP A DPTR该指令主要用于多分支的跳转程序设计 跳转的目标地址是累加器A和数据指针DPTR之和 它可以是64KB存储空间的任何地方 程序设计举例 如果 A 00H 执行SS子程序 如果 A 01H 执行MM子程序 如果 A 02H 执行XX子程序 ORG4000HMOVDPTR 5000HMOVR2 ACLRCRLCAADDA R2JMP A DPTR ORG5000H5000HLCALLSS5003HLCALLMM5006HLCALLXX 二 条件转移指令 所谓条件转移 指指令中规定的条件满足时 程序跳转到目标地址 1 累加器A判零转移指令JZ目标地址 rel 如 A 0 跳到目标语句 如 A 0 顺序执行下 一条指令JNZ目标地址 rel 如 A 0 跳到目标语句 如 A 0 顺序执行下一条 指令目标地址rel 偏移量 实际使用中常写成addr16 16位的符号地址 汇编时会自动转换成rel 注意 目标语句的地址是相对地址 应该在当前语句向前不超过128字节 向后不超过127字节 程序举例 MOVA 10HJZOUTMOVR2 30H OUT RLCA 2 判位转移指令 该类指令的功能是检测指定位是1还是0 若条件符合 则CPU转向指定的目标地址去执行程序 否则 顺序执行下条指令 JCrel 若Cy 1 则PC PC 2 rel 若Cy 0 PC PC 2JNCrel 若Cy 0 则PC PC 2 rel 若Cy 1 PC PC 2JBbit rel 若 bit 1 则PC PC 3 rel 若 bit 0 PC PC 3JNBbit rel 若 bit 0 则PC PC 3 rel 若 bit 1 PC PC 3JBCbit rel 若 bit 1 PC PC 3 rel 且 bit 0 若 bit 0 PC PC 3 例 编写一程序 实现下图中的逻辑运算电路 其中P3 1 P1 1 P1 0分别是单片机端口线上的信息 RS0 RS1是PSW寄存器中的两个标志位 30H 31H是两个位地址 运算结果由P1 0输出 ORG1000HBITT MOVC P3 1ANLC P1

温馨提示

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

评论

0/150

提交评论