第三章(其余指令)PPT课件_第1页
第三章(其余指令)PPT课件_第2页
第三章(其余指令)PPT课件_第3页
第三章(其余指令)PPT课件_第4页
第三章(其余指令)PPT课件_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

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

文档简介

3 3 3算术运算指令 不带进位的加法指令 ADD 1 加法指令 带进位的加法指令 ADDC 加1指令 INC 2 减法指令 带进位的减法指令 SUBB 减1指令 DEC 3 十进制调整指令 DAA 4 乘法和除法指令 MULDIV 见表3 2 加法指令 一 不带进位的加法指令 格式 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 025A 00011001BP 1 102data 01100110B127001111111B1 若两数都是无符号数 则因Cy 0无溢出 25 102 127 2 若两个数是有符号数 则因OV 0无溢出 cy 000C7 C6 AC 不带进位的加法指令举例 二 试分析执行下列指令后累加器A和PSW中各标志的变化 MOVA 5AHCy 0 ADDA 6BHAC 0 OV 190A 01011010BP 0 107data 01101011B197011000101BC7 C6 1 若两数是无符号数 因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 M1 M1 1 M2 M2 1 解 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单元 减法指令 带进位的减法指令 在MCS 51单片机的指令系统中 只有 带进位的减法SUBB 减一DEC两种指令 减法指令 格式 SUBBA Rn A Rn Cy ASUBBA direct A direct Cy ASUBBA Ri A Ri Cy ASUBBA data A data Cy A 使用减法指令要注意的几个问题 无论相减两数是无符号数还是有符号数 减法操作总是按有符号数来处理 影响PSW中相关的标志 详见举例 在MCS 51的指令系统中没有不带Cy的减法 所以在使用SUBB指令前必须使用一条清除Cy的指令 CLRC 减法指令应用举例 试分析执行下列指令后累加器A和PSW中各标志的变化 CLRCMOVA 52H01010010B 82SUBBA 0B4H10110100B 7682a 01010010 76data 10110100158110011110 98手工计算C7 C6 AC101 分析 CPU的计算得 98 很明显答案是错误的 原因是OV 1 既产生了溢出 所以 对于符号数的减法在运算后一定要检测OV 1 减一指令 格式 DECA 累加器A减一DECRn Rn 1 RnDECdirect 内存单元数据减一DEC Ri 内存单元数据减一 注意 1 除了第一条对PSW的P有影响外 其余对PSW均无影响 2 由于上面的原因 DEC指令一般不作为数据算术运算使用 因为不能对PSW的OV等位产生影响 它主要用于修改数据指针在控制 循环语句中使用 设 R0 7FH 在内RAM中 7EH 00H 7FH 40H执行 DEC R0DECR0DEC R0 答 R0 7EH 7EH 0FFH 7FH 3FH 结果为 R0 7EH 7FH 十进制调整指令 在CPU进行BCD码运算时 必须在运算后进行十进制调整 这是因为 CPU在运算时 并不知道数据是二进制还是BCD码 格式 DAA 若AC 1或A3 0 9 则 A 06h A 若Cy 1或A7 4 9 则 A 60h A 若上述2个条件均满足 则A A 66h 注意 1 DAA指令必须紧跟在加法指令之后 2 DAA指令只适用于加法指令的调整 BCD码是指 用二进制表达的十进制数 如 十进制数20可以用二进制数00010100B表示 也可以用十六进制数14H表示 还可以用BCD码00100000B或20H表示 4个二进制位就可以表示一位BCD码 0000 1001可表示十进制数 BCD数 0 9 8个二进制位就可以表示两位压缩的BCD码 00000000 10011001表示00 99 十进制调整指令应用举例 一 1 BCD加法运算 试写出完成85H 59H的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中分别存有被减数91H和减数36H 两数均为BCD码 试编程求91H 36H并将结果存入M3单元 解 1 算法 91H 36H 91H 9AH 36H 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被复位 BCD MOVR0 30H R0指向被加数的十位 个位 MOVR1 40H R1指向加数的十位 个位 MOVA R0ADDA R1 被加数的十位 个位 加数的十位 个位DAA 十进制调整MOV R0 A 送结果 书上部分例题 6位BCD码加法程序 设被加数放在32H 31H 30H单元中 加数放在42H 41H 40H单元中 和放在32H 31H 30H中 INCR0 R0指向被加数的千位 百位INCR1 R1指向加数的千位 百位MOVA R0ADDCA R1 被加数的千位 百位 加数的千位 百位DAA 十进制调整MOV R0 A 送千位 百位的和INCR1INCR0MOVA R0ADDCA R1DAAMOV R0 ARET 无符号数的乘除运算 用MUL和DIV指令实现A中的二个BCD数的相乘 并再转换成二位BCD码放于A中 解 定义数据缓冲区 入口 A 压缩BCD数 出口 A存放积 MULBCD MOVB 10H 10H 16DIVAB A中的BCD数除16分成两个BCD数 高字节在A中 低字节在B中 MULAB 两个BCD数相乘 积在A中 十进制数0 99 0 63HMOVB 0AHDIVAB 积除10 A中为十位数 B中为个位数SWAPA A中的十位数置高4位中ORLA B 数位组合 A中高4位为积的十位数 低4位为个位数RET 3 3 4 逻辑运算指令 功能 对2个8位二进制数进行逻辑与 或 非和异或操作 特点 除了以累加器A为目标寄存器的指令影响PSW的P位外 其余指令对PSW均无影响 1 逻辑与运算指令 ANL 2 逻辑或运算指令 ORL 3 逻辑异或指令 XRL 4 累加器清零和取反指令 CLR CPL 5 循环移位指令 见表3 3 逻辑与运算指令 格式 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 AXRLA 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 累加器取反取反指令可以方便的实现求补操作 逻辑运算指令应用举例 设X Y和Z分别存在X Y和Z单元 试编出能实现此电路功能的程序 并将结果送入F单元 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 移位指令 虽然MCS 51只有4条移位指令 但它可以处理所有移位问题 格式 注意 只能对累加器A进行移位 RLA左环移 累加器A 累加器A Cy 累加器A Cy 累加器A RRCA带进位位右环移 RRA右环移 RLCA带进位位左环移 举例 一 已知 在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 书上部分例题 编制一个循环闪烁灯的程序 有8个发光二极管 每次其中某个灯闪烁点亮10次后 转移到下一个灯闪烁l0次 循环不止 本程序的硬件连接如图3 3所示 当P1 i输出高电平时 LED灯亮 否则不亮 MOVA 0lH 灯亮初值SHIFT LCALLFLASH 调闪亮l0次子程序RRA 右移一位SJMPSHIFT 循环FLASH MOVR2 0AH 闪烁l0次计数FLASH1 MOVP1 A 点亮LCALLDELAY 延时MOVP1 00H 熄灭LCALLDELAY 延时DJNZR2 FLASH1 循环10次RET 3 3 5位操作指令 特点 操作数不是字节 而是某一位 每位的取值只能是 0 或 1 因而也称之为布尔变量操作 布尔变量存在于片内RAM的位寻址区 20H 2FH 11个可以按位寻址的SFR 见表3 4 1 位传送指令2 位置位 位清零和取反指令3 位运算指令 含取反 4 位控制转移指令 1 位传送指令 格式 MOVC bit其中 C为PSW中的Cy MOVbit Cbit为布尔变量的位地址 解 两个位互换必须找一个位作为缓冲位 MOVC 00HMOV01H CMOVC 7FHMOV00H CMOVC 01HMOV7FH C 举例 试将00H位和7FH位中的内容互换 2 位置位 位清零和取反指令 格式 CLRC 0 CyCLRbit 0 bit SETBC 1 CySETBbit 1 bit CPLC C CCPLbit bit bit 例1 编程通过P1 0线连续输出128个宽度为5个机器周期长的方波 解 MOVR0 00HCLRP1 0LOOP CPLP1 0NOPNOPDJNZR0 LOOP 3 位运算指令 格式 ANLC bit C bit CANLC bit C bit CORLC bit C bit CORLC bit C bit C 4 位控制转移指令 一 以Cy内容为条件的转移指令格式 JCrel 若Cy 1 则 PC 2 rel PC 若Cy 0 则 PC 2 PCJNCrel 若Cy 0 则 PC 2 rel PC 若Cy 1 则 PC 2 PC 二 以位地址为内容为条件的转移指令格式 JBbit rel 若 bit 1 则 PC 3 rel PC 若 bit 0 则 PC 3 PCJNBbit rel 若 bit 0 则 PC 3 rel PC 若 bit 1 则 PC 3 PCJBCbit rel 若 bit 1 则 PC 3 rel PC 0 bit 若 bit 0 则 PC 3 PC 解 ORG0000HMOVA 30HCJNEA 40H LOOP1SETB7FHSJMP LOOP1 JCLOOP2MOV20H AMOV21H 40HSJMP LOOP2 MOV20H 40HMOV21H ASJMP 比较内部RAM的30H和40H单元中的二个无符号数的大小 将大数存入20H单元 小数存入21H单元 若二数相等 则使内RAM的第127位置1 试判断30H中的数的正负 若为正数 存入20H单元 若为负数则存入21H单元 解 ORG0000HMOVA 30HJBACC 7 LOOPMOV20H ASJMP LOOP MOV21H ASJMP SETBP1 0MOVC Pl 0 读入P1 0位数据MOVP1 5 C 3 3 6控制转移指令 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 执行结果 SP 09H 09H 21H 08H 03H PC 3456H 绝对转移指令 双字节 双周期指令 将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转移指令 例 在以下三种情况 判断执行KRD AJMPKWRD后能否实现正常跳转 KRD为转移指令所在的地址 KWRD为跳转目标标号地址 1 KRD 0730H KWRD 0100H 2 KRD 07FEH KWRD 0100H 3 KRD 07FEH KWRD 0830H 第一种情况能够实现正常跳转 由于KRD 02 0732H与KWRD 0100H的高5位相同 在同1页内 第二种情况不能够实现正常跳转 由于KRD 02 0800H与KWRD 0100H的高5位不相同 不在同1页内 第三种情况能够实现正常跳转 短转移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相加形成 用途 用来制作一个多分支的转移结构 根据A的数值设计散转表程序 MOVR1 AMOVB 02MULABMOVDPTR TABLE DPTR指向数据散转表首地址JMP A DPTRRETTABLE AJMPROVT0 散转表AJMPROVTlAJMPROVT2当 A 0时 散转到ROVT0 A 1时 散转到ROVTl 因为AJMP是双字节指令 所以程序开始将A的内容乘以2 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 例1 将外RAM的一个数据块 首地址为10H 传送到内部数据RAM 首地址为30H 遇到传送的数据为零时停止传送 试编程 解 MOVR0 30HMOVDPTR 10HLOOP1 MOVXA DPTRJZLOOP2MOV R0 AINCR0INCDPTRSJMPLOOP1LOOP2 SJMPLOOP2 2 比较条件转移指令 3字节 a data时 PC 3 PC Cy 0CJNEA data rela data时 PC 3 rel Cy 0CJNERn data rela Y 若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 N Y Y N N Y 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 存累加和END 这是一个循环结构的程序 DJNZ指令又是决定整个循环是否结束的控制语句 将8031内部RAM的40H 4FH单元置初值 A0H AFH 解 MOVR0 40HMOVR2 10HMOVA 0A0HLOOP MOV R0 AINCR0INCADJNZR2 LOOP 3 子程序调用和返回指令 一 子程序调用指令 1 短调用指令ACALLaddr112 长调用指令LCALLaddr16 二 返回指令 一 调用指令 1 短调用指令ACALLaddr11PC 2 PCSP 1 SP PC7 0 SP SP 1 SP PC15 8 SP addr11 PC10 02 长调用指令LCALLaddr16PC 3 PCSP 1 SP PC7 0 SP SP 1 SP P

温馨提示

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

评论

0/150

提交评论