第3章_51系列指令系统和程序设计_第1页
第3章_51系列指令系统和程序设计_第2页
第3章_51系列指令系统和程序设计_第3页
第3章_51系列指令系统和程序设计_第4页
第3章_51系列指令系统和程序设计_第5页
已阅读5页,还剩91页未读 继续免费阅读

下载本文档

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

文档简介

第3章51系列指令系统和程序设计方法 本章学习目标 熟练掌握不同寻址方式以及汇编指令的方法掌握伪指令的使用以及汇编语言程序的完整格式掌握算术运算类指令对PSW各标志位的影响理解汇编语言程序的执行过程掌握程序设计的一般方法 3 1指令的格式和常用的伪指令 机器码指令与汇编语言指令机器码指令例如 0010010000000010表示把A中内容加上2 定义 用二进制代码 或十六进制数 表示的指令特点 能够直接被计算机硬件识别和执行 但不易阅读和记忆 3 1指令的格式和常用的伪指令 汇编语言指令定义 用助记符来代表指令 如上面指令替换为汇编语言 ADDA 2特点 不能被计算机硬件直接识别和执行 必须通过某种手段 汇编 把它变成机器码指令才能被机器执行 汇编语言的语句格式MCS 51汇编语言的语句格式 标号 操作码 操作数 注释 地址00 ADDA 40 把A中的值加上40地址01 ADDA 30 把A中的值加上30 汇编语言的语句格式 外号1 源操作数 目的操作数 分界符 分隔符 3 1指令的格式和常用的伪指令 1 标号标号可由多个字符组成 但头一个字符必须是字母 其余字符可以是字母 数字或其它特定字符 不能使用本汇编语言已经定义了的符号作为标号 如指令助记符 伪指令记忆符以及寄存器的符号名称等 同一标号在一个程序中只能定义一次 不能重复定义 汇编语言的语句格式 2 操作码操作码用于规定语句执行的操作内容 操作码是以指令助记符或伪指令助记符表示的 如ADDMOV等 3 1指令的格式和常用的伪指令 3 操作数操作数用于给指令的操作提供数据或地址 4 注释注释不属于语句的功能部分 它只是对语句的解释说明 5 分界符 分隔符 分界符用于把语句格式中的各部分隔开 以便于区分 包括空格 冒号 分号或逗号等多种符号 冒号 用于标号之后空格 用于操作码和操作数之间逗号 用于操作数之间分号 用于注释之前 汇编语言的语句格式 3 1指令的格式和常用的伪指令 3 1指令的格式和常用的伪指令 常用伪指令定义 伪指令没有目标代码与之对应 它主要是为汇编程序服务的 1 定位伪指令ORG 功能 汇编起始指令 一般用于规定汇编程序段或数据块的起始地址 格式 标号 ORG地址例如 ORG2000HLOOP MOVA 10H ORG伪指令规定了LOOP标号地址为2000H 则第一条指令及其后续指令汇编后的机器码从2000H开始存放 2 汇编结束伪指令END 功能 汇编结束指令 用来指示汇编程序结束汇编的位置 格式 标号 END说明 END后面的语句将不被汇编成机器码 END对程序的运行没有影响 3 赋值伪指令EQU 功能 赋值指令 用于给左边的 字符名 赋值 格式 字符名EQU数据或汇编符号说明 字符名 必须先赋值后使用 因此EQU通常放在源程序的开头 例如 ORG2000H 程序从2000H开始AAEQUR1 AA赋值后当R1使用BBEQU10H BB赋值后为8位数据TABEQU3000H TAB被赋值成16位地址MOVA BBMOVB AALCALLTAB END 4 位地址赋值伪指令BIT 功能 位地址赋值指令 用于给符号形式的位地址赋值 格式 字符名BIT位地址说明 将右边的位地址赋给左边的字符名 例如 H1BIT30HH2BITTF0MOVC H1ANLC H2MOVPSW 1 C 5 定义字节伪指令DB 功能 定义字节指令 用于在程序存储器中定义一个或多个字节 格式 标号 DB项或项表说明 把右边 项或项表 中的数据依次存入以左边标号值为起始地址的程序存储器中 例如 ORG1000HTABEQU4000H TAB DB45H 156 00101010B B 7 1END 4000H开始的单元数据 6 定义字伪指令DW 功能 定义字指令 用于在程序存储器中定义一个或多个字 一个字相当于两个字节 格式 标号 DW项或项表说明 DW与DB的功能相似 区别在于DB定义一个字节 而DW定义两个字节 执行汇编程序后 机器自动按高字节在前 低字节在后的格式排列 例如 ORG3000HABC DW4567H 08H 4 3000H开始的单元数据 3 2寻址方式 寻址方式是指CPU寻找操作数或操作数地址的方式 计算机执行程序的过程是不断地寻找操作数并进行操作的过程 寻址 如何指定操作数的所在单元 根据寻找源操作数的方法的不同 MCS 51单片机共有6种寻址方式 汇编语言的语句格式 寄存器寻址直接寻址立即寻址寄存器间接寻址变址寻址位寻址 目的操作数只有4种 寄存器寻址 直接寻址 寄存器间接寻址 位寻址 设仓库内存有操作数 8位 仓库保管员找寄存库 如R0库 R 库 通过仓库号找仓库 如30号库 直接找到操作数从寄存库中找到仓库地址 再按地址找到仓库两个寄存库 A和16位寄存器 中的地址之为仓库地址仓库内容只有1位数据 1 寄存器寻址方式定义 操作数在寄存器中 例如指令 MOVA R0 把寄存器R0的内容传送到累加器A中 结果A 36 例 寻址范围 工作寄存器 共有4组共32个工作寄存器 部分专用寄存器 例如累加器A B寄存器及数据指针DPTR等 2 直接寻址方式定义 指令中操作数直接以单元地址的形式给出 例如指令 MOVA 37 把内部RAM37单元中的数据传送给累加器A 结果A 33 寻址方式 9 8 7 3 4 立即寻址方式定义 操作数在指令中直接给出 例如 MOVA 33MOVDPTR 3000 寻址方式 5 变址寻址方式例 MOVCA A DPTR 把DPTR和A的内容相加 得到的和作为程序存储器地址单元号 仓库号 把其中的内容送A 寻址方式 34 结果A 34定义 以DPTR或PC作基址寄存器 以累加器A作变址寄存器 并以两者内容相加形成的16位地址作为操作数地址 以达到访问数据表格的目的 A中的数为无符号数 6 位寻址方式例如 MOVC 0AH 把0AH位的状态送进位位C 寻址范围 内部RAM中的位寻址区 单元地址为20H 2FH 共16个单元128位 位地址是00H 7FH 11个专用寄存器 结果是把 单元的 位的值 0 送入 标志位中 位操作时 对应 的 D7D6D5D4D3D2D1D0 寻址方式小结 CY 进位标志 AC 半进位标志 用于BCD加法调整中 OV 溢出标志 P 奇偶标志 A的 1 的个数为奇 则P 1 否则P 0 它只随A的变化而变化 RS1 RS0 寄存器区选择标志 它指示当前使用的工作寄存器F0 用户标志位 可作为软件标志 程序状态字和指令类型 Rn 当前寄存器组的8个通用寄存器R0 R7 n 0 7 Ri 可作间接寻址的寄存器 只能是R0 R1两个寄存器 i 0 1 direct 8位直接地址 在指令中表示直接寻址方式 寻址范围256个单元 包括内部RAM低128单元地址和特殊功能寄存器的单元地址 data 8位立即数 datal6 16位立即数 本条指令的起始地址 指令格式中符号意义说明 DPTR 16位数据指针 bit 内部RAM 包括专用寄存器 中的直接寻址位 间址寄存器的前级标志 加在位地址的前面 表示对该位状态取反 X 某寄存器或某单元的内容 X 由X间接寻址的单元中的内容 51系列指令系统可分为 数据传送指令算术运算指令逻辑运算指令位操作指令控制转移指令 3 4数据传送指令 内部数据传送指令MOV外部数据存储器 或I O口 的读写指令MOVX程序存储器读指令MOVC堆栈操作指令 PUSH POP 数据交换指令 XCH XCHD SWAP 功用 主要用于数据的保存及交换等场合 分类 数据传送 数据交换 栈操作 格式 MOV 功能 把源操作数指定的字节变量复制到目的操作数所指定的单元或寄存器 源字节不变 1 立即数传送指令 2 内部数据存储器 Rn 内部RAM SFR 与累加器A之间传送指令 3 内部RAM中Rn SFR与片内RAM之间的数据传送 这类指令的源操作数和目的操作数都在单片机内部 1 内部数据传送指令MOV MOVA Rn A Rn n 0 7MOVRn A Rn A MOVA Ri A Ri i 0 1MOV Ri A Ri A MOVA direct A direct MOVdirect A direct A MOVA data A dataMOVRn data Rn data n 0 7MOV Ri data Ri data i 0 7MOVdirect data direct dataMOVDPTR data16 DPTR data16 MOVdirect Rn direct Rn MOVRn direct Rn direct MOVdirect Ri direct Ri MOV Ri direct Ri direct MOVdirect1 direct2 direct2 direct1 2 以寄存器Rn为目的操作的指令MOVRn A Rn A n 0 7 MOVRn direct Rn direct n 0 7 MOVRn data Rndata n 0 7 例 MOVA 0FFHMOVR7 A结果 A 0FFH R7 0FFH 3 以直接地址为目的操作数的指令MOVdirect A direct A MOVdirect Rn direct Rn n 0 7MOVdirect1 direct2 direct1 direct2 MOVdirect Ri direct Ri i 0 1MOVdirect data directdata例 MOV2FH A 将A的内容送片内RAM的2FH单元 MOV2FH R1 将R1的内容送片内RAM的2FH单元 MOV2FH 30H 将片内RAM30H单元的内容送片内RAM的2FH单元 MOVR1 35HMOV2FH R1 R1值35H作为数据地址 并将35H单元中的值送入2FH单元 MOV2FH 35H 将立即数35H送入片内RAM的2FH单元中 4 以间接地址为目的操作数的指令MOV Ri A Ri A MOV Ri direct Ri direct MOV Ri data Ri data例 设 R0 20 MOV R0 A 将A中的内容送入地址为20的单元中 这地址号20是由 R0指出的 MOV R0 22 将22中的内容送入地址为20 R0的值 的单元中 MOV R0 34 将立即数34送入地址为20 R0的值 的单元中 5 十六位数的传递指令MOVDPTR data16功能 将一个16位的立即数送入DPTR中去 其中高8位送入DPH 低8位送入DPL 例MOVDPTR 2050H 则执行完了之后DPH中的值为20H DPL中的值为50H 等同于MOVDPH 20HMOVDPL 50H P53 例将片内RAM的15H单元的内容0A7H送55H单元 解法1MOV55H 15H解法2MOVR6 15HMOV55H R6例理解表2 8所列指令的执行结果 作业 将内部RAM中 60H单元的内容 传给70h单元中 要求用R1间接寻址方式 传给A 再通过A传给 R0 举例 设内部RAM中 30H 40H 40H 10H P1口作输入口 P1 0CAH 程序如下 MOVR0 30H 单元地址30H送R0中MOVA R0 R0间接寻址 将30H单元内容送AMOVR1 A A送R1MOVB R1 R1间接寻址 将40H单元内容送BMOV R1 P1 将P1内容送40H单元MOVP2 P1 将P1内容送P2 执行结果 R0 30H R1 40H A 40H B 10H P1 0CAH 40H 0CAH P2 0CAH 问 R0 R1 A B P1 40H P2 6 堆栈操作指令压入PUSHdirect SP SP 1 SP direct 弹出POPdirect direct SP SP SP 1例如看下列指令执行后的结果 压入 MOVSP 50HPUSHDPLPUSHDPHPUSH02PUSHPSWPUSHACCPOPDPLPOPDPHPOP02POPPSWPOPACC push时加后再存 pop时弹了再减 此时 SP 55H 此时 SP 02 DPL A DPH PSW 02 02 PSW DPH A DPL 举例 设 30H X 40H Y 试用堆栈实现30H和40H单元中的数据交换 解 堆栈区是片内RAM的一个数据区 进栈和出栈的数据符合 后进先出 的原则 MOVSP 50H 设栈顶PUSH40H 51H 40H Y压入51H单元PUSH30H 52H 30H X压入52H单元POP40H 40H 52H X弹到40HPOP30H 30H 51H Y弹到30H 用mov指令如何实现 2 外部数据存储器 或I O口 的读写指令MOVX 用 DPTR进行间接寻址的指令MOVXA DPTR A DPTR MOVX DPTR A DPTR A 用 Ri进行间接寻址的指令MOVXA Ri A Ri MOVX Ri A Ri A 指令可寻址范围 1 若外部扩展RAM小于等于256个单元 则用 Ri间接寻址进行数据传送 8位地址线足够使用 2 若外部扩展较大的RAM区域 需用P2口输出高8位地址 则用 Ri表示低8位地址 P0口分时作低8位地址线和数据线 P2口应事先预置 内部 外部 数据存储器区域 数据存储器 RAM 专用寄存器 举例 例如 1 MOVR1 0F5HMOVXA R1 A 片外0F5H 2 MOVR0 00HMOVX R0 A 片外00H A3 MOVDPTR 20F5H MOVXA DPTR A 片外20F5H 4 MOVDPTR 2000HMOVX DPTR A 片外2000H A 举例 执行 MOVP2 20HMOVR0 0FFHINCR0MOVXA R0结果 外部RAM中2000H单元内容送A 而不是2100H单元内容送A 举例 把片外RAM的70H单元中的一个数X 送到片外RAM的1010H单元 程序如下 MOVP2 00HMOVR0 70HMOVXA R0MOVDPTR 1010HMOVX DPTR A 注意 外部RAM之间不能直接传送数据 必须通过累加器A 要点分析 1 助记符为 MOVX 2 在MCS 51中 片外RAM数据传送必须通过累加器A进行 3 使用外部RAM数据传送指令时 应当首先将要读或写的地址送入DPTR或Ri中 例将外部RAM中0010H单元中的内容送入外部RAM中2000H单元中 程序如下 MOVR0 10HMOVP2 00HMOVXA R0MOVDPTR 2000HMOVX DPTR A 作业2 将内部RAM中 60H单元的内容通过R1间接寻址方式 传给A 再通过DPTR间接寻址方式传给外部RAM的70h单元中 3 程序存储器读指令MOVC 指令样式 MOVCA A DPTRMOVCA A PC指令功能 把累加器A作为变址寄存器 将其中的内容与基址寄存器 DPTR PC 的内容相加 得到程序存储器某单元的地址 再把该地址单元中的内容送累加器A 适用范围 第一条指令以DPTR作为基址寄存器 查表时DPTR用于存放表格的起始地址 此条指令的查表范围为64KB的程序存储器中的任何位置 第二条指令以PC作为基址寄存器 由于A为8位无符号数 此条指令查表范围为以PC当前值开始后的256个地址范围 例在A中送一个十进制数 用查表法获得相应的ASCII码 其子程序为 例 给A送一个十进制数 用MOVCA A DPTR获得相应的ASCII码 Tab就是0016H DPTR 0016H DATA 当DATA 2 则可取得TAB仓库群的2号仓库的内容 当DATA 1 则可取得TAB仓库群的1号仓库的内容 当DATA 0 则可取得TAB仓库群的0号仓库的内容 0 和 16H 1 和 17H 和 18H 2 XX 使得DPTR 仓库群的首址后 就有对应此关系 先从A的值与地址单元的对应关系解释 后着重说明TAB仓库群出现的意义 从而原来单纯从地址值转换成仓库群中的编号 举例 已知累加器A中有一个0 9范围内的数 用以上查表指令编出能查出该数平方值的程序 1 采用DPTR作为基址寄存器MOVDPTR 2000HMOVCA A DPTRORG2000HDB0 1 4 9 16 25 36 49 64 81若原 A 2 查表得4并存放于A中 2 采用PC作为基址寄存器1FFBHADDA data 加修正量1FFDHMOVCA A PC 查表1FFEHSJMP 待机ORG2010HDB0 1 4 9 查表指令所在单元为1FFDH 取指令后的PC当前值为1FFEH 修正量 表头地址 PC当前值 2010H 1FFEH 12H 所以data 12H 5 数据交换指令 整字节交换指令 XCH XCHA Rn A Rn XCHA Ri A Ri XCHA direct A direct 此三条指令把累加器A内容与内部RAM及SFR中的内容互相交换 影响P标志 例如 若 R0 20H A 3FH 20H 75H 执行指令 XCHA R0 结果为 A 75H 20H 3FH R0 20H 低半字节交换指令 XCHD XCHDA Ri A 3 0 Ri 3 0累加器A低4位与片内RAM某单元的低4位交换 高4位不变 累加器高低字节交换指令 SWAP SWAPA A 7 4 A 3 0将累加器A中的低4位与高4位交换 不影响标志位 5 数据交换指令 举例 例1 已知外部RAM2020H单元中有一个数X 内部RAM20H单元有一个数Y 试编写X Y交换存储地址的程序 例2 已知片内50H单元中有一个0 9的数 试编程把它变为相应的ASCII码 提示 0 9的ASCII码为30 39H 例1 MOVP2 20HMOVR1 20HMOVXA R1XCHA R1MOVX R1 A 例2 MOVR0 50HMOVA 30HXCHDA R0MOV R0 A 3 5算术运算指令 注 表示可置1或清0 0 表示总清0 1 加法指令 不带进位的加法指令 ADD ADDA Rn A A Rn ADDA directADDA RiADDA data上述指令 把源字节变量与累加器A的内容相加 结果保存在累加器A中 带进位的加法指令 ADDC ADDCA Rn A A Rn CYADDCA directADDCA RiADDCA data这4条带进位的加法指令将累加器A的内容加当前CY标志位内容 再加源操作数 将和存于累加器A中 运算结果将影响标志位CY AC OV P 注意事项 两个操作数及操作结果都是8位二进制数 操作数可以是无符号数 0 255 带符号数 补码形式 128 127 举例 例1 试分析执行如下指令后 累加器A和PSW各标志位的变化状况 MOVA 0CFHADDA 0A5H例2 设 A 0AAH R0 55H CY 1 执行指令 ADDCA R0后 A PSW 00H 0C0H 2 带借位减法指令 SUBBA Rn A A Rn CYSUBBA directSUBBA RiSUBBA data例 A 76H 立即数为C5H CY 0 求二者相减的结果 程序为 SUBBA 0C5H相应竖式为 A 01110110Bdata 11000101BCY10110001BOV C7 C6 1 0 1 有溢出 运算结果为 A 0B1H PSW 84H 3 加1和减1指令 加1指令 增量指令 INCA A A 1INCRn Rn Rn 1INCdirectINC Ri Ri Ri 1INCDPTR 减1指令DECA A A 1DECRn Rn Rn 1DEC Ri Ri Ri 1DECdirect 除了INCA和DECA指令影响PSW的P标志外 其它几条指令不影响任何标志位 4 乘法指令 MULAB功能 把累加器A和寄存器B中两个8位无符号二进制数相乘 积的高八位存在B寄存器中 积的低8位存在累加器A中 影响 进位标志CY总是清0 P标志仍为A累加器的奇偶校验位 当积大于255 B中的内容不为0 时 OV 1 否则OV 0 5 除法指令 DIVAB该指令把累加器A中的8位无符号整数除以寄存器B中的8位无符号整数 所得商存在A中 余数存在B中 对标志位的影响如下 进位标志CY总是清0 P标志仍为A累加器的奇偶校验位 当除数为0时 除法没意义 OV 1 否则OV 0 6 二 十进制调整指令 DAA 若AC 1或A3 0 9 则A A 06H 若CY 1或A7 4 9 则A A 60H该指令用于压缩BCD码加法运算的十进制调整 应注意以下几点 本指令使用时跟在ADD或ADDC指令后 不能用DA指令对BCD码减法操作进行直接调整 本指令不影响溢出标志位OV 借助标志位可实现多位BCD数加法结果的调整 例 78 93的BCD数加法的程序 及其调整过程 4位相加后大于9或有进位要加6的原因 此数用十进制表达须2位 须进一位 而十六进制与十进制的进位之间差值为6 3 6逻辑运算指令 逻辑 与 指令逻辑 或 指令逻辑 异或 指令清除指令求反指令左右移位指令这类指令除以累加器A为目的寄存器指令外 均不影响PSW中的标志位 1 逻辑 与 或 异或 指令 助记符 ANL ORL XRL指令 ANL ORL XRL A RnANL ORL XRL A RiANL ORL XRL A directANL ORL XRL A dataANL ORL XRL direct AANL ORL XRL direct data以上18条指令的功能是把源操作数与目的操作数按位进行 与 或 异或 操作 结果存于目的操作数单元或寄存器 举例 逻辑 与 的特点 不管任何逻辑量 1或0 和0相与 结果为0 和1相与 结果不变 逻辑 与 的功能 使8位二进制数的若干位清零 屏蔽这些位 而其余位不变 例 ANLA 0FH 屏蔽A的高4位设A 73H 则执行指令后 A 03H 高4位被屏蔽掉 思考 若要将两个直接地址的内容进行逻辑运算 如何实现 试编写程序实现 将40H单元和41H单元的值进行 与 运算 其结果送90H单元 提示 借助累加器A 举例 逻辑 或 的特点 不管任何逻辑量 1或0 和1相或 结果为1 和0相或 结果不变 逻辑 或 的功能 使8位二进制数的若干位置成1而其余位不变 例 ORL41H 00001010B将内存41H的位1 3置1而其它位不变 设 41H 12H 则执行指令后 41H 1AH 举例 逻辑 异或 特点 不管任何逻辑量 1或0 和0相异或结果不变 和1相异或 结果取反 逻辑 异或 功能 使8位二进制数的若干位不变而若干位取反 例 将数data的D0和D4位取反 可执行如下操作 MOVA dataXRLA 11H 2 移位 清零 取反指令 RLA 累加器左环移RLCA 累加器通过CY左环移RRA 累加器右环移RRCA 累加器通过CY右环移CLRA 累加器A清0 不影响标志位CPLA 累加器A的内容按位取反 不影响标志位 注 累加器每左移一位相当于乘以2 右移一位相当于除以2 移位指令 1 累加器内容循环左移RLA An 1Ann 0 6 A0A7 2 累加器带进位标志循环左移RLCA An 1Ann 0 6 A0CCA7 3 累加器内容循环右移RRA AnAn 1n 0 6 A7A0 4 累加器带进位标志循环右移RRCA AnAn 1n 0 6 A7CCA0 例试用三种方法将累加器A中无符号数33H乘2 答 方法1 CLRCRLCA C清0 确保移入A0的是0方法2 MOVR0 AADDA R0方法3 MOVB 2MULAB 3 7位操作指令 位操作指令的操作数是字节中的某一位 每位取值只能是0或1 故又称之为布尔变量操作指令 布尔处理器的累加器CY在指令中可简写成C 位传送指令位变量修改指令位逻辑运算指令 MOVC bit bit CMOVbit C C bit 3 8控制转移指令 控制转移指令用于改变程序计数器PC值 以控制程序走向 作用区间为程序存储器空间 无条件转移指令条件转移指令子程序调用和返回空操作指令 1 无条件转移指令 长转移指令 把指令中的16位目标地址装入PC 使程序执行下条指令时无条件转移到addr16处执行 因此 该指令是一条可以在64KB字节范围内转移的指令 LJMPaddr16 PC addr16绝对转移指令 指令中提供11位地址 与PC当前值的高5位共同组成16位目标地址 程序无条件转向目标地址 11位地址表示的存储空间为2KB 所以转移目标地址必须设置在包含AJMP指令后第一条指令的第一个字节的同意2KB范围内 AJMPaddr11 1 无条件转移指令 短转移指令 地址偏移量为带符号8位二进制数 程序转移范围为当前PC的前128或后127单元 SJMPrel PC PC 2 PC PC rel间接转移指令 将累加器A中的8位无符号数与16位数据指针相加 其和装入程序计数器PC 控制程序转向目标地址 多用在分支转移的情况 DPTR中装入多分支程序的首地址 累加器A的内容来动态选择其中的某一个分支 JMP A DPTR PC A DPTR 1 无条件转移指令组不规定条件的程序转移称之为无条件转移 MCS 51共有4条无条件转移指令 1 长转移指令LJMP地址外号 转移距离64KB 因此称之为 长转移 控制转移指令组 MOVDPTR 0 MOVDPTR ADD1 MOVA 2END 2 短转移指令AJMP地址外号 转移范围2KB 距离超过2K了 只能LJMP 2048 3 距离在127字节范围内 可用SJMP 距离在2K范围内 可用AJMP 127 3 2058 3 MOVA 1 AJMPADD1 LJMPADD1 SJMPADD1 4 变址寻址转移指令JMP A DPTR PC A DPTR 例MOVDPTR TAB 将TAB所代表地址送DPTRMOVA XRLA A 2XJMP A DPTR 跳转TAB AJMPS0 跳转表格AJMPS1AJMPS2S0 MOVA R0 JMP CPU暂停止工作S1 MOVA R1JMP CPU暂停止工作S2 MOVA R2JMP CPU暂停止工作 例 当 时 执行S0部分 当 时 执行S1部分 当 时 执行S2部分 散转 TAB 2 TAB 4 2 条件转移指令 条件转移指令是依据某种特定条件而转移的指令 转移中相对偏移量rel为8位带符号数 表示条件转移目标地址在以下一条指令地址为中心的256字节范围内 128 127 累加器判零转移指令比较转移指令循环转移指令位控制转移指令 JZrel A 0 转移JNZrel A 0 转移 CJNEA data rel 若目的字节CJNEA direct rel 小于源字节CJNE Ri data rel 则CY置1 CJNERn data rel 否则CY清0 DJNZRn rel Rn Rn 1 若 Rn 0 则 PC PC 2 若 Rn 0 则 PC PC 2 relDJNZdirect rel direct direct 1 若 direct 0 则 PC PC 3 若 direct 0 则 PC PC 3 rel 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 0 则PC PC 3 若 bit 1 则PC PC 3 bit 0 2 条件转移指令组执行条件转移指令时 如指令中规定的条件满足 则进行程序转移 否则程序顺序执行 条件转移有如下指令 MOVR0 0MOVA 0JZADD1MOVR0 1ADD1 MOVA R0 MOVR0 0MOVA 1JZADD1MOVR0 1ADD1 MOVA R0 1 累加器判零转移指令JZ地址外号 若 A 0 则跳转到外号对应地址开始执行若 A 0 则执行紧紧连在下面的这条指令JNZ地址外号 若 A 0 则跳转到外号对应地址开始执行若 A 0 则执行紧紧连在下面的这条指令 A不等于0 A不等于0 JNZ A等于0 JC地址外号 如CY 1 则跳转 否则顺序执行JNC地址外号 如果CY 0 则跳转JBbit 地址外号 如果位地址的值 1 则跳转JNBbit 地址外号 如果位地址的值 0 则跳转JBCbit 地址外号 如位地址的值 1 则清它为0并跳转 2 数值比较转移指令数值比较转移指令把两个操作数进行比较 比较结果作为条件来控制程序转移 共有四条指令 CJNEA data 地址外号CJNEA direct 地址外号CJNERn data 地址外号CJNE R data 地址外号指令的转移可按以下2个独立的部分说明 若左操作数 右操作数 则 程序顺序执行紧紧连在后面的指令并使 CY 0 若左操作数 右操作数 并使 CY 0若左操作数 右操作数 并使 CY 1 若左操作数 右操作数 则 程序跳转执行 CY 例 下面例子实现 当A 60H时 使得A R7 A 60H时 使得A R3 A 60H时 使得A R0 设计思路 A R3 返回 不等于的处理 CJNEA 60H NEQEQ MOVA R3RETNEQ JNCDALOW MOVA R0RETDA MOVA R7RET 3 减1条件转移指令把减1与条件转移两种功能结合在一起的指令 共两条 寄存器减1条件转移指令DJNZRn 地址外号功能为 寄存器内容减1 如所得结果为0 则程序顺序执行 如减后不为0 则程序跳转 直接寻址单元减1条件转移指令DJNZdirect 地址外号功能为 直接寻址单元内容减1 如所得结果为0 则程序顺序执行 如减后不为0 则程序跳转 铺垫 设 33 13 R0 15 15 22 A 18 问执行下列指令后 A MOVR0 33MOVA R0 MOVR5 3LOOP INCADJNZR5 LOOP 把2个LOOP间的内容重复3遍 例1 把内部RAM30H单元开始的3个数据送到外部RAM的2000H单元开始的3个单元中 设计思路 内部RAM不能直接传给外部RAM中 只能通过A中转MOVDPTR 2000HMOVR0 30HMOVA R0MOVX DPTR AINCDPTRINCR0MOVA R0MOVX DPTR AINCDPTRINCR0MOVA R0MOVX DPTR AAJMP 要存放数据的地址 被取数据的地址 被取的数据传入A中 A数据传入指定目的地址 下一个要存放数据的地址 下一个被取数据的地 被取的数据传入A中 A数据传入指定目的地址 下一个要存放数据的地址 下一个被取数据的地 被取的数据传入A中 A数据传入指定目的地址 CPU暂停工作 例2 把内部RAM30H单元开始的16个数据送到2000H开始的外部RAM单元中 详细解释R0加后对地址的效果 总共执行16次 把这条线包围的内容重复16次 其中后15次一模一样 第一次部分相同 但为了程序简短 我们重复16次 其中第16次的后2行是多的 但因没执行取数 存数操作 不影响结果 MOVDPTR 2000H 存放数据区首址MOVR0 30H 被取数据区首址MOVR2 16MOVA R0MOVX DPTR AINCR0INCDPTRDJNZR2 CHUANYIGEAJMP CHUANYIGE Jieshu 3 子程序调用 返回 空操作指令 长调用指令绝对调用指令返回指令空操作指令 LCALLaddr16 PC PC 3 SP SP 1 SP PC 7 0 SP SP 1 SP PC 15 8 PC addr16 ACALLaddr11 PC PC 2 SP SP 1 SP PC 7 0 SP SP 1 SP PC 15 8 PC10 0 addr11 RET 子程序调用返回指令RETI 中断服务子程序返回指令 PC15 8 SP SP SP 1 PC7 0 SP SP SP 1 NOP PC PC 1 CPU不执行任何操作 只产生一个 机器周期延迟 思考 例3 41 3 子程序调用与返回指令组 1 绝对调用指令ACALLaddr11 二字节指令 子程序调用范围是2KB 2 长调用指令LCALLaddr16三字节指令 子程序调用范围是64KB 3 返回指令RET 子程序返回指令RETI 中断服务子程序返回指令功能 子程序返回指令执行子程序返回功能 从堆找中自动取出断点地址送给PC 使程序在主程序断点处继续向下执行 MOVA 1ACALLADD1ADD2 MOVA 2 ADD1 ADDA 5RET 硬件把下条指令地址自动压入堆栈 不用PUSH 它自动把堆栈顶存的值弹给PC 分2部分解释 先解释执行顺序 再解释这样是因自动压栈和出栈导致的 取完ACALLADD1后 PC 0004执行ACALLADD1时 先把PC值压入堆栈 假设SP 60H 则61H和62H放PC的值PC装入ADD1对应的地址 把栈顶的2单元中的内容推入PC即把62H 61H中内容弹给PC 4 空操作指令NOP 使得CPU不作任何操作 只休息一个机器周期的时间 它是单字节指令 因此执行后PC加1 NOP指令常用于程序的等待或时间的延迟 例设计将两个4位压缩BCD码数 2个带千位的十进制数 相加程序 其中一个数存放在30H 存放十位 个位 31H 存放千位 百位 存储器单元 另一个加数存放在32H 存放低位 33H 存放高位 存储单元 和数存到30H 31H单元 MOVR0 30HMOVR1 32HMOVA R0ADDA R1DAAMOV R0 AINCR0INCR1MOVA R0ADDCA R1DAAMOV R0 ACLRAADDCA 0MOV32H AJMP MAIN 地址指针指向一个加数的地址 仓库号 另一地址指针指向第二个加数地址 仓库号 一个加数送累加器A 两个加数的个位 十位相加 调整为BCD码数 和数的个位 十位送30H单元 两个地址指针分别指向两个加数百位 千位 一个加数的百位 千位送累加器 两个加数的百位 千位和进位相加 调整为BCD码数 和数的百位 千位送31H单元把进位位加入32H单元中CPU暂停 小结 指令的重点是MOV SETB CLR JZ JC DJNZ CJNE ADD SUBB 3 9程序设计方法循环程序 循环程序的组成 初始化部分 设置循环的开始状态 通常是设置循环次数以及为循环体正常工作而建立的初始状态 通常是第一个操作数地址 第二个操作数地址 经常用R0 R1来指向内部RAM地址 DPTR指向外部RAM地址 循环处理部分 为重复执行某任务而编的程序 常加 减 判断等操作 循环控制部分 循环的进行和结束是靠循环控制变量和循环结束条件来控制的 在循环控制变量与循环结束条件不符时 将重复执行循环处理部分 故常需要修改2个地址指针RO R1 为下次处理作好数据准备 且循环控制变量不断被修改 当循环控制变量满足循环结束条件时 循环则结束 循环结束部分 进行结果分析或暂存 用循环法实现定时程序 在单片机的控制应用中常有定时的需要 例如定时检测和定时扫描等 可以使用程序实现 例 单循环定时程序MOVR5 0LOOP NOP 耗时一个机器周期NOPDJNZR5 LOOP 耗时2个机器周期说明 则执行一遍共4个机器周期 若单片机的晶振为12MHz 则一个机器周期是1 s 因此 一次循环的耗时为4 s 定时程序的总延迟时间是循环程序段延时时间的整数倍 故该程序的延迟时间为4 256 s 256 0 是装入R5的时间常数 R5是8位寄存器 因此 这个程序的最长定时时间 不计 MOVR5 TIME 指令 为 256 4 s 1024 s 例2 较长时间的定时程序单循环定时程序的时间延迟比较小 为了加长定时时间 应采用多重循环的方法 MOVR5 TIME1 1个机器周期LO

温馨提示

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

评论

0/150

提交评论