单片机原理及应用 第三章.ppt_第1页
单片机原理及应用 第三章.ppt_第2页
单片机原理及应用 第三章.ppt_第3页
单片机原理及应用 第三章.ppt_第4页
单片机原理及应用 第三章.ppt_第5页
已阅读5页,还剩94页未读 继续免费阅读

下载本文档

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

文档简介

第三章 MCS 51单片微机的指令系统 3 1MCS 51指令及其表示方法 指令系统是根据单片机硬件电路确定的一组操作编码 每一条指令完成一个特定的操作 指令系统设计是单片机设计的一个组成部分 芯片制造厂在推出单片机的同时也要提供指令系统 我们为了使用单片机就必须了解和熟悉其指令系统 本节介绍指令的格式 指令的字节数等基本知识 一 机器语言指令与汇编语言指令 和一般的微机一样 指令具有两级形式 即机器语言指令和汇编语言指令 指令的集合便是程序 例如作10 20的运算可采用下列二进制机器语言程序 01110100B00001010B16进制表示为74H0AH00100100B00010100B24H14H为了使用方便 用助记符来表示操作性质 并规定一定的书写格式 这样就形成了汇编语言级的指令和程序 例如上述程序的汇编语言形式为 MOVA 0AHADDA 14H 操作码 操作数 上述程序中MOV为助记符 表示操作的性质是数据传送 助记符后面的符号A为累加器ACC 是数据传送的 目的 地址 地址为符号地址 0AH中前缀 表示0AH为数据 处于此位置的数据或符号 或不带 的数 是数据传送的 源 或 源 地址 第二条指令的ADD表示加法操作 根据上例可知 汇编语言指令的格式为 标号 助记符操作对象指令中的操作对象可以是寄存器名 存贮器地址 数据 带有前缀 等 操作对象可以是1个或2个 3个 例如上例中两条指令均为两个操作对象 第一个为目的操作对象 第二个为源操作对象 由于汇编语言指令不是机器代码 故编制好汇编语言程序后 还需要再翻译成机器语言程序 称目标程序 然后才能输入到计算机的存贮器中去执行 机器语言程序主要由数码组成 它包含两种不同性质的编码 一种是表示操作性质的数码 操作码 另一种为表示某个数 或地址 的编码 操作数 所以机器语言指令的格式为 地址操作码操作数 0 2个 例如上述机器码程序74H 24H为操作码 0AH 14H为操作数 汇编语言指令与机器语言指令具有完全确定的关系 二者可以互相转换 二 指令的格式 指令是完成一种特定操作的命令 一条指令由一个操作码和几个操作数组成 其中操作数可以是0 2个 在计算机中以8位二进制码为一个字节 各种编码均以字节为单位 即16进制的2位数 单字节指令 双字节指令 三字节指令 操作码 操作码 操作数 操作码 第1操作数 第2操作数 二 指令的格式 例如 操作内容汇编语言机器语言指令累加器内容加1INCA00000100 04H 累加器内容取反CPLA01011000 18H MOVA Rn n 0 7 机器码为11101rrrb式中rrr为0 7的二进制码MOVdata data 机器码为75Hdata data 操作码 操作码 第一操作数 第二操作数 3 2寻址方式 一 指令系统中使用的符号A 累加器 B 乘 除运算寄存器 亦可当作一般寄存器使用 Rn 工作寄存器n 0 7 Ri 用于存放地址的工作寄存器i 0 1 亦称8位地址指针 DPTR 16位数据指针 由DPH DPL两个寄存器组成 存放16位地址 以寄存器的内容为地址的前缀 rrr R0 R7对应的rrr为000 111 dir direct或data 单片机内地址为dir direct或data 的通用寄存器 data 8位的数据 data16 16位的数据 SP 堆栈指针 其内容为堆栈栈顶的地址 bit 位操作中的一个 位 C PSW中的最高位 亦称位累加器 addr11 11位地址 addr16 16位地址 rel 相对地址 X 表示X单元中的内容 X 以X R0 R1 DPTR dir等 的内容为地址的该单元内容 其它 特殊功能寄存器符号及其内部的 位 符号 二 寻址方式 计算机的各种操作都涉及到寄存器和存贮器 它们分布在片内和片外 数量很多 因此指令中必须明确指明是哪一个寄存器或哪一个存贮单元 寻址方式就是在指令中给出的寻找操作数或操作数所在地址的方法 执行任何一条指令都需要使用操作数 MCS 51系列单片微机指令系统中共有以下7种寻址方式 1 立即寻址 立即寻址是指在指令中直接给出参与操作的数 出现在指令中的这种操作数称为立即数 这种寻址方式称为立即寻址 为了与直接寻址指令中的直接地址相区别 在立即数前面必须加上前缀 例如 指令MOVDPTR 1234H其中1234H就是立即数 指令功能是把16位立即数1234H送入数据指针DPTR中 1 立即寻址 例如 指令MOVDPTR 1234H机器语言指令 901234 程序存储器 PC PC 1 PC 2 特殊功能寄存器 DPH DPL 12 34 2 直接寻址 直接寻址是指在指令中直接给出操作数单元的地址 例如 指令MOVA 3AH其功能是把片内RAM中3AH单元内的数据传送给累加器A 直接寻址方式只能给出8位地址 因此这种寻址方式的寻址范围只限于片内RAM 具体地说 1 低128单元 在指令中直接以单元地址形式给出 2 特殊功能寄存器 这时除可以单元地址形式给出外 还可以寄存器符号形式给出 虽然特殊功能寄存器可以使用符号标志 但在指令代码中还是按地址进行编码的 例如 指令MOVA B MOVA F0H 2 直接寻址 3 位地址空间 特殊功能寄存器和位地址空间只能用直接寻址方式来访问 例 指令 MOVA 45H 机器代码 E545 程序存储器 E5 45 PC PC 1 片内RAM XX 45H XX A 3 寄存器寻址 寄存器寻址是指在指令中将指定寄存器的内容作为操作数 因此指定了寄存器就能得到操作数 寄存器寻址方式中 用符号名称来表示寄存器 例如 指令INCR0其功能是把寄存器R0的内容加1 再送回R0中 由于操作数在R0中 指定了R0 也就得到了操作数 寄存器寻址方式的寻址范围包括 1 在指令中只能使用当前寄存器组 因此在使用中要通过指定PSW中的RS1 RS0 以选择使用的当前寄存器组 2 部分特殊功能寄存器 例如累加器A B寄存器 CY以及数据指针DPTR 3 寄存器寻址 例如 指令MOVA R3 机器代码 EB设累加器A的内容为28H R3的内容为58H PSW中RS1 RS0分别为 1 0 则R3的地址为13H 程序存储器 EB PC 片内RAM 58 13H R3 28H A 58H 4 寄存器间接寻址 寄存器间接寻址是指在指令中给出的寄存器内容是操作数的地址 从该地址中取出的才是操作数 寄存器间接寻址也需以寄存器符号名称的形式表示 为了区别寄存器寻址和寄存器间接寻址 在寄存器间接寻址中 应在寄存器的名称前面加前缀 例如 指令MOVA R0 机器代码E6 程序存储器 片内RAM 5E 00H R0 XX A 5EH XX 寄存器间接寻址的寻址范围 1 片内RAM的低128单元 只能采用R0或R1作为间址寄存器 其形式为 Ri i 0 1 例 MOVA R0 2 片外RAM的64KB单元 使用DPTR作为间址寄存器 其形式为 DPTR 例如 MOVXA DPTR 其功能是把DPTR指定的片外RAM单元的内容送累加器A 3 片外RAM的256单元 除了可使用DPTR作为间址寄存器外 也可使用R0或R1作间址寄存器 例如MOVXA R0 4 堆栈区 堆栈操作指令 PUSH和POP 也应算作是寄存器间接寻址 即以堆栈指针 SP 作间址寄存器的间接寻址方式 5 变址寻址 变址寻址是指以DPTR或PC作基址寄存器 累加器A作变址寄存器 以两者内容相加 形成的16位程序存储器地址作为操作数地址 又称基址寄存器 变址寄存器间接寻址 有效地址 基址寄存器PC 或DPTR A例如 指令MOVCA A DPTR机器代码93假定指令执行前 A 54H DPTR 1256H变址寻址形成的操作数地址为1256H 54H 12AAH 若12AAH单元的内容为00H 则该指令执行的结果是A的内容为00H 程序存储器 54 A 93 PC SFR 56 DPL DPH 12 1256H 54H 12AAH 12AAH 00 00 例如 指令MOVCA A DPTR机器代码93 变址寻址指令有 MOVCA A DPTR A A DPTR MOVCA A PC PCPC 1 A A PC JMP A DPTR PC A DPTR 变址寻址方式用于查表操作 6 相对寻址 相对寻址是仅用于相对转移指令的一种寻址方式 与其他寻址方式不同 这种寻址方式是要寻找指令地址 即寻找下一条要执行指令的地址 相对寻址的有效地址D 目的地址 为 D PC relPC的当前值称为源地址 它是相对转移指令操作码的地址 rel是相对地址 它是目的地址与源地址的差值 相对地址的机器码称为偏移量 记为disp 它与rel的关系是 dips rel b目的地址 源地址 转移指令字节数 dips若转移指令为2字节 则b 2 若转移指令为3字节 则b 3 偏移量为一字节二进制补码数 取值范围为 128一 127 相对地址取值范围为 126 129 在源程序中 相对地址rel一般用标号表示 6 相对寻址 参考 例如 指令JC18H 设CY 1 操作码的地址为1000H 机器代码4016 程序存储器 16 1001H 1000 PC 1000H 40 16H 1000H 2 1018H 1018H 1018H 6 相对寻址 例 设有如下一段程序 试写出与JNZLET0相对应的机器代码 地址机器代码标号源程序0152H70XXJNZLET0 A 0 PC016CH 016CHD0E0LET0 POPA 解 源地址 0152H 目的地址 016CH rel D PC 016CH 0152H 1AH disp rel 2 1AH 2 18H 18 6 相对寻址 例 设有如下一段程序 试写出与DJNZR7 ML2相对应的机器代码 地址机器代码标号源程序0110HC0D0ML2 PUSHPSW011BHDFXXDJNZR7 ML2 解 源地址 011BH 目的地址 0110H rel D PC 0110H 011BH 0BH 0BH 补 F5H disp rel 2 F5H 2 F3H F3 7 位寻址 8051有位处理功能 可以对数据位进行操作 因此就有相应的位寻址方式 位寻址的寻址范围 1 RAM中的位寻址区片内RAM中的单元地址20H 2FH 共16个单元128位 为位寻址区 位地址是00H 7FH 对这128个位的寻址使用直接位地址表示 例如MOVC 2BH指令的功能是把位寻址区的2BH位的值送累加位C SETB3AH 给3A位置1 2 可位寻址的特殊功能寄存器位可供位寻址的特殊功能寄存器共有11个 有寻址位83位 3 3指令系统 MCS 51的指令系统 共有111条指令 按其功能可分为五大类 1 数据传送类指令 28条 2 算术运算类指令 24条 3 逻辑运算类指令 25条 4 控制转移类指令 17条 5 布尔操作 位 类指令 17条 3 3 1数据传送类指令 一 片内数据传送指令片内数据传送指令的助记符为MOV 大部分的传送方式都是双向的 现以目的寄存器为序列列出如下 1 以累加器A为目的操作数的指令组指令操作内容MOVA Rn A Rn MOVA direct A direct MOVA Ri A Ri MOVA data A data 1 以累加器A为目的操作数的指令组例 R1 20H 20H 55H MOVA R1执行后 A 55H 例 已知A 40H R6 50H 6FH 32H R0 18H 18H 10H 执行下列程序段 MOVA R6 A50HMOVA 6FH A 6FH MOVA R0 A R0 执行后 A 10H 2 以工作寄存器Rn为目的操作数的指令组指令操作内容MOVRn A Rn A MOVRn direct Rn direct MOVRn data Rn data这组指令的功能是把源操作数的内容送入当前工作寄存器区的R0 R7中的某一个寄存器 源操作数有寄存器寻址 直接寻址和立即寻址等寻址方式 例 已知A 3FH 4EH 2FH R1 20H R3 30H 执行下列程序段 MOVA 2EH A2EHMOVR1 A R1 A MOVR2 4EH R2 4EH MOVR3 6FH R36FH执行后 A 2EH R2 2FH R3 6FH 3 以直接地址direct为目的操作数的指令组指令操作内容MOVdirect A direct A MOVdirect Rn direct Rn MOVdirect1 direct2 direct1 direct2 MOVdirect Ri direct Ri MOVdirect data direct data这组指令的功能是把源操作数的内容送入由直接地址指出的存储单元 源操作数有寄存器寻址 直接寻址 寄存器间接寻址和立即寻址等寻址方式 例如 MOVA 80H 表示把片内RAM中地址为80H单元 即P1口 中的内容送A MOV80H 88H 表示把立即数88H送到片内RAM中的80H地址单元中去 MOV80H E0H 表示把E0H单元的内容送到80H单元中去 这是片内数据存储单元中的直接地址单元之间数据的直接传送 4 间接地址为目的操作数的指令指令操作内容MOV Ri A Ri A MOV Ri direct Ri direct MOV Ri data Ri data例 A 30H R1 40H MOV R1 A 执行后 40H 30H 二 16位数目标地址传送指令 MOVDPTR data16 该指令把16位常数装入数据指针DPTR 即数据高八位送入DPH寄存器 数据低八位送入DPL寄存器 16位常数在指令的第二 第三字节中 第二字节为高位字节DPH 第三字节为低位字节DPL 此操作不影响标志位 例 执行指令MOVDPTR 1234H执行结果 DPH 12H DPL 34H 三 堆栈操作指令PUSHdirect SP SP 1 SP direct POPdirect direct SP SP SP 1例如 设SP 30H 50H 80H 指令如下 PUSH50H SP SP 1 31H 50H POP40H 40H 31H SP SP 1程序执行过程中如图所示 四 查表指令 MOVCA A PC PCPC 1 A A PC MOVCA A DPTR A A DPTR MOVC 访问ROM PSEN 0例如 在程序存储器中 数据表格为 1010H 011011H 021012H 03执行程序 1000H MOVA 0DH A 0DH1002H MOVCA A PC A 0DH 1003H 结果 A 01H PC 1003H 例如 在程序存储器中 数据表格为 2000H 01H2001H 23H2002H 45H2003H 67H执行程序 1000H MOVA 03H1002H MOVDPTR 2000H1005H MOVCA A DPTR结果 A 67H DPTR 2000H 五 片外数据传送指令 片外数据传送指令的助记符为MOVX 片外数据传送必须使用累加器A 另一操作对象采用间接寻址方式 指令操作内容MOVXA Ri A Ri MOVXA DPTR A DPTR MOVX Ri A Ri A MOVX DPTR A DPTR A 说明 MOVX 对片外RAM读 RD 0 或者写 WR 0 例如 DPTR 2000H 2000H 18H指令MOVXA DPTR 执行后A 18H 例如 把片内RAM40H单元中内容送到片外RAM2000H单元中去 程序如下 MOVA 40H A 40H MOVDPTR 2000H DPTR 2000HMOVX DPTR A 2000H A例如 把片外RAM2100H单元内容传送2120H单元中去 程序如下 MOVDPTR 2100HMOVXA DPTRMOVDPTR 2120HMOVX DPTR A 六 交换指令 1 字节交换指令XCHA Rn A Rn XCHA direct A direct XCHA Ri A Ri 上述指令的功能是 将累加器A的内容与源操作数所指出的数据互相交换 例如 已知R0 10H A 4EH 10H 5FH 执行指令 XCHA R0 结果 A 5FH 10H 4EH 2 半字节交换指令XCHDA Ri A 3 A 0 Ri 3 Ri 0 该指令的功能是 将累加器A中低4位与Ri间接寻址单元内容的低4位相互交换 而各自的高4位内容不变 例如 已知R0 10H A 35H 片内RAM 10H 46H 执行指令 XCHDA R0 结果 A 36H 10H 45H 3 累加器A的高4位与低4位内容互换指令SWAPA A 3 A 0A 7 A 4该指令的功能是 将A的高 低两半字节相互交换 例 设A 86H 程序如下 MOVR3 4FH R34FHXCHA R3 AR3SWAPA A 7 A 4A 3 A 0XCHA R3 AR3结果 A 86H R3 F4H 3 3 2算术运算类指令 MCS 51算术运算指令 主要是对8位无符号二进制数进行加法 减法 乘法和除法四则运算 增1 减1运算 可以实现对压缩BCD码加减运算和对带符号二进制数进行2的补码运算 算术运算指令共有24条 在加法 带进位加法和带借位减法的指令中 累加器A中总是存放目的操作数 并存放操作的中间结果 而源操作数则可以是立即数 工作寄存器内容 间接或直接寻址片内RAM内容 这些指令都影响程序状态字PSW的进位位C 溢出位OV 半进位位AC和奇偶标志位P 仅当源操作数为A时 加1 减1指令才对标志位P有影响 乘法 除法指令影响标志位OV和P 一 加法类指令 1 加法指令 4条 ADDA Rn AA Rn ADDA direct AA direct ADDA Ri AA Ri ADDA data AA data这组指令的功能是 把源操作数所指出的内容和累加器A的内容相加 其结果存放在累加器A中 例如 设A 85H R0 20H 20H 9EH执行指令 ADDA R0 其操作如下 10000101 10011110 100100011结果 A 23H Cy 1 AC 1 OV 1 P 1 2 带进位加法指令 4条 ADDCA Rn AA Rn CyADDCA direct AA direct CyADDCA Ri AA Ri CyADDCA data AA data Cy这是一组带进位的加法指令 其功能是 把源操作数所指出的内容和累加器A的内容以及进位标志Cy相加 结果存放在A中 带进位加法指令常用于多字节加法运算 例如 设A 4EH R0 20H 20H 9EH Cy 1 执行指令 ADDCA R0 其操作如下 0100111010011110 111101101结果 A EDH Cy 0 AC 1 OV 0 P 0 3 加1指令 5条 INCA AA 1INCRn RnRn 1INCdirect directdirect 1INCDPTR DPTRDPTR 1INC Ri Ri Ri 1这组指令的功能是 把操作数所指定单元的内容加1 其操作除第一条指令影响奇偶标志位外 其余指令操作均不影响PSW 当用上述指令对并行I O口的内容加1时 其原来的数据不是从I O口的引脚上读入 而是从I O口的输出锁存器中读入 加1后仍保存于输出锁存器下 即对I O进行读 改 写操作 4 二 十进制调整指令 1条 DAA 十进制修正这条指令的功能是 对BCD码加法运算的结果自动进行修正 以便得到正确的BCD码运算结果 如前所述 0 9的BCD码是用4位二进制数 0000 1001 表示的 进行加法运算时 两位BCD数之间应逢十进位 但是 计算机中加法运算都是按二进制规则进行的 所以对于用4位二进制数表示的1位BCD数实际上是逢十六进位 显然不符合十进制运算的要求 可能产生错误的结果 因此 在BCD码加法运算后 必须进行十进制调整 这样才可以得到正确的BCD码结果 例如 设A 00111000 BCD 即38 data 01001001 BCD 即49 执行指令 ADDA data 其操作如下 00111000 0100100110000001由于计算机中是按二进制进行运算的 BCD码结果为81 这显然是错误的 如果在ADDA data 指令执行之后 再执行一条指令DAA 即10000001 00000110 6修正 10000111所得结果为87 即调整后得到的BCD码结果是正确的 DAA 指令的操作过程是 测试累加器A的低4位及辅助进位位AC 若A中的低4位值大于9或AC 1 则累加器A的低4位加6修正 测试累加器A的高4位及进位位CY 若A中的高4位值大于9或CY 1 则A的高4位加6修正 否则 不修正 需要注意的是 DAA 指令只对累加器A起作用 它不能单独使用 且必须在加法指令ADD和ADDC之后 也不适用于减法指令 例 编写6位BCD码加法程序 解 设被加数存于片内RAM的30H 32H单元中 加数存于40H 42H单元中 低位在前 高位在后 各单元中均为压缩BCD码 结果和分别存入50H 52H单元中 程序如下 MOVA 30HADDA 40H A 30H 40H DAAMOV50H A 低2位BCD码之和存入50H中MOVA 31HADDCA 41H A 31H 41H CyDAAMOV51H A 中间2位BCD码及低位进位之和存51H中MOVA 32HADDCA 42H A 32H 42H CyDAAMOV52H A 高2位BCD码及进位之和存入52H中 二 减法类指令 1 带借位的减法指令 4条 SUBBA Rn AA Rn CySUBBA direct AA direct CySUBBA Ri AA Ri CySUBBA data AA data Cy这组指令的功能是 将累加器A中的数减去源操作数所指出的数和进位位Cy 有借位时Cy 1 其差值存入A中 MCS 51指令系统中 只有带借位的减法指令 在进行单字节或多字节减法运算时 应先将进位标志位Cy清0 例 编写多字节减法运算程序 解 设被减数在片内RAM30H 32H单元中 减数在40H 42H单元中 低位数对应低位地址 高位数对应高位地址 其差值存入50H 52H单元中 程序如下 CLRC CY清0MOVA 30HSUBBA 40H A 30H 40 CYMOV50H AMOVA 31HSUBBA 41H A 31H 41H CYMOV51H AMOVA 32HSUBBA 42H A 32H 42H CYMOV52H A 例 编写十进制减法程序 解 由于MCS 51没有十进制减法指令 为了能借用DAA指令 可采用减法变成补码相加的办法 用9AH减去减数 即得以10为模的减数的补码 设被减数和减数均为压缩BCD码 分别存于R3 R4中 其差值也存入R3中 程序如下 BCDSUB CLRCMOVA 9AH 求减数的补码SUBBA R4ADDA R3 补码相加DAAMOVR3 A 2 减1指令 4条 DECA AA 1DECRn RnRn 1DECdirect directdirect 1DEC Ri Ri Ri 1这组指令的功能是 把操作数所指定的单元的内容减1 其操作除第一条指令影响奇偶标志外 其余指令操作均不影响PSW标志 与加1指令一样 对并行I 0口的输出内容进行减1操作时 其原来口数据的值将从I 0口的输出锁存器读入 减1后的值仍保存于输出锁存器中 而不是对该输出口的引脚上内容进行减1操作 三 乘法指令 1条 MULAB BAAXB这条指令的功能是 把累加器A和寄存器B中的两个8位无符号数相乘 所得16位乘积的低字节放在A中 高字节放在B中 如果乘积大于255 FFH 则溢出标志位OV置1 否则清0 CY总是为0 例如 设A 40H B 5EH 执行指令 MULAB结果 A 80H B 17H 乘积是1780H 四 除法指令 1条 DIVAB A B的商A 余数B这条指令的功能是将累加器A中8位无符号整数除以寄存器B中8位无符号整数 所得商的整数部分存于A中 余数存于B中 如果除数为0 则指令执行结果为不定值 即A和B中内容不确定 即0不能作除数 此时 OV置1 否则清0 例如 设A F8H B 12H 执行指令 DIVAB结果 A 0DH 商 B 0EH 余数 例 编写将累加器A中二进制数转换成3位BCD码程序 结果的百位数存于R7 十位数和个位数存于R6 解 应用除法指令 将待转换的数除以100 得百位数 再将余数除以10 得十位数 最后的余数 即为个位数 编写程序如下 MOVB 100DIVAB A中商为百位数MOVR7 A 百位数送R7MOVA 10XCHA B B中余数与A中除数10互换DIVAB A中得十位数 B中得个位数SWAPAADDA B 组合成2位BCD码MOVR6 A 十位 个位数送R6 3 3 3逻辑运算类指令 这类指令主要用于对8位数进行逻辑运算 包括逻辑与 逻辑或 逻辑异或 取反 清零以及循环移位指令 逻辑运算指令共有24条 下面分别予以介绍 一 逻辑与指令 6条 ANLA Rn AA RnANLA direct AA directANLA Ri AA Ri ANLA data AA dataANLdirect A ditectditect AANLdirect date ditectditect data 上述前四条指令的目的操作数是累加器A 源操作数可以是工作寄存器 片内RAM和立即数 指令的功能是 将A中的内容和源操作数所指定的内容按位逻辑与 结果存入目的操作数A中 后两条指令的目的操作数是直接寻址单元内容 源操作数是累加器A或立即数 两个操作数的内容按位逻辑与 结果存入直接寻址单元中 当直接寻址并行I 0口时 其情况与算术运算指令类同 其原来的数据不是从I O口的引脚上读入 而是从I O口的输出锁存器中读入 即对I O进行读 改 写操作 例如 已知A 8DH R0 7EH 执行指令 ANLA R0其操作如下 10001101 8DH 01111110 7EH 00001100 0CH 结果 A 0CH 逻辑与指令常用于屏蔽某些位 如上例所示 将A的D7位和D0位变为0 即屏蔽了 由此可见 用ANL指令屏蔽某些位 方法是将需屏蔽的位和0相与 二 逻辑或指令 6条 ORLA Rn AAVRnORLA direct AAVdirectORLA Ri AAV Ri ORLA data AAVdataORLdirect A directdirectVAORLdirect data directdirectVdata这组指令的目的操作数和源操作数跟逻辑与指令的相同 两个操作数指定的内容按位相或运算 前四条指令结果存入A中 后两个指令结果存入直接寻址单元中 对并行I O口的操作跟逻辑与操作类同 例如 已知A DAH R0 25H 执行指令 ORLA R0 其操作如下 11011010 DHA V 00100101 25H 11111111 FFH 结果A FFH由上例可以看出 两个操作数中任一位只要有一个是1 该位操作结果为1 而只有两位均为0时 结果才为0 因此 可采用逻辑或指令实现对某些位置位的功能 同时逻辑或指令也可用于组合信息 例如 将累加器A的D7 D5 D3 D1置1 其余位置0 送入外部数据存储器2000H单元 编写程序如下ORLA 10101010B A的D7 D5 D3 D1位置1ANLA 10101010B A的D6 D4 D2 D0位屏蔽MOVDPTR 2000HMOVX DPTR A 存数 三 逻辑异或指令 6条 两个操作数所指定的内容按位异或 前四条指令结果存入A中 后两条指令结果存入直接寻址单元中 对并行I O口的异或操作跟逻辑与操作类同 利用上述所令 可对目的操作数的某些位取反 只需将取反的位与1相异或 这时源操作数常用立即数 XRLA Rn AAVRnXRLA direct AAVdirectXRLA Ri AAV Ri XRLA data AAVdataXRLdirect A directdirectVAXRLdirect data directdirectVdata 例如 已知A A5H 要求对高4位取反执行指令 XRLA 11110000B 其操作如下 10100101 A5H 11110000 F0H 01010101 55H 结果 A 55H 四 累加器A清零指令 1条 CLRA A 0这条指令的功能是将累加器A的内容清0 五 累加器A取反指令 1条 CPLA A A 这条指令的功能是将累加器A的内容逐位取反 六 累加器A循环移位指令 4条 前两条指令的功能是 分别将累加器A的内容循环左移或右移一位 后两条指令的功能是 分别将累加器A的内容连同进位位CY循环左移或右移一位 例 3 3 4控制转移类指令 控制转移类指令属于程序控制指令 其作用是 改变程序执行的方向 或调用子程序 或从子程序返回 这些都是通过改变程序计数器PC中的内容来实现的 这类指令可分为转移指令 调用子程序指令和返回指令 下面分别予以介绍 一 转移类指令 转移类指令通过改变PC的内容 以改变正在执行的指令顺序 转向新的地址继续执行下去 从而实现程序分支 根据指令转移的条件 转移指令可分为无条件转移指令和条件转移指令 前者CPU无条件地转移到指定位置执行程序 后者只有当条件满足时才能实现程序的转移 否则继续执行下一条指令 条件转移指令是使CPU能够进行逻辑判断的主要手段 1 无条件转移指令 4条 LJMPaddr16 PCaddr16AJMPaddr11 PCPC 2 PC 10 PC 0addr11JMP A DPTR PCA DPTRSJMPrel PCPC rel第一条指令叫长转移指令 执行结果是 将16位地址addrl6送程序计数器PC中 第二条指令叫绝对转移指令 指令中只提供了低11位地址 PC当前值的高5位不变 程序只能转移到下一条指令开始的2K字节范围内执行 其机器码为 a10a9a800001 其中00001为操作码a7a6a5a4a3a2a1a0 a10 a0为11位数第三条指令是变址寻址 间接 转移指令 它是将累加器A中的8位数和数据指针DPTR中的16位数相加 形成16位的转移目标地址送给PC 而不改变A和DPTR的内容 不影响标志位 第四条指令叫短转移指令是两字节无条件相对转移指令 该指令执行后 程序便转移到当前PC值与rel值之和所指示的地址单元 例如 地址指令1030H AJMPaddr11设add11 00110000101B 指令的机器码 0010000110000101指令执行后 PC 0001000110000101PC 1185H程序转到1185H处执行 例如 设累加器A中内容为0 6之间的偶数 程序存储器中存放着标号为JPTBL的转移表 执行下面程序 将根据A的内容转到相应的分支处理程序 MOVDPTR JPTBLJMP A DPTRJPTBL AJMPLABEL0 转LABEL0分支程序AJMPLABEL1 转LABEL1分支程序AJMPLABEL2 转LABEL2分支程序AJMPLABEL3 转LABEL3分支程序 2 条件转移指令 10条 在多数情况下 程序的转移是有条件的 由条件转移指令来实现 根据给定的条件进行检测 若条件得到满足 则程序转向指定的目标地址去执行 否则 不转移 继续往下执行程序 这类条件转移指令都是相对转移指令 其转移的范围是以转移指令的下一条指令的第一个字节地址为起始地址的 128 127个字节内 下面按不同的检测条件分四种情况加以介绍 1 判零转移指令JZrelJNZrel这两条指令都是对累加器A的内容进行检测 根据A中的内容是否为零来决定程序是否转移 指令执行后 A的内容不变 指令执行过程如图所示 2 判C 转移指令JCrelJNCrel这两条指令是以PSW中的进位标志CY作为检测条件 根据CY标志的情况来决定程序是否转移 指令执行过程如图所示 CY也是布尔 位 处理器的累加器 所以也可作为位处理CY转移指令 用于位处理方式 3 比较转移指令 中法 CJNEA direct relCJNEA data relCJNERn data relCJNE Ri data rel指令的功能是 比较两个操作数的大小 如果它们的值不相等 则程序转移 转移的目标地址是PC rel 如果它们的值相等 则不转移 程序继续往下 PC 3 执行 若第一操作数大于第二操作数 则CY 0 若第一操作数小于第二操作数 则CY 1 指令执行不影响任何一个操作数的内容 指令执行过程如图所示 图中S1 S2分别表示第一操作数和第二操作数 CJNE是三字节指令 指令汇编后的机器语言格式如下 操作码datarel 3例如 指令CJNEA 45H 40H机器代码B4453D三字节相对转移指令的偏移量计算规则如下 向后转移 偏移量 目的地址 源地址 3 向前转移 偏移量 目地地址 0100H 源地址 3 例 已知程序段如下 试计算偏移量disp 地址机器码源程序2000HB480dispCJNEA 80H ADDR 2006H2438ADDR ADDA 38H解 目的地址大于源地址 这是向后转移的情况 所以disp 2006H 2000H 3 03H 例 已知程序段如下 试计算偏移量disp 地址机器码源程序204DH24OFADDR ADDA OFH 205DHB480dispCJNEA 80H ADDR解 目的地址小于源地址 这是向前转移的情况 所以disp 204DH 0100H 205DH 3 EDH 4 循环转移指令DJNZRn relDJNZdirect rel指令执行示意图所示 例 累加器A的内容由0递增 加到100 其结果存在累加器A中 试编写该程序 解 程序如下 地址机器码源程序2000HE4CLRA A清02001H755064MOV50H 64H 设循环次数2004H04L1 INCA 累加2005HD550FCDJNZ50H L1 不为0 转L1 否则 顺序执行 二 调用子程序及返回指令 1 调用子程序指令 2条 LCALLaddrl6 PCPC 3 SPSP 1 SPPC7 0SPSP 1 SPPC15 8 PCaddrl6ACALLaddr11 PCPC 2 SPSP 1 SPPC7 0SPSP 1SPPC15 8 PC10 0addr11第一条指令LCALL为长调用指令 addr16是子程序入口地址 执行时 先将断口地址压入堆栈 然后将子程序入口地址装入PC CPU转去执行子程序 由于该指令提供了16位的子程序入口地址addr16 所以可调用64KB范围内所指定的子程序 LCALL指令为三字节指令 其汇编后机器语言格式为 12addr15 8addr7 0即紧接操作码12H后 16位地址先高位后低位 按顺序排列 第二条指令ACALL为短调用指令 双字节指令 其执行过程类似于LCALL指令 但是 由于指令只提供了11位程序入口地址 因此被调用的子程序入口地址必须与调用指令ACALL的下一条指令的第一个字节在相同的2KB存储区内 2 返回指令 2条 RET PC15 8SP SPSP 1PC7 0SP SPSP 1RETI PC15 8SP SPSP 1PC7 0SP SPSP 1第一条指令是子程序返回指令 指令的功能是 将堆栈内的断口地址弹出送入PC 使CPU返回到原断口地址处 继续执行原程序 第二条指令是中断返回指令 这条指令除了执行RET指令的功能外 还清除内部相应的中断状态寄存器 该寄存器由CPU响应中断时置位 的内容 它只能用于中断服务程序 RETI与RET不能互换使用 返回指令只能置于子程序或中断服务程序的末尾 表示子程序或中断服务程序的结束 三 空操作指令 1条 NOP PCPC 1这是一条单字节指令 执行时 不作任何操作 即空操作 仅将程序计数器PC的内容加1 使CPU指向下一条指令继续执行程序 这条指令常用于产生一个机器周期的延迟或在程序中补空 便于程序调试时指令的增删 3 3 5位操作类指令 MCS 51单片机从硬件到软件构成了完整的按位操作的布尔处理器 或称位处理器 它与一般微处理器的主要区别在于 CPU不是以字节或字而是以位作为处理对象进行操作的 进行位操作时 以进位标志Cy作为位累加器 具有一套按位处理指令集 包括位数据传送 位逻辑运算和位条件控制转移等指令 在MCS 51单片机内部数据存储器中 有两部分按位寻址的存储地址空间 一部分是片内RAM的20H 2FH共16个字节单元128位 其位地址为00H 7FH 各位地址相应于从20H字节单元的最低位开始 到2FH字节单元的最高位 另一部分是特殊功能寄存器区中 字节地址能被8整除的专用寄存器也具有位地址 其位地址从80H F7H 中间有极少数位未被定义 不能按位寻址 在汇编语言中 位地址的表达方式有下述几种 1 直接用位地址表示例 D4H 2FH 2 用点操作符号表示 点操作符 即 的前面部分是字节地址或是可位寻址的专用寄存器 其后面部分的数字表示它们的位 例 DOH 4 PSW 4 3 寄存器的位定义名称 例 RS1 OV 4 用户定义的位符号地址例 L1BITPSW 4 即将PSW 4定义为位符号地址L1 经定义后 允许在

温馨提示

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

评论

0/150

提交评论