单片机原理及接口技术 第三章 指令系统ppt课件_第1页
单片机原理及接口技术 第三章 指令系统ppt课件_第2页
单片机原理及接口技术 第三章 指令系统ppt课件_第3页
单片机原理及接口技术 第三章 指令系统ppt课件_第4页
单片机原理及接口技术 第三章 指令系统ppt课件_第5页
已阅读5页,还剩84页未读 继续免费阅读

下载本文档

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

文档简介

第3章指令系统 3 1单片机指令系统概述 指令是指挥计算机工作的命令 一种计算机所能执行的指令集合称之为该种计算机的指令系统 3 1 1汇编语言 3 1 2指令格式 指令的表示形式称指令格式 编写程序时必须严格按指令格式书写 MCS 51指令由操作码和操作数组成 汇编语言指令格式如下 操作码助记符 操作数1 操作数2 操作数3 1 操作码助记符2 操作数 3 2寻址方式 指令中 操作数可能是具体的数据 也可能是具体的存放数据的地址或符号 无论何种情况 都可由操作数取得参与指令运行的二进制数据 这个过程叫作寻址 3 2 1立即寻址方式 所谓立即寻址就是操作数在指令中直接给出 立即寻址方式的操作数称立即数 立即数只能是源操作数 不能作为目的操作数 立即数有8位立即数和16位立即数 使用时在立即数前加 标志 例 MOVA 20HMOVDPTR 20D8H 3 2 2直接寻址方式 直接寻址就是操作数直接以单元地址的形式给出 直接地址以存贮单元形式出现 例如指令 MOVA 20H 3 2 3寄存器寻址方式 寄存器寻址就是操作数在寄存器中 例如指令 MOVA R2 3 2 4寄存器间接寻址方式 寄存器间接寻址使用的寄存器为Ri和DPTR 使用时寄存器前面加 标志 MOVA Ri MOVXA DPTR例如 R1 80H 80H 33H 则执行指令MOVA Ri后 累加器A的内容为33H而不是80H 寄存器间接寻址是以寄存器中的内容为地址取得操作数的方法 和寄存器寻址相比 寄存器寻址时 寄存器中存放的是操作数 而寄存器间接寻址中时 寄存器中存放的是操作数的地址 3 2 5基址加变址寻址方式 基址加变址寻址就是以DPTR或PC为基址寄存器 以A为变址寄存器 以两者内容相加形成16位地址作为操作数地址 例如指令 MOVCA A DPTR 3 2 6位寻址方式 位寻址方式就是以位为操作数 MCS 51单片机有相当强的位处理功能 可以对位进行直接操作 例如指令 MOVC 4AH 位寻址范围 1 内部RAM的位寻址区2 可供位寻址的11个专用寄存器 3 2 7相对寻址方式 相对寻址是在相对转移指令中 根据地址相对当前PC的偏移量得到操作数的方式 如 JZrel 偏移量rel是一带符号8位二进数的补码数 范围为 128 127 实际书写程序时往往先用地址标号代替 在汇编为机器指令时再计算出来 例3 1 指出下列每一条指令的寻址方式 MOV2FH 40H MOVA R0 MOVDPTR 2020H MOV45H P0 MOVA R1 MOVCA A PC JCLOOP 中的源操作数为立即寻址 目的操作数为直接寻址 中的源操作数为寄存器间接寻址 目的操作数为寄存器寻址 中的源操作数为16位立即寻址 目的操作数为寄存器寻址 中的源操作数和目的操作数都是直接寻址 中的源操作数和目的操作数都为寄存器寻址 中的源操作数为基址加变址寻址 目的操作数为寄存器寻址 中的操作数为相对寻址 例3 2 判断下列指令是否正确 若不正确请指出错误 MOVA DPTR MOVDPTR 03H MOV 80H R7 MOVB C 解 不正确 A是8位寄存器 DPTR为16位寄存器 不匹配 正确 不正确 80H为立即数 不能作为目的地址 不正确 B为8位字节寄存器 C为1位位累加器 不匹配 3 3数据传送指令 1 通用传送指令MOV 指令格式 MOV 功能 把源操作数所表示的数据传送到目的地址指定的存贮单元之中 而不改变源操作数 即该指令是 复制 不是 搬家 3 3 1内部RAM数据传送指令 2 以Rn为目的地址的指令MOVRn A Rn A MOVRn direct Rn direct MOVRn data Rn data 1 以累加器A为目的地址的指令MOVA Rn A Rn MOVA direct A direct MOVA Ri A Ri MOVA data A data 4 以寄存器间接地址为目的的地址的指令MOV Ri A Ri A MOV Ri direct Ri direct MOV Ri data Ri data 3 以直接地址为目的地址的指令MOVdirect A direct A MOVdirect Rn direct Rn MOVdirect direct direct direct MOVdirect Ri direct Ri MOVdirect data direct data 5 16位数据传送指令MOVDPTR data16 DPTR data16 DPL data7 0 DPH data15 8 例3 3 设RAM40H单元的内容为80H 80H单元内容为47H P1口的输入状态为0FFH 试判断下列程序执行结果 MOVR0 40HMOVA R0MOVR1 AMOVB R1MOV R1 P1MOVP2 P1 解 执行结果为 A 80H B 47H R0 40H R1 80H P1 0FFH P2 0FFH 80H 0FFH R0 40H A 40H 80H R1 80H B 80H 47H 80H 0FFH P2 0FFH 1 字节交换指令XCHXCHA Rn A Rn XCHA direct A direct XCHA Ri A Ri 2 数据交换指令 例 设 A 08H R7 0DCH 执行指令XCHA R7结果为 A 0DCH R7 08H 功能 将累加器A中内容与源操作数互换 例 A 80H R0 30H 30H 0FH 执行指令XCHDA R结果为 A 8FH 30H 00H 2 半字节交换XCHD XCHDA Ri A 低4位 Ri 低4位功能 累加器A中内容与源操作数低4位交换 高4位不变 3 累加器高低数字节交换指令SWAPASWAPA A 低4位 A 高4位功能 A中高4位与低4位互换 例 A 80H 执行SWAPA结果为 A 08H 解 XCHA 20HSWAPAMOVR1 21HXCHDA R1SWAPAXCHA 20H 例3 4 试用交换指令使片内20H单元的高4位与21H单元的低4位交换 数据写入堆栈称入栈 数据从堆栈中读出称出栈 3 栈操作指令 PUSHdirect SP SP 1 SP direct 功能 将堆栈指针加1后 片内RAM单元内容送进栈顶单元 原RAM单元内容不变 说明 PUSH指令常用于保护CPU现场 栈操作是字节指令 每次只能压入或弹出1个字节的内容 如PUSHDPTR是错误的 但可以用以下两条指令完成DPTR的入栈 PUSHDPHPUSHDPL 1 入栈指令PUSH 例 设 A 30H B 80H SP 50H 则执行指令 PUSHAPUSHB 结果为 51H 30H 52H 80H SP 52H POPdirect direct SP SP SP 1功能 将 SP 内容传送给片内RAM单元 SP内容减1 说明 栈操作要注意先入后出的原则 POP指令常用于恢复CPU现场 2 出栈指令POP 例3 5 试用栈操作指令完成P0和P1内容的互换 解 PUSHP0PUSHP1POPP0POPP1 3 3 2片外数据存贮器与累加器A之间的传送指令 MOVXA DPTR A DPTR MOVXA Ri A Ri MOVX DPTR A DPTR A MOVX Ri A Ri A 说明 片外数据存贮单元与片内RAM之间的数据传送以及片外数据存贮单元之间的数据传送不能直接进行 必须通过累加器A中转 MOVX20H 2000H及MOVX3000H 2000H等都是错误的 寻址方式只能是寄存器间接寻址 参与间接寻址的寄存器只有Ri和DPTR两种 3个 DPTR为16位寄数器 寻址范围为000H 0FFFFH共64KB空间 而Ri是8位寄数器 只能寻址00 0FFH低256单元 解 MOVDPTR 2000HMOVXA DPTRMOV20H A MOVDPTR 2000HMOVXA DPTRMOVR0 0FAHMOVX R0 A 例3 6 将片外数据存贮器2000H单元的内容传送到片内的20H单元中 将片外数据存贮器2000H单元的内容传送到片外0FAH单元 3 3 3程序存贮器向累加器A传送指令 MOVCA A PC A A PC MOVCA A DPTR A A DPTR 说明 程序存贮器只能读出 不能写入 所以其数据传送都是单向的 即从程序存贮器读出数据 且只能向累加器A传送 ROM片内 片外是统一编址 该指令既可访问片内 又可访问片外程序存贮器 该类指令主要用于查表 又称查表指令 应用时 一般以PC或DPTR确定表格的首址 查表时 根据A中不同的内容查找到表格中的相应项 故此时称PC或DPTR为基址寄存器 A为变址寄存器 寻址方式为基址加变址寻址 使用DPTR作基址寄存器比较灵活 且不易出错 建议尽可能使用MOVCA A DPTR指令 解法一 以DPTR为基址寄存器 平方表首址可灵活安排在适当的位置如2000H 即平方表的内容从2000H单元放起 程序如下 ORG1800HMOVDPTR 2000HMOVA 20HMOVCA A DPTRMOV21H AORG2000HDB00H 01H 04H 10H 19H 24HDB31H 40H 51H 64H 例3 7 以查表方式求出片内RAM中20H单元数的平方值 存入片内21H单元中 ORG1000H1000MOVA 20H1001ADDA 03H1003MOVCA A PC1004MOV21H A1006RET1007DB00H 01H 04H 解法二 以PC为基址寄存器 此时表格须紧跟程序之后 且要计算好表格首址位置 XCHA 20HXCHA 30HXCHA 20H 例3 8 改正下列指令中的错误 完成其功能 MOVA 2000H 片外RAM2000H单元内容送入A MOVX20H 2000H 片外RAM2000H单元内容送入片内20H单元 MOVCA 2000H 将ROM2000H单元内容送入A MOVXA A DPTR 以查表方式将片外RAM单元的内容送入A XCH40H 30H 交换片内RAM30H和40H单元的内容 PUSHAB 将寄存器对AB的内容压入堆栈 解 MOVDPTR 2000HMOVXA DPTR MOVDPTR 2000HMOVXA DPTRMOV20H A MOVDPTR 2000HMOVA 0MOVCA A DPTR 无法以查表方式将片外RAM存贮单元的内容送入A PUSHAPUSHB 3 4算术运算类指令 1 不带进位加法指令ADD ADDA Rn A A Rn ADDA direct A A direct ADDA data A A dataADDA Ri A A Ri 3 4 1加法指令 功能 ADD指令把源操作数与累加器A内容相加 结果存在累加器中 该操作不改变源操作数 影响PSW中的C AC OV和P位 说明 ADD指令的目的操作数只能是累加器A 且只有以上4种形式 如ADDB 40H或ADDA 203AH都是不存在 非法的 指令中 参加运算的两个8位二进制数 即可看作是8位无符号数 0 255 也可以看作是7位带符号数的补码数 128 127 例3 9 试编程计算40H和41H两单元字节数的和 并存放在42H单元 若 40H 0B3H 41H 79H 给出计算结果并判断PSW受影响的位 解 程序如下 MOVA 40HADDA 41HMOV42H A 若 40H 0B3H 41H 79H 则运算结果 若是无符号数 和为12CH 若是有符号数 和为 2CH 42H 2CH C 1 AC 0 OV 0 P 1 2 带进位加法指令ADCC ADDCA Rn A A Rn C ADDCA direct A A direct C ADDCA data A A data C ADDCA Ri A A Ri C 功能 该操作与ADD类似 只是PSW中的进位位C参与运算 带进位加法指令通常用于多字节或多个数加法运算 解 当 C 0时 两指令运行结果一样 为 A 0A4H 当 C 1时 两指令运行的结果不同 相差1 即ADDA 30H的结果为 A 0A4H 而ADDCA 30H的结果是 A 0A5H 显然 ADD指令与C值无关 而ADDC的运行结果与C值有关 例3 10 已知 A 26H 30H 7EH 比较在 C 0 C 1两种情况下执行ADDA 30H和ADDCA 30H指令的结果 解 MOVA 30HADDA 40H 低字节相加MOV50H AMOVA 31HADDCA 41H 高字节相加MOV51H AADDCA 00H 取高相加产生的进位MOV52H A说明 多字节数求和 从低字节开始 最低字节相加用ADD指令 高字节相加用ADDC指令 N字节数相加 结果可能为N 1字节数 为单独取得进位的值 可参考例3 11 例3 11 两字节无符号数相加 被加数放在内部RAM30H 31H单元 低位放在前 加数放在内部RAM40H 41H单元 计算两数的和 放在50H 52H单元中 3 增量指令INC INCA A A 1INCRn Rn Rn 1INCdirect direct direct 1INC Ri R i Ri 1INCDPTR DPTR DPTR 1 功能 对A Rn 内部RAM单元及数据指针DPTR进行加1操作 除INCA影响P外 不影响任何标志位 说明 若原为0FFH 执行该指令后 将变为00H 但不影响进位位C 其结果为 A 00H R2 10H R0 40H 40H 01H DPTR 1B00H PSW中 P 0 C及其它位不变 例3 12 A 0FFH R2 0FH R0 40H 40H 00H DPTR 1AFFH执行下列指令 INCAINCR2INC R0INCDPTR 4 十进制调整指令DAA DAA 例3 13 在20H 21H中分别存放压缩BCD码55和72 试将两数相加 并计算出结果 解 MOVA 20HADDA 21HDAA 结果 A 27 C 1如果不使用DAA指令 则结果为0C7H 是错误的 例3 14 设两个4位BCD码分别存放在30H 十位 个位 和31H 百位 千位 40H 十位 个位 和41H 百位 千位 试编程求这两个数的和 结果存放在30H 31H 32H中 解 程序如下 MOVR0 30HMOVR1 40HMOVA R0 取十位 个位ADDA R1 两数十位 个位相加DAA 调整为BCD码MOV R0 A 存十位 个位INCR0INCR1MOVA R0 取千位 百位ADDCA R1 两数千位 百位和进位位相加DAA 调整为BCD码MOV R0 A 存千位 百位MOVA 0ADDCA 0INCR0MOV R0 A 存万位 3 4 2减法指令 1 带进位减法指令SUBB SUBBA Rn A A Rn C SUBBA direct A A direct C SUBBA Ri A A Ri C SUBBA data A A data C 功能 指令功能是以A中数为被减数 减去操作数 再减去进位 差存在A中 影响PSW中的C AC OV 和P位 说明 MCS 51指令系统中 无不带进位 实为借位 的减法指令 若进行不带借的减法运算 要在运算前使用ADDA 00H或CLRC等指令将进位标志清0 减法指令中 无BCD码调整 例3 15 两个双字节数相减 被减数放在30H 31H 减数放在40H 41H中 差放入50H 51H 解 ADDA 00H 将进位位清0MOVA 30HSUBBA 40H 低字节相减MOV50H AMOVA 31HSUBBA 41H 高字节相减MOV51H A说明 多字节相减 从低字节开始 最低字节相减时 应先将进位位清0 2 减1指令DEC DECA A A 1DECRn Rn Rn 1DECdirect direct direct 1DEC Ri Ri Ri 1 功能 减1运算说明 与INC命令类似 但无DPTR减1指令 若原为00H 执行该指令后 将变为0FFH 例如 A 10H R5 00H 30H 2FH R0 40H 40H 0FFH 则执行以下指令 DECA DECR5 DEC30H DEC R0结果为 A 0FH R5 0FFH 30H 2EH 40H 0FEH P 0 3 4 3乘法指令MUL MULAB 功能 累加器A和寄存器B中的两个无符号8位数相乘 所得16位乘积的低8位放在A中 高8位入在B中 说明 乘法指令影响PSW的状态 执行MUL指令后 C被清0 OV与结果有关 若OV 0 表示乘积小于255 0FFH 只在A中 B 0 若OV 1 则乘积大于255 B 0 例如 A 20H B 0A0H 执行指令MULAB结果 A 00H B 14H 即积为1400H C 0 OV 1 3 4 4除法指令DIV DIVAB 功能 两8位无符号数相除 被除数置于累加器A中 除数置于寄存器B中 指令执行后 商存于A中 余数存于B中 说明 该指令执行后 C清0 若除数为0 即寄存器B内数据为0 OV 1 表明除0没有意义 若除数不为0 则 OV 0 例 A 0FBH B 12H 则DIVAB结果 A 0DH B 11H C 0 OV 0 例3 16 编程实现下列运算 F D1 D2 D3 D4 其中D1 D2 D3 D4都为非0的8位二进制无符号数 解 MOVA D1MOVB D2MULAB 计算D1 D2MOVR2 A 暂存D1 D2的结果MOVR3 BMOVA D3MOVB D4DIVAB 计算D3 D4ADDA R2 乘积的低位与商相加MOVR2 A 存F低位MOVA R3ADDCA 0 乘积的高位与低位和的进位相加MOVR3 A 存F高位在R3中 3 5逻辑运算及移位指令 1 逻辑与指令ANL 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 3 5 1逻辑运算指令 说明 逻辑运算是按位进行的 只影响标志位P 该指令用于屏蔽某些位 例3 17 将R1中的低4位清0 高4位不变 解 MOVA 11110000BANLA R1MOVR1 A 结果为 A 62H 例 设 A 7AH 20H 0E6H 执行指令ANLA 20H 2 逻辑或指令ORL ORLA Rn A A Rn ORLA direct A A direct ORLA Ri A A Ri ORLA data A A dataORLdirect A direct A direct ORLdirect data direct direct data 例3 18 将片外RAM2000H单元的0 1位置1 2 3位清0 其它位不变 解 MOVDPTR 2000HMOVXA DPTRORLA 00000011BANLA 11110011BMOV DPTR A 3 逻辑异或指令XRL 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 说明 若与0进行异或运算 结果保持不变 若与1进行异或运算 结果取反 自身异或等效于清0 例XRLA A结果为 A 0 例3 19 将20H单元内容1 3 5 7位保持不变 0 2 4 6位取反 解 XRL20H 01010101B若 20H 11110110则执行指令 结果为 20H 10100011B 4 累加器清0指令CLR CLRA CPLA 5 累加器取反指令CPL 例如 A 0E6H执行CPLA 结果为 A 19H说明 1 取反即为逻辑非运算 2 MCS 51单片机没有求补指令 若对累加器A中数求补 则程序如下 CPLAINCA 3 5 2移位指令 循环左移RLA An 1 An A0 A7循环右移RRA An An 1 A7 A0进位循环左移RLCA An 1 An A0 C C A7带进位循环右移RRCA An An 1 A7 C C A0 例3 21 分析下列程序段实现的功能 MOVA directRLAMOVR1 ARLARLAADDA R1MOVdirect A 解 各指令实现的功能依次如程序右边注译 可知该程序实现的功能是将存贮单元的数乘以10 取数设为D0 D0 2 R1 2D0 2D0 2 4D0 2 8D0 2D0 存数10D0 例3 20 将20H单元存放的无符号数除2 解 ADDA 0 C清零MOVA 20HRRCAMOV20H A 3 6位操作指令 MOVC bit C bit MOVbit C bit C 例3 22 将20H位的内容送至50H位 并要求不改变C的状态 解 MOV10H C 保护C内容MOVC 20HMOV50H CMOVC 10H 恢复C内容 3 6 1位传送指令MOV 说明 多数位操作指令由C参与 C称位累加器 位操作指令寻址方式为位寻址 3 6 2位置位 复位指令 1 位置位 置1 命令SETBSETBC C 1SETBbit bit 12 位复位 清0 命令CLRC C 0CLRbit bit 0 说明 位置位 复位命令可以方便改变位空间的单个位的内容 十分灵活 例如许多运算要先将C清零 我们用以用ADDA 0来清零 也可以直接用CLRC指令 3 6 3位运算指令 1 逻辑与指令ANLANLC bit C C bit ANLC bit C C bit 2 逻辑或指令ORLORLC bit C C bit ORLC bit C C bit 3 逻辑非 求反 指令CPLCPLbit bit bit 解 MOVC bit1ANLC bit2 C bit1 bit2 MOVbit0 CMOVC bit2ANLC bit1 C bit1 bit2 ORLC bit0MOVbit0 C 例3 23 设bit0 bit1 bit2为三个位地址 试编程实现异或运算bit0 bit1 bit2 bit1 bit2 bit1 bit2 程序如下 MOVC P0 1ANLC P0 0ORLC P0 2MOVP1 7 C 例3 24 编程实现图3 9的逻辑功能 3 7控制转移类指令 程序的顺序执行是由PC自动加1实现的 要改变程序的执行顺序 实现分支转向 必须通过强迫改变PC值的方法来实现 这就是控制转移类指令的基本功能 控制转移类指令可以控制程序根据不同情况执行不同的程序段 令单片机应用系统做出相应的动作 控制转移类指令使单片机具有 智能化 功能 控制类指令的掌握使用较复杂 包括无条件转移指令 条件转移指令及子程序调用返回指令 3 7 1无条件转移指令 1 长转移指令LJMPLJMPaddr16 PC addr16功能 指令执行后将16位地址 addr16 传送给PC 从而实现程序转移到新的地址开始运行 说明 该指令可实现64KB范围的任意转移 2 短转移指令SJMP SJMPrel PC PC 2 rel 功能 执行指令后 程序从当前位置向前或向后跳转rel个单元运行 说明 该指令中寻址方式称相对寻址 rel为8位带符号补码数 因此所能实现的程序转移是双向的 若rel为正数 则向前转移 若rel为负数向后转移 转移相对范围图是 128 127H共256个单元 注译中的 PC PC 2 rel 是这样得来的 注译中 PC 是该指令执行前的值 前面的 PC 是指指令执行后的值 因 SJMPrel 指令存放在ROM中占用2个字节单元 为双字节指令 故程序从指令执行后 当前位置 向前或向后跳转rel个单元 也就是从指令执行前的位置向前或向后跳转2 rel个单元 AJMPaddr11 PC PC 2 PC10 0 addr11功能 addr11的11位数取代该指令执行后程序指针PC的低11位PC10 0 程序根据PC值转移运行 说明 addr11为11位无符号数 程序转移最大范围为2KB LJMP STMP AJMP功能相同 只是转移范围不同 3 绝对转移指令AJMP JMP A DPTR PC A DPTR 功能 由A及DPTR的内容决定程序转移的目的地址 说明 DPTR为基址寄存器 A为变址寄存器 为基址加变址寻址方式 把DPTR值固定 赋与A不同的值 则可实现程序的多分支转移 4 变址转移指令JMP 3 7 2条件转移指令 测试转移指令1 累加器A判0转移指令JZrel 若 A 0 转移 PC PC 2 rel 若 A 0 顺序执行 JNZrel 若 A 0 转移 PC PC 2 rel2 进位位测试转移指令JCrel 若 C 1 转移 PC PC 2 relJNCrel 若 C 0 转移 PC PC 2 rel 所谓条件转移就是程序的转移是有条件的 当指令中规定的条则满足时 程序转移 否则程序不转移 仍顺序执行 3 位单元测试转移指令JBbit rel 若 bit 1 转移 PC PC 3 relJNBbit rel 若 bit 0 转移 PC PC 3 relJBCbit rel 若 bit 1 转移 PC PC 3 rel 同时将bit位清零 功能 根据测试条件决定程序是否转移执行 说明 若条件满足程序转移执行 若条件不满足 顺序执行 位单元测试转移指令为三字节指令 故执行该类指令 若条件满足转移时 PC PC 3 rel 其它测试转移指令为双字节指令 条件满足转移时 PC PC 2 rel 解 MOVR0 DATA2 赋首址MOVDPTR DATA1LOOP1 MOVXA DPTR 取数JZLOOP2 判断是否为0MOV R0 A 不为0存数INCR0 准备取下一个数INCDPTRSJMPLOOP1 重复取数过程LOOP2 RET 例3 25 将外部RAM的一个数据块 首址为DATA1 传送到内部RAM 首址DATA2 遇到传送的数据为零时停止 格式为 CJNE relCJNEA direct rel 累加器A与内部RAM的direct单元不等转移 CJNEA data rel 累加器A与立即数data不等转移CJNERn data rel 寄存器Rn与立即数data不等转移CJNE Ri data rel 间接寻址的片内RAM单元与立即数data不等转移 2 比较不相等转移指令CJNE 说明 数据比较转移指令多位三字节指令 利用该类指令不但可以实现程序的转移功能 也可以用以比较两数值的大小 指令执行后进位位C的状态相当反映了被比较数与比较数相减有无借位 解 MOVR0 DATALOOP1 CJNE R0 64H LOOP2SJMPLOOP3LOOP2 INCR0SJMPLOOP1LOOP3 MOVA R0 例3 26 找出片内RAM的DATA为首址的数据块中第一个等于100的数 并将其地址存入A中 DJNZRn relDJNZdirect rel 功能 寄存器Rn或direct单元内容减1 如果结果为零 则程序顺序执行 如果还没有减到0 则程序转移 说明 这两条指令主要用于控制程序循环 又称循环指令 预先赋值Rn或RAM单元 以控制循环次数 3 减1不为0转移指令DJNZ 解 分析 这是一个重复操作过程 可以使用循环指令 30H 7FH共50H个单元 循环次数为50H 程序如下 MOVR7 50HMOVR0 30HNEXT MOV R0 0INCR0DJNZR7 NEXT 例2 27 将内部RAM的30H 7FH单元清0 解 MOVDPTR 2000H 数据传送的源地址PUSHDPL 保存源地址PUSHDPHMOVDPTR 3000H 数据传送的目的地址MOVR2 DPL 保存目的地址MOVR3 DPHLOOP POPDPH 取源地址POPDPLMOVXA DPTR 从源地址单元取数INLDPTR 下一个单元源地址PUSHDPL 保存源地址PUSHDPHMOVDPL R2 取目的地址MOVDPH R3MOVX DPTR A 将数据存入目的地址INCDPTR 下一个目的地址MOVR2 DPL 保存目的地址MOVR3 DPHDJNZ30H LOOP 判断数据传送是否结束 例3 28 把从2000H开始的片外RAM单元中的数据传送到从3000H开始单元中 数据个数存放在片内RAM30H单元中 3 7 3子程序调用返回指令 1 长调用指令LCALLLCALLaddr162 绝对调用指令ACALLACALLaddr113 返回指令RETRETI 中断服务子程序返回指令 3 7 4空操作指令NOPNOP PC PC 1 3 8MCS 51指令机器代码 指令的存贮和运行是以二进制代码的形式进行的 这些代码称机器指令或机器码 机器指令中的代码长度各有不同 有单字节 双字节和三字节3种 对应指令分别称为单字节指令 双字节指令和三字节指令 3 8 1机器代码及其存贮 3000HE8MOVA R03001H240FADDA 0FH3003H902000MOVDPTR 2000H3006HF0MOV DPTR A 3 8 2机器码的查表计算 1 指令中带有立即数 直接地址 工作寄存器的机器码 每条汇编指令都有与之一一对应的机器指令 亦即机器码 可由MCS 51指令表 附录6 中查出 某些指令码由表中直接给出 还有一些须经过简单的推算方能得出 指令中的立即数 直接地址直接参与编码 解 查表 指令PUSH80H属PUSHdirect形式 PUSHdirect的代码项为 C0direct 所以PUSH80H的代码为 C080表中指令MOVDPTR data16代码项为 90data15 8data7 0 故MOVDPTR 2000H的代码为 902000表中指令ADDA R5的代码项为28 2F 则可知ADDA R5的代码为2D 例3 29 分别给出PUSH80H MOVDPTR 2000H ADDA R5的代码 2 非相对址控制转移类指令的机器码 1 长转移及长调用指令在LJMPaddr16及LCALLaddr16中 16位地址往往是用地址标号表示的 这时须将地址标号所在指令的首址计算出 例 标号地址START为0100H 标号LOOP为8100H 则START LCALLLOOP的代码为 128100分别存贮在0100H 0101H和0102H的ROM单元中 指令AJMPadd

温馨提示

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

评论

0/150

提交评论