MCS-51单片机指令系统.ppt

上传人:sh****n 文档编号:6380741 上传时间:2020-02-24 格式:PPT 页数:93 大小:405.55KB
返回 下载 相关 举报
MCS-51单片机指令系统.ppt_第1页
第1页 / 共93页
MCS-51单片机指令系统.ppt_第2页
第2页 / 共93页
MCS-51单片机指令系统.ppt_第3页
第3页 / 共93页
点击查看更多>>
资源描述
第3章单片机的指令系统 本章学习指令是控制计算机进行各种运算和操作的命令 一台计算机所能执行的全部指令的集合称为指令系统 一般来说 一台计算机的指令越丰富 寻址方式越多 指令的执行速度越快 则它的总体功能也就越强 不同种类的单片机指令系统一般是不同的 本章将以80C51为例 详细介绍MCS 51单片机的指令系统的寻址方式 指令的格式及功能 3 1汇编指令与格式3 1 1指令格式和常用符号 1 指令格式 1 汇编语言指令格式 标号 操作码 第一操作数 第二操作数 第三操作数 注释 其中方括号 括起来的部分为可选项 例如 AM1 MOVA 78H 向A传输立即数78H 标号标号是指令的符号地址 程序汇编时 汇编程序将指令首地址 即指令第一个字节所存单元的地址 赋值给标号 有了标号 程序中的其他语句操作就能寻找到该语句 标号由1 6个英文字母或数字组成 且第一个必须为英文字母 本汇编语言中已经有确切定义的符号不能作为标号 如指令助记符 伪指令 寄存器名 条件标志等 同一标号在一个程序中只能定义一次 标号后面必须跟以冒号 操作码用来规定指令进行何种操作 是指令中不能空缺的部分 一般采用具有相关含义的英语单词或缩写表示 操作数表示参与指令操作的数或数所在的地址 在一条指令中操作数的个数可以是一个 二个或三个 也可以没有操作数 操作码与操作数之间以空格分隔 操作数与操作数之间用逗号 分隔 指令中有两个操作数时 一般将前面的操作数称为目的操作数 后面的操作数称为源操作数 格式为 操作码目的操作数 源操作数 注释注释是为了便于阅读程序 对语句所作的解释说明 不产生目标代码 注释必须用分号 开头 当注释内容一行写不完时 可以换行继续写 但是新的一行必须同样以 号开头 2 机器码指令格式机器码指令也包括操作码和操作数两个基本部分 在MCS 51单片机指令系统中 指令根据其机器码的长度分为单字节 双字节和三字节三种指令 单字节指令单字节指令只有一个字节的操作码 无操作数 在程序存储器中占一个存储单元 例如指令 RET机器码为 00100010 十六进制代码为 22H 例如指令 MOVA R0其机器码为 11101000 十六进制代码为 E8H 双字节指令双字节指令含有两个字节 第一个字节为操作码 第二个字节为操作数 在程序存储器中要占两个存储单元 例如指令 MOVA 55H机器码为 0111010001010101B 十六进制代码为 7455H 其中74H为操作码 55H为操作数 累加器A的信息隐含在了操作码中 三字节指令这类指令中 第一个字节为操作码 第二和第三字节均为操作数 在程序存储器中要占3个存储单元 例如指令 MOV20H 79H机器码为 011101010010000001111001B 十六进制代码为 752079H 其中75H为操作码 20H为操作数1 79H为操作数2 2 指令系统中有关符号说明在MCS 51指令系统中 描述指令格式时要用到一些符号 这些符号的约定含义是 Rn 当前工作寄存器区中的工作寄存器R0 R7 n 0 1 2 7 Ri 当前工作寄存器区中的工作寄存器R0和R1 i 0或1 Direct 8位直接字节地址 既可以是内部RAM的低128个单元的地址 也可以是特殊功能寄存器的单元地址 或寄存器符号 data 8位常数 也称立即数 为立即数前缀符号 data16 16位立即数 addr16 16位目的地址 用于LCALL和LJMP指令中 Addrll 11位目的地址 用于ACALL和AJMP指令中 rel 相对偏移量 用8位带符号数的补码表示 在相对转移指令中作地址偏移量 其对应的十进制值范围为 128 127 Bit 位地址 位操作指令中操作数的前缀 表示将该操作数的内容取反 X 某寄存器或某单元的内容 X 表示以X中的内容为地址的单元中的内容 数据传送的方向 当前指令的起始存放地址 3 1 2伪指令伪指令由程序设计人员在源程序中写出 是对汇编程序进行汇编是下达的指示 例如 指定程序存放的地址 定义符号 指定暂存数据的存储区等 伪指令并不生成目标代码 仅仅在汇编过程中起作用 故又称他为汇编命令或汇编程序控制命令 不同的单片机开发系统 其汇编程序的伪指令并不完全相同 下面介绍一些常用的伪指令 ORG 指定程序或数据起点 指令格式 ORGnn其中nn是16位二进制数或十进制数表示的地址值 指令功能 指明随后语句从nn单元开始存放 汇编时 第一条指令或数据首字节存入nn单元 以后程序顺序往下存放 此语句总是出现在每段源程序的前面 当程序中有多条ORG指令时 要求各条ORG指令的操作数 16位地址 由小到大顺序安排 空间不允许重叠 ORG0000HLJMPMAIN 上电转向主程序ORG0023H 串行口中断入口地址LJMPSERVE1 转中断服务程序ORG2000H 主程序MAIN MOVTMOD 20H 设T1作方式2MOVTH1 0F3H 赋计数初值MOVTL1 0F3HSETBTR1 启动T1 2 END 汇编结束 指令格式 END或END标号指令功能 源程序的结束标志 表明程序结束 汇编程序对该指令后面的内容将不再处理 如果源程序是一段子程序 END后不写标号 如果是主程序 则必须写标号 所写标号是该主程序第一条指令的符号地址 一个程序中要有而且只能有一条END指令 3 EQU 赋值 指令格式 字符名称EQU赋值项指令功能 用于给字符名称赋予一个特定值 赋值以后 其值在整个程序中有效 同一字符名称只能赋值一次 其中 赋值项可以是常数 地址或标号 其值可为8位或16位二进制数 赋值以后的字符名称既可以作地址使用也可以作立即数使用 例如 AAEQUR1A10EQU10HORG0500HMOVR0 A10 R0 10H MOVA AA A R1 4 DB 定义字节 指令格式 标号 DB项或项表指令功能 用于定义字节的内容 项或项表指所定义的一个字节或用逗号分开的字节串 汇编程序将把DB指令中项或项表所指字节的内容 数据或ASCII码 依次存人从标号开始的存储器单元 例如 ORG1000HFIRST DB73 01 01 90 38 00 01 00SECOND DB02 34 00 89 67 45 15 26 又例如 ORG0600HSTART MOVA 0B4H TAB DB45H 73 01011010B 5 A 4H上述程序中 通过DB伪指令实现将项表中的5个字节数依次存放在以TAB标号为起始地址的各存储单元中 即TAB单元存入45H TAB 1单元存入49H 即73的十六进制数 TAB 2单元存入5AH 即01011010B TAB 3单元存入35H 5的ASCll码 TAB 4单元存入41H A的ASCll码 TAB 5单元存入FCH 4H的补码 DW指令 定义字 指令格式 标号 DW项或项表指令功能 用于定义字的内容 项或项表指所定义的一个字 两个字节 或用逗号分开的字节串 每个字低8位先放 高8位后放 低字节放在低地址 高字节放在高地址 DS 定义数据单元 指令格式 标号 DS数字指令功能 用于保留待存放的一定数量的存贮单元 定义应保留的存贮器单元数 说明自标号所在的地址起共有指令中数字指明的存贮单元数保留可供存入数据 例如 ORG1800HDATE DS05H上面DS指令表示 从1800H地址开始 保留5个连续的地址单元作为备用 注意 对MCS 51单片机来说 DB DW DS伪指令只能对程序存储器使用 不能对数据存储器使用 BIT 定义位 指令格式 标号BIT项指令功能 用于定义某特定位的标号 项指的是所定义的位 经定义后 便可用指令中队左面的标号来代替BIT面项所指出的位 例如 FLGBITF0经BIT伪指令定义后 可以在指令中用FLG来代替位地址F0 这就是直接寻址位的第四种表示方式 3 2寻址方式计算机绝大多数指令执行时都需要使用操作数 因此 指令中就需要给出这些操作数或者给出寻找操作数的地址 指令中给出操作数的地址的方式 叫做寻址方式 根据指令操作的需要 计算机总是提供多种寻址方式 寻址方式越多 计算机的寻址能力就越强 单片机的功能也就越强 MCS 5l单片机共有七种寻址方式 下面分别介绍 1 立即寻址指令中直接给出参与操作的常数 称为立即数 这种寻址方式称为立即寻址 例3 1 MOVA 60H机器码为 74H60H 例3 2 MOVDPTR 1808H机器码是 90H18H08H 2 直接寻址指令中直接给出操作数所在存储单元的地址 这种寻址方式称为直接寻址 1 内部数据存储区 00H 7FH 例3 3 MOVA 40H机器码是 E5H40H 2 特殊功能寄存器区 80H FFH 特殊功能寄存器SFR只能用直接寻址方式访问 当直接寻址某个SFR时 直接地址可以用它的单元地址 也可以使用它的寄存器符号 以上两种表示方式 对应的机器码是唯一的 使用后者可以增强程序的可读性 例3 4 MOVA 0F0HMOVA B以上两条指令功能完全相同 都是将寄存器B的内容送到累加器A中 前一条指令中第二个操作数采用B寄存器的单元地址表示 后一条指令中是直接用B寄存器的名称来表示 但汇编后的机器码是完全一样的 两个字节 E5HF0H 3 寄存器寻址指令中指定将某个寄存器的内容作为操作数 这种寻址方式称为寄存器寻址 这类寄存器包括工作寄存器R0 R7 A DPTR等 例3 5 INCR2机器码是 0AH 4 寄存器间接寻址指令中指定将某一寄存器的内容作为操作数的地址 这种寻址方式称为寄存器间接寻址 特别要注意的是 存放在寄存器中的内容不是操作数 而是操作数所在的存储单元的地址 利用寄存器间接寻址可访问片内RAM和片外RAM单元中的内容 访问片内RAM中的数据时 只能使用寄存器R0 R1间接寻址 而访问片外RAM中的数据时 可使用R0 R1或DPTR间接寻址 此时 这些寄存器被用作地址指针 前面要加前缀符 规定用MOV指令访问片内RAM 用MOVX指令访问片外RAM单元 例3 6 MOVA R0 A R0 机器码为 E6H 5 变址寻址以16位寄存器 PC或DPTR 的内容作为基址 以累加器A的内容作为偏移量 将两者进行相加得到的和作为操作数地址 这种寻址方式称为变址寻址 变址寻址只能对程序存储器进行寻址 它可以分为两类 1 以PC的当前值为基址例如指令 MOVCA A PC PC PC 1 A A PC 单字节指令 源操作数为变址寻址 PC的当前值是从程序存储器中取出该条指令后的PC值 它等于该条指令首字节地址加指令的字节数 上述指令的功能是 先使PC加1 然后与累加器的内容相加 形成操作数的地址 2 以DPTR的内容为基址例如指令 MOVCA A DPTR A A DPTR 下面这段程序是将程序存储器ROM中1065H单元的内容读入累加器A中 MOVDPTR 1060H DPTR 1060HMOVA 05H A 05HMOVCA A DPTR A 1065H 6 相对寻址相对寻址方式主要用于转移指令 它是把指令中给出的相对地址偏移量rel与PC当前值相加 得到程序转移的目标地址 即 目标地址 PC当前值 relrel是一个带符号的8位二进制补码 其取值范围为 128 127 指令中含有操作数rel的转移指令均为相对转移指令 采用的都是相对寻址方式例如 在地址1068H处有一条相对转移指令 1068HSJMP30H PC PC 2 rel指令为双字节指令 操作码为 80H30H PC的当前值 1068H 2 106AH 把它与偏移量30H相加 就形成了程序转移的目标地址109AH 向后跳转 相对寻址方式只适合对程序存储器的访问 7 位寻址指令中直接给出位操作数的地址 这种寻址方式称为位寻址 例如指令 MOVC 37H CY 37H 3 3指令类型MCS 51单片机指令系统共有111条指令 这些指令可按不同方法进行分类 1 按字节数分单字节指令 49条 双字节指令 46条 三字节指令 16条 2 按指令的执行时间分单机器周期指令 64条 双机器周期指令 45条 四机器周期指令 2条 3 按指令的功能分数据传送指令 28条 算术运算指令 24条 逻辑运算指令 25条 控制转移指令 17条 位操作指令 17条 3 4数据传送类指令3 4 1 内部数据传送指令指令格式 MOV 目的字节 源字节 说明 将源字节指定的源操作数传送到目的字节指定的存储单元中 而源字节不变 1 以累加器A为目的地址指令操作机器码MOVA Rn A Rn 11101rrrMOVA direct A direct 11100101directMOVA Ri A Ri 1110011iMOVA data A data01110100data这组指令的功能是把源操作数送入累加器A中 源操作数的寻址方式分别为寄存器寻址 直接寻址 寄存器间接寻址和立即寻址方式 机器码中i的值取决于 Ri的下标 i 0或1 2 以Rn为目的地址指令操作机器码MOVRn A Rn A 11111rrrMOVRn direct Rn direct 10101rrrdirectMOVRn data Rn data01111rrrdata这组指令的功能是把源操作数送入工作寄存器中 源操作数的寻址方式分别为寄存器寻址 直接寻址和立即寻址方式 例3 7 设 32H 10H 执行指令 MOVR0 32HMOVA R0执行结果是 R0 32H A 10H 32H 10H 3 以直接地址为目的地址指令操作机器码MOVdirect A direct A 11110101directMOVdirect Rn direct Rn 10001rrrdirectMOVdirect Ri direct Ri 1000011idirectMOVdirect1 direct2 direct1 direct2 10000101direct2direct1MOVdirect data direct data01110101directdata这组指令的功能是将源操作数送入直接地址所指的存储单元中 源操作数的寻址方式分别为寄存器寻址 寄存器间接寻址 直接寻址和立即寻址方式 4 以寄存器间接地址为目的地址指令操作机器码MOV Ri A Ri A 1111011iMOV Ri direct Ri direct 1010011idirectMOV Ri data Ri data0111011idata这组指令的功能是把源操作数送入R0或R1指针间接寻址的片内RAM单元中 源操作数的寻址方式分别为寄存器寻址 直接寻址和立即寻址方式 该组指令中目的操作数是寄存器间接寻址方式 可在片内RAM的00H 7FH范围内寻址 寄存器间接寻址是不能对SFR区进行访问的 这是对8051 8031 8751等芯片而言的 对增强型单片机芯片如8052 8032和8752等具有与SFR区地址重叠的高128个单元 80 FFH 的片内RAM 该高128个单元只能采用寄存器间接寻址方式进行读写操作 5 以DPTR为目的地址的16位指令指令操作机器码MOVDPTR data16 DPTR data1610010000 data 高8位 data 低8位这条指令的功能是把一个16位立即数送入DPTR寄存器 立即数的高8位送DPH 立即数的低8位送DPL 例3 8 MOVDPTR 2200H DPTR 2200H指令的执行结果是 DPTR 2200H 其中 DPH 22H DPL 00H 例3 9 设 30H 40H 40H 10H P1 0CAH 试判断下列程序执行后的结果 MOVR0 30H R0 30HMOVA R0 A 30H A 40HMOVR1 A R1 A R1 40HMOVB R1 B 40H B 10HMOV R1 P1 R1 P1 40H 0CAHMOVP2 P1 P2 P1 P2 0CAH结果是 A 40H B 10H 40H 0CAH P2 0CAH 3 4 2 片外数据传送指令此类指令实际上是片外RAM与累加器A之间的传送指令 片外RAM单元只能采用寄存器间接寻址的方式来访问 R0 R1或DPTR可作间接寻址的寄存器 1 用DPTR间接寻址的指令指令操作机器码MOVXA DPTR A DPTR 11100000MOVX DPTR A DPTR A 11110000使用以上两条指令时 先将要访问的片外RAM单元的地址送入DPTR 然后再用上述指令来实现数据的传送 例3 10 将片外RAM1000H单元中的内容送到2000H单元 MOVDPTR 1000H DPTR 1000HMOVXA DPTR A DPTR MOVDPTR 2000H DPTR 2000HMOVX DPTR A DPTR A 在两个片外RAM单元之间是不能直接进行数据的传送的 必须经过片内的累加器A来间接地传送 由于DPTR是16位的地址指针 因此可寻址64KB的外部RAM 2 用R0和R1间接寻址的指令指令操作机器码MOVXA Ri A Ri 1110001i A P2Ri MOVX Ri A Ri A 1111001i P2Ri A 使用以上指令时 要先将外部RAM的单元地址送入Ri R0或R1 由于Ri只能存入8位地址 因此用它对外部RAM间接寻址只能限于256个单元 由P2口输出外部RAM的高8位地址 也称页地址 而由Ri提供低8位地址 进行页内寻址 每256个单元为1页 则可共同寻址64KB范围 例3 11 将累加器A的内容送外部RAM的2060H单元中 MOVP2 20H P2 20H 得到页地址MOVR0 60H R0 60H 得到页内地址MOVX R0 A 2060H A 3 4 3访问程序存储器的传送指令此类指令只有两条 格式如下 指令操作机器码MOVCA A PC PC PC 110000011 A A PC MOVCA A DPTR A A DPTR 10010011其功能是把程序存储器中源操作数的内容送入累加器A 程序存储器中除了存放程序之外 还会放一些表格数据 这组指令用于到程序存储器中查表格数据 并将它送入累加器A 所以也称它们为查表指令 例3 12 用数据传送指令实现下列要求的数据传送 将片内RAM60H单元内容送外部RAM1030H单元 将ROM1000H单元内容送内部RAM70H单元 程序 MOVP2 10HMOVR0 30HMOVA 60HMOVX R0 A程序 MOVA 00HMOVDPTR 1000HMOVCA A DPTRMOV70H A 3 4 4 数据交换指令数据交换是在内部RAM单元与累加器A之间进行 有字节和半字节交换两种 1 字节交换指令指令操作机器码XCHA Rn A Rn 11001rrrXCHA direct A direct 11000101directXCHA Ri A Ri 1100011i这组指令的功能是将累加器A的内容与源操作数相互交换 源操作数的寻址方式分别为寄存器寻址 直接寻址和寄存器间接寻址方式 2 半字节交换指令指令操作机器码XCHDA Ri A 3 0 Ri 3 01101011i指令的功能是将累加器A的低4位与Ri间接寻址单元内容的低4位相互交换 各自的高4位维持不变 3 4 5 堆栈操作指令在MCS 51单片机的片内RAM中 可设置一个后进先出的堆栈区 主要用于保护和恢复CPU的工作现场 也可实现内部RAM单元之间的数据传送和交换 堆栈操作时 堆栈指针SP始终指向栈顶位置 一般在初始化时应对SP进行设定 通常将堆栈设在内部RAM的30H 7FH范围内 堆栈操作有进栈和出栈两种 1 进栈指令指令操作机器码PUSHdirect SP SP 111000000direct SP direct 是一条双字节指令 操作数只能采用直接寻址的方式访问 指令的功能是先将堆栈指针SP的内容加1 指针上移一个单元 然后将直接寻址的单元内容送到SP指针所指的堆栈单元中 栈顶 例3 13 设 SP 09H DPTR 0123H 试分析下列指令的执行结果 PUSHDPL行第一条指令 SP 1 0AH SP DPL 23H 0AH PUSHDPH执行第二条指令 SP 1 0BH SP DPH 01H 0BH 执行结果是 0AH 23H 0BH 01H SP 0BH 2 出栈指令指令操作机器码POPdirect direct SP 11010000direct SP SP 1指令的功能是将堆栈指针SP所指的单元 栈顶 内容弹出 并送入直接寻址的 direct 单元中 然后SP的内容减1 指针下移一个单元 例3 14 设 SP 32H 31H 23H 32H 01H 试分析下列指令的执行结果 POPDPH SP 32H 01H DPH SP 1 32H 1 31H SPPOPDPL SP 31H 23H DPL SP 1 31H 1 30H SP执行结果为 DPTR 0123H SP 30H 3 5算术运算类指令3 5 1加法指令1 不带进位的加法指令指令操作机器码ADDA Rn A A Rn 00101rrrADDA direct A A direct 00100101directADDA Ri A A Ri 0010011iADDA data A A data00100100data这组加法指令的功能是将源操作数和累加器A中的操作数相加 其结果存放到A中 源操作数分别为寄存器寻址 直接寻址 寄存器间接寻址和立即寻址 例3 15 设有两个无符号数放在A和R2中 设 A 0C6H 198 R2 68H 104 执行指令 ADDA R2试分析运算结果及对标志位的影响 解 写成竖式 A 11000110198 R2 01101000 104 A 100101110302结果是 A 2EH CY 1 AC 0 OV 0 两个无符号数相加 要根据CY来判断 由CY 1可知本次运算结果发生了溢出 结果超出了255 结果应该是包括CY在内的9位二进制数 即302 2 带进位加法指令ADDC指令操作机器码ADDCA Rn A A Rn CY 00111rrrADDCA direct A A direct CY 00110101directADDCA Ri A A Ri CY 0011011iADDCA data A A data CY 00110100data这组指令的功能是将累加器A的内容 指令中的源操作数 和CY的值相加 并把相加结果存放到A中 ADDC指令对PSW标志位的影响与ADD指令相同 这组指令常用于多字节加法运算中的高字节相加 考虑到了低字节相加时产生向高字节的进位情况 3 加1指令指令操作机器码INCA A A 100000100INCRn Rn Rn 100001rrrINCdirect direct direct 100000101directINC Ri Ri Ri 10000011iINCDPTR DPTR DPTR 110100011这组指令的功能是使源地址所指的RAM单元中的内容加1 操作数可采用寄存器寻址 直接寻址 寄存器间接寻址方式 除INCA指令对奇偶标志位 P 有影响外 其余指令执行时均不会对PSW的任何标志位产生影响 例3 16 设有两个16位无符号数 被加数存放在内部RAM的30H 低位字节 和31H 高位字节 中 加数存放在40H 低位字节 和41H 高位字节 中 试写出求两数之和 并把结果存放在30H和31H单元中的程序 解 参考程序为MOVR0 30H 地址指针R0赋值MOVR1 40H 地址指针R1赋值MOVA R0 被加数的低8位送AADDA R1 被加数与加数的低8位相加 和送A 并影响CY标志MOV R0 A 和的低8位存30H单元INCR0 修改地址指针R0INCR1 修改地址指针R1MOVA R0 被加数的高8位送AADDCA R1 被加数和加数的高8位与Cy相加 和送AMOV R0 A 和的高8位存31H单元 3 5 2减法指令带借位减法指令指令操作机器码SUBBA Rn A A Rn Cy 10011rrrSUBBA direct A A direct Cy 10010101directSUBBA Ri A A Ri Cy 1001011iSUBBA data A A data Cy 10010100data该组指令的功能是从累加器A减去源操作数及标志位CY 其结果再送累加器A 即被减数在累加器A中 减数分别采用寄存器寻址 直接寻址 寄存器间接寻址和立即寻址方式 还有一个减数为PSW中的CY位 CY位在减法运算中是作借位标志 例3 17 设 A 98H R3 6AH CY 1 执行指令 SUBBA R3分析执行结果及对标志位的影响解 A 1001100098H R3 011010106AHCY 1 1 A 001011012DH结果是 A 2DH CY 0 AC 1 OV 1若看成无符号数相减 因CY 0 表示无借位 152 106 1 45 若看成带符号数相减 因OV 1 表示溢出 结果出错 104 106 1 45 2 减1指令指令操作机器码DECA A A 100010100DECRn Rn Rn 100011rrrDECdirect direct direct 100010101directDEC Ri Ri Ri 10001011i这组指令的功能是使源地址所指的RAM单元中的内容减1 操作数可采用寄存器寻址 直接寻址和寄存器间接寻址方式 除DECA指令影响P标志位外 其余减1指令均不影响任何标志 3 5 3十进制调整指令指令机器码DAA11010100指令用于实现BCD码的加法运算 其功能是将累加器A中按二进制相加后的结果调整成BCD码相加的结果 例3 18 设 A 01110101 BCD 75 R3 01101001 BCD 69 CY 0 执行 ADDA R3DAA执行过程为 A 01110101 R3 01101001 A 11011110 得到二进制加法的结果 110 低4位 9 加6修正11100100 110 高4位 9 加6修正101000100 得到BCD码加法的正确结果进位执行后 A 01000100 BCD 44 CY 1 运算结果为144 3 5 4乘法指令指令操作机器码MULAB BA A B 10100100指令的功能是把累加器A和寄存器B中两个8位无符号整数相乘 并把乘积的高8位存于寄存器B中 低8位存于累加器A中 乘法运算指令执行时会对标志位产生影响 CY标志总是被清0 即CY 0 OV标志则反映乘积的位数 若OV 1 表示乘积为16位数 若OV 0 表示乘积为8位数 例3 19 设 A 64H 100 B 3CH 60 执行指令 MULAB结果是 A B 1770H 6000 A 70H B 17H CY 0 OV 1 3 5 5除法指令指令操作机器码DIVAB A商 B余 A B 10000100指令的功能是把累加器A和寄存器B中的两个8位无符号整数相除 所得商的整数部分存于累加器A中 余数存于B中 除法指令执行过程对标志位的影响 CY位总是被清0 OV标志位的状态反映寄存器B中的除数情况 若除数为0 则OV 1 表示本次运算无意义 否则 OV 0 例3 20 设 A 0F0H 240 B 20H 32 执行指令 DIVAB结果是 A 07H 商7 B 10H 余数16 Cy 0 OV 0 3 6逻辑运算类指令3 6 1累加器A的逻辑操作指令1 累加器A清0CLRA A 00H111001002 累加器A取反CPLA A 111101003 累加器A循环左移RLA00100011 11001010变成10010101考虑实验一 A FEH 11111110B变成11111101B 例3 21 执行下列指令后 A中的内容如何变化 MOVA 11H A 11H 17 RLA A 22H 34 RLA A 44H 68 RLA A 88H 136 RLA A 11H 17 00010001左环移一次 00100010左环移两次 01000100左环移三次 10001000利用左移指令 可实现对A中的无符号数乘2的目的 4 累加器A带进位循环左移RLCA00110011010001101变成1000110105 累加器A循环右移RRA0000001101000100B 44H 变成00100010B 22H 对累加器A进行的循环右移 可实现对A中无符号数的除2运算 6 累加器A带进位循环右移RRCA00010011010001101B变成1010001107 累加器A半字节交换D7 D4D3 D0SWAPA1100010000101100B变成11000010B功能是将累加器A中内容的高4位与低4位互换 3 6 2逻辑与指令ANLA Rn A A Rn 01011rrrANLA direct A A direct 01010101directANLA Ri A A Ri 0101011iANLA data A A data01010100dataANLdirect A direct direct A 01010010directANLdirect data direct direct data01010011directdata前4条指令均以累加器A为目的操作数 其功能是将累加器A的内容和源操作数按位进行逻辑与操作 结果送累加器A 源操作数可采用寄存器寻址 直接寻址 寄存器间接寻址或立即寻址方式 指令执行时将影响奇偶标志位P 在程序设计中 逻辑与指令主要用于对目的操作数中的某些位进行屏蔽 清0 方法是 将需屏蔽的位与 0 相与 其余位与 1 相与即可 例3 22 分析下列两条指令的执行结果 ANL30H 0FHANLA 80H第一条指令执行后 将30H单元内容的高4位屏蔽 清0 只保留了低4位 可用于将0 9的ASCII码转换为BCD码 设 30H 35H 5的ASCII码 执行指令后变为 30H 05H 5的BCD码 第二条指令执行后 只保留了最高位 而其余各位均被屏蔽掉 可用于对累加器A中的带符号数的正负判断 若A中为负数 则执行该指令后 A 00H 若A中为正数 则结果为 A 00H 3 6 3逻辑或指令ORLA Rn A A Rn 01001rrrORLA direct A A direct 01000101directORLA Ri A A Ri 0100011iORLA data A A data01000100dataORLdirect A direct direct A 01000010directORLdirect data direct direct data01000011directdata这组指令的功能是对两个操作数按位进行逻辑或操作 源操作数及目的操作数的寻址方式和ANL指令类似 前4条指令将影响P标志位 逻辑或指令可对目的操作数的某些位进行置位 方法是 将需置位的位与 1 相或 其余位与 0 相或即可 常用于组合数据 例3 23 将工作寄存器R2中数据的高4位和R3中的低4位拼成一个数 并将该数存入30H MOVR0 30H R0作地址指针MOVA R2ANLA 0F0H 屏蔽低4位MOVB A 中间结果存B寄存器MOVA R3ANLA 0FH 屏蔽高4位ORLA B 组合数据MOV R0 A 结果存30H单元 3 6 4逻辑异或指令XRLA Rn A A Rn 01101rrrXRLA direct A A direct 01100101directXRLA Ri A A Ri 0110011iXRLA data A A data01100100dataXRLdirect A direct direct A 01100010directXRLdirect data direct direct data01100011directdata表示当两个输入中只有一个为1时 输出为1 否则为0 异或运算的逻辑表达式为 A反B AB反逻辑异或指令可用于对目的操作数的某些位取反 而其余位不变 方法是 将要取反的这些位和 1 异或 其余位则和 0 异或即可 例3 24 分析下列程序的执行结果 MOVA 77H A 77HXRLA 0FFH A 77H FFH 88HANLA 0FH A 88H 0FH 08HMOVP1 64H P1 64HANLP1 0F0H P1 64H F0H 60HORLA P1 A 08H 60H 68H01110111B 11111111B 10001000B10001000B 00001111B 00001000B01100100B 11110000B 01100000B00001000BH 01100000B 01101000B 3 7控制转移类指令3 7 1无条件转移指令无条件转移指令是使程序无条件转移到指定的地址去执行 它分为长转移指令 短转移指令 相对转移指令和间接转移指令4条 该类指令不影响标志位 长转移指令LJMPaddr16 PC addr1600000010a15 a8a7 a0例如 LJMP1000H PC 1000H 程序转向1000H地址处执行LJMPABD PC ABD 程序转向ABD地址处执行在后一条指令中 使用了符号地址ABD 这在程序中是常见到的 符号地址是某条指令前的标号 2 短转移指令AJMPaddr11 PC PC 2a10a9a800001a7 a0 PC10 0 addr11指令的功能是先使程序计数器PC值加2 完成取指并指向下一条指令的地址 然后将指令提供的addrll作为转移目的地址的低11位 和PC当前值的高5位形成16位的目标地址 程序随即转移到该地址处执行 这是一条2字节指令 addrll可表示的地址是从00000000000 11111111111 范围为2KB 转移地址的高5位是PC当前值中的内容 也就是说 转移地址的高5位和PC当前值的高5位相同 低11位地址不同 即指令的目标地址和PC当前值位于同一个2KB区域内 不符合这个规定将不能转移 故绝对转移指令允许在2KB范围内转移 例3 25 判断下面指令能否正确执行 2056HAJMP2C70H取指后PC 2 2058H 高5位地址为00100 而转移地址2C70H的高5位是00101 两个地址不处在同一个2KB区 故不能正确转移 2056H 0010000001010110 2058H 0010000001011000 2C70H 00101100 3 相对转移指令SJMPrel PC PC 2 rel10000000rel这是一条相对寻址方式的无条件转移指令 字节数为2 指令的功能是先使程序计数器PC 2 完成取指并指向下一条指令地址 然后把PC当前值与地址偏移量rel相加作为目标转移地址 即 目标地址 PC 2 rel PC 当前值 relrel是一个带符号的8位二进制数的补码 数值范围是 128 127 所以SJMP指令的转移范围是 以PC当前值为起点 可向前 号表示 跳128个字节 或向后 号表示 跳127字节 例3 26 确定以下指令的转移目标地址各为多少 1 2300HSJMP25H 2 2300HSJMPD7H 1 25H 00100101 为正数 程序将向后转移 所以 目标地址 PC 2 rel PC 当前值 rel 2300H 2 25H 2327H 2 D7H 11010111 是负数 程序将向前转移 D7H 29H 补 所以 目标地址 PC 2 rel 2300H 2 29H 22D9H 例3 27 分析下面指令的功能 HERE SJMP0FEH0FEH为负数 11111110 0FEH 2 补 所以目标地址 PC 2 rel HERE 2 2 HERE指令的执行结果是转向本条指令自己 程序在原处无限循环 称为动态停机或踏步指令 一般写成 HERE SJMPHERE或SJMP 4 间接转移指令JMP A DPTR PC A DPTR 01110011指令的功能是将累加器A中8位无符号数与DPTR的16位内容相加 和作为目标地址送入PC 实现无条件转移 间接转移指令采用变址寻址方式 DPTR称作基址寄存器 值通常由用户预先设定 累加器A的内容作偏移量 在程序运行中可以改变 根据A的不同值 就可转移到不同的地址 实现多分支转移 又称散转 3 7 2条件转移指令条件转移指令要求对某一特定条件进行判断 当满足给定的条件 程序就转移到目标地址去执行 条件不满足则顺序执行下一条指令 可用于实现分支结构的程序 这类指令都采用相对寻址方式 若条件满足 则由PC的当前值与相对偏移量rel相加形成转移的目标地址 这与无条件转移中的SJMP指令相类似 其中CJNE指令会影响标志位CY的状态 条件转移指令分为三种 累加器A的判零转移 比较转移和循环转移三类 1 累加器A的判零转移指令判零转移指令有2条 均为2字节指令 该组指令不影响标志位 JZrel 若 A 0则PC PC 2 rel若 A 0则PC PC 2JNZrel 若 A 0则PC PC 2 rel若 A 0则PC PC 2第一条指令的功能是如果累加器A的内容为零 则程序转向指定的目标地址 否则程序顺序执行 第二条指令的功能是如果累加器A的内容不为零 则程序转向指定的目标地址 否则程序顺序执行 例3 28 将片内RAM的40H单元开始的数据块传送到片外RAM的1000H开始的单元中 当遇到传送的数据为零则停止传送 START MOVR0 40H 片内RAM数据首址MOVDPTR 1000H 片外RAM数据首址LOOP MOVA R0 取数JZABD 等于零 结束MOVX DPTR A 不为零 送数INCR0 地址指针加1INCDPTR 地址指针加1SJMPLOOP 转LOOP 继续取数ABD SJMPABD 踏步 2 比较转移指令比较转移指令共有4条 均为3字节指令 该组指令会影响CY标志 CJNEA data rel 若 A data 则PC PC 3 rel若 A data 则PC PC 3CJNEA direct rel 若 A direct 则PC PC 3 rel若 A direct 则PC PC 3CJNERn data rel 若 Rn data 则PC PC 3 rel若 Rn data 则PC PC 3CJNE Ri data rel 若 Ri data 则PC PC 3 rel若 Ri data 则PC PC 3该组指令的功能是将前两个操作数进行比较 若不相等则程序转移到指定的目标地址执行 相等则顺序执行 要注意的是 指令执行过程中 对两个操作数进行比较是采用相减运算的方法 因此比较结果会影响CY标志 如前数小于后数 则CY 1 相减时有借位 否则 CY 0 无借位 我们可以进一步根据对CY值的判断确定两个操作数的大小 实现多分支转移 例3 29 某温度控制系统中 温度的测量值T存在累加器A 温度的给定值Tg存在60H单元 要求 T Tg时 程序返回 符号地址为FH T Tg时 程序转向降温处理程序 符号地址为JW T Tg时 程序转向升温处理程序 符号地址为SW 试编制程序 相应的程序如下 MOV60H TgMOVA TCJNEA 60H L00P T Tg 转向L00PAJMPFH T Tg 转向FHLOOP JCSW TTg 转向JW 3循环转移指令DJNZRn rel 若 Rn 1 0 则PC PC 2 rel若 Rn 1 0 则PC PC 2DJNZdirect rel 若 direct 1 0 则PC PC 3 rel若 direct 1 0 则PC PC 3其功能是将Rn的内容减1后进行判断 若不为零则程序转移到目标地址处执行 若为零 则程序顺序执行 两条指令都不影响标志位 例3 30 将片内RAM的30H 39H单元置初值00H 09H MOVR0 30H 设定地址指针MOVR2 0AH 数据区长度设定MOVA 00H 初值装入ALOOP MOV R0 A 送数INCR0 修改地址指针INCA 修改待传送的数据DJNZR2 LOOP 未送完 转LOOP地址继续送 否则传送结束HERE SJMPHERE 踏步 3 7 3子程序调用和返回指令在程序设计过程中 经常会遇到在不同程序或同一程序的不同位置都需要进行功能完全相同的操作处理 常将这种需多次使用的操作程序段设计为子程序而单独编写 供主程序在需要时调用 主程序在需要时通过调用指令去调用子程序 子程序执行完后再由返回指令返回到主程序 因此 调用指令应放在主程序中 返回指令应放在子程序中 放在最后一条的位置 同一个子程序可以被多次调用 子程序还可调用别的子程序 称为子程序嵌套 1 调用指令 1 长调用指令LCALLaddr16 PC PC 3SP SP 1 SP PC7 0 SP SP 1 SP PC15 8 PC addr16这是一条三字节的指令 指令的功能是先将PC 3 完成取指操作并指向下一条指令的地址 再把该地址 又称断点地址 压入堆栈保护起来 然后把addr16送入PC 并转入该地址执行子程序 2 绝对调用指令ACALLaddr11 PC PC 2SP SP 1 SP PC7 0 SP SP 1 SP PC15 8 PC10 0 addr11这是一条2字节的指令 指令的功能是先将PC 2 完成取指操作并指向下一条指令的地址 再将该地址 断点地址 压入堆栈保护起来 然后将指令中的addrll送入PC 和PC当前值的高5位合并形成16位的子程序入口地址 并转入该地址执行子程序 注意 范围2k 2 返回指令 1 子程序返回指令RET PC15 8 SP SP SP 100100010PC7 0 SP SP SP 1指令的功能是将保存在堆栈中的断点地址弹出 送给PC 使CPU结束子程序 返回到断点地址处继续执行主程序 该指令应放在子程序结束处 2 中断返回指令RETI PC15 8 SP SP SP 100110010PC7 0 SP SP SP 1指令的功能与RET相似 也是将保存在堆栈中的断点地址弹出 送给PC 使CPU返回到断点地址处继续执行主程序 不同的是 它不是从子程序返回主程序 而是从中断服务程序返回到主程序 所以该指令是中断服务程序的结束指令 图3 8子程序的调用和返回示意图 3 空操作指令NOP PC PC 1空操作指令是单字节指令 该指令执行时不进行任何有效的操作 但需要消耗一个机器周期的时间 所以在程序设计中可用于短暂的延时 例3 31 以下程序段可使P1 0引脚向外输出周期为10个机器周期的方波 START CPLP1 0 1个机器周期NOP 1个机器周期NOP 1个机器周期SJMPSTART 2个机器周期 3 8位操作类指令在MCS 51指令系统中共有17条位操作指令 可以实现位变量的传送 修改和逻辑运算等操作 位操作指令中 bit是位变量的位地址 可使用四种不同的表示方法 下面以CY位为例进行说明 位地址 如 D7H 位定义名 如 CY 寄存器名 位 如 PSW 7 字节地址 位 如 D0H 7 标志位CY在位操作指令中称作位累加器 用符号C表示 3 8 1位传送指令MOVC bit CY bit MOVbit C bit CY 显然两个位之间不能直接进行传送 必须通过位累加器C 3 8 2置位和清零指令CLRC CY 0CLRbit bit 0SETBC CY 1SETBbit bit 1 例3 32 要设定工作寄存器2区为当前工作区 可用以下指令实现 SETBRS1CLRRS0 3 8 3位逻辑运算指令ANLC bit CY CY bit ANLC bit CY CY ORLC bit CY CY bit ORLC bit CY CY CPLC CY CPLbit bit 例3 33 用编程的方法实现图3 2 2所示电路的功能 MOVC P1 1ORLC P1 2ANLC P1 0MOVP1 3 C 3 8 4 位条件转移指令1 判CY的条件转移指令JCrel 若 CY 1 则PC PC 2 rel若 CY 0 则PC PC 2JNCrel 若 CY 0 则PC PC 2 rel若 CY 1 则PC PC 2以上两条指令均为2字节指令 若发生转移 则转移地址 PC 2 rel 例3 34 比较片内RAM的50H和51H单元中两个8位无符号数的大小 把大数存入60H单元 若两数相等则把标志位70H置1 相应的程序为 MOVA 50HCJNEA 51H LOOPSETB70HRETLOOP JCLOOP1MOV60H ARETLOOP1 MOV60H 51HRET 2 判位变量的条件转移JBbit 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第一条指令的功能是若bit位内容为1 转移到目标地址 目标地址 PC 3 rel 若为0 程序顺序执行 第二条指令的功能是是若bit位内容为0 不为1 转移到目标地址 目标地址 PC 3 rel 若为1 程序顺序执行 第三条指令的功能是若bit位内容为1 则将bit位内容清0 并转移到目标地址 目标地址 PC 3 rel 若bit位内容为0 程序顺序执行 例3 35 在片内RAM30H单元中存有一个带符号数 试判断该数的正负性 若为正数 将6EH位清0 若为负数 将6EH位置1 方法一 MOVA 30H 30H单元中的数送AJBACC 7 LOOP 符号位等于1 是负数 转移CLR6EH 符号位等于0 是正数 清标志位RET 返回LOOP SETB6EH 标志位置1RET 返回方法二 MOVA 30H 30H单元中的数送AANLA 80H 保留A中数据的最高位 其余位清0JNZLOOP 不等于0 是负数 转移CLR6EH 等于0 是正数 清标志位RET 返回LOOP SETB6EH 标志位置1RET 返回 习题课 1 将片内RAM30H单元与40H单元中的内容互换 2 把外部数据存储器2040H到2049H单元中的数据传送到外部数据存储器2060H到2069单元中去 注 考虑第一题有没有多种方法
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!