资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第 3 章 MCS - 51单片机指令系统,第3章 MCS - 51单片机指令系统,3.1 寻址方式,3.2 指令系统,1. 单字节指令,单字节指令格式由8位二进制编码表示, 例如: ,CLR AE4H,2. 双字节指令,双字节指令格式由两个字节组成, 操作码和操作数, 例如:,MOV A, 10H74H 10H,3. 三字节指令,三字节指令格式中, 第一个字节为操作码, 后两个字节为操作数, 例如: ,MOV 40H, 30H75H 40H 30H,一条汇编语言指令中最多包含 4 个区段, 如下所示: ,标号: 操作码 操作数 ;注释,4 个区段之间要用分隔符分开: 标号与操作码之间用“: ”隔开, 操作码与操作数之间用空格隔开, 操作数与注释之间用“;”隔开, 如果操作数有两个以上, 则在操作数之间要用逗号“,”隔开 (乘法指令和除法指令除外 )。,3.1 寻址方式,所谓寻址方式, 就是寻找操作数地址的方式, 在用汇编语言编程时, 数据的存放、传送、 运算都要通过指令来完成。 编程者必须自始至终都要十分清楚操作数的位置, 以及如何将它们传送到适当的寄存器去参与运算。每一种计算机都具有多种寻址方式。寻址方式的多少是反映指令系统优劣的主要指标之一。,在 MCS -51单片机指令系统中, 有以下 7种寻址方式: ,(1) 立即寻址;,(2) 直接寻址;,(3) 寄存器寻址;,(4) 寄存器间接寻址;,(5) 基址寄存器加变址寄存器间接寻址;,(6) 相对寻址;,(7) 位寻址。,1. 立即寻址,立即寻址方式是指操作数包含在指令字节中。 跟在指令操作码后面的数就是参加运算的数, 该操作数称为立即数。 立即数有一字节和二字节两种可能, 例如指令: ,MOV A, 3AH,MOV DPTR, 0DFFFH,上述两条指令均为立即寻址方式, 第一条指令的功能是将立即数 3AH送累加器A中, 第二条指令的功能是将立即数 0DFFFH送数据指针DPTR中(0DFHDPH, 0FFHDPL)。,2. 直接寻址,在指令中直接给出操作数的地址, 这种寻址方式就属于直接寻址方式。在这种方式中, 指令的操作数部分直接是操作数的地址。 ,在MCS -51 单片机指令系统中, 直接寻址方式中可以访问 3 种存储器空间: ,(1) 内部数据存储器的低 128 个字节单元(00H7FH)。,(2) 特殊功能寄存器。 特殊功能寄存器只能用直接寻址方式进行访问。 ,(3) 位地址空间。,3. 寄存器寻址,在该寻址方式中, 参加操作的数存放在寄存器里。寄存器包括8个工作寄存器R0R7, 累加器A, 寄存器B、数据指针DPTR和布尔处理器的位累加器C。,4. 寄存器间接寻址,在这种寻址方式中, 寄存器的内容为操作数的地址。 寄存器间接寻址只能使用寄存器R0、R1 作为地址指针,寻址内部RAM区的数据; 当访问外部RAM时, 可使用R0、 R1及DPTR作为地址指针。寄存器间接寻址符号为“”, 例如:,5. 基址寄存器加变址寄存器间接寻址,这种寻址方式用于访问程序存储器中的数据表格, 它以基址寄存器DPTR或PC的内容为基本地址, 加上变址寄存器A的内容作为操作数的地址, 例如: ,MOVC A, DPTR+A,JMP A+DPTR,MOVC A, PC+A,6. 相对寻址,在MCS -51 指令系统中设有转移指令, 分为直接转移和相对转移指令, 在相对转移指令中采用相对寻址方式。这种寻址方式是以PC的内容为基本地址, 加上指令中给定的偏移量作为转移地址。指令中给出的偏移量是一个 8 位带符号的常数, 可正可负, 其范围为128+127。,7. 位寻址,该种寻址方式中, 操作数是内部RAM单元中某一位的信息。,3.2 指令系统,3.2.1 指令分类,按指令的功能, MCS -51 指令系统可分为下列 5 类: ,(1) 数据传送;,(2) 算术运算;,(3) 逻辑运算;,(4) 位操作;,(5) 控制转移。,Rn当前选定的寄存器区中的 8 个工作寄存器R0R7, 即n=07。,Ri当前选定的寄存器区中的 2 个寄存器R0、 R1, i=0、1。,direct 8 位内部RAM单元的地址, 它可以是一个内部数据区 RAM单元(00H7FH)或特殊功能寄存器地址(I / O端口、 控制寄存器、 状态寄存器 80H0FFH)。 ,data指令中的 8 位常数。 ,data,16,指令中的 16 位常数。 ,addr,16,16 位的目的地址, 用于LJMP#, LCALL指令, 可指向 64 KB程序存储器地址空间。,addr,11,11位的目的地址, 用于AJMP, ACALL指令。目的地址必须与下一条指令的第一个字节在同一个 2 KB程序存储器地址空间之内。 ,rel 8 位带符号的偏移量字节, 用于SJMP和所有条件转移指令中。 偏移量相对于下一条指令的第一个字节计算, 在128+127 范围内取值。 ,bit内部数据RAM或特殊功能寄存器中的可直接寻址位。,DPTR数据指针, 可用作 16 位的地址寄存器。,A累加器。 ,B寄存器, 用于 MUL和 DIV指令中。 ,C进位标志或进位位。 ,间接寻址寄存器或基址寄存器的前缀, 如Ri,DPTR。,/位操作数的前缀, 表示对该位取反。 ,(X) X中的内容。 ,(X)由 X寻址的单元中的内容。 ,箭头左边的内容被箭头右边的内容所代替。,3.2.2 数据传送类指令,图 3 1 MCS -51传送指令示意图,表 3.1 数据传送类指令一览表,表 3.1 数据传送类指令一览表,1. 数据传送到累加器A的指令,MOV A, R0,MOV A, direct,MOV A, Ri,MOV A, data,这组指令的功能是:把源操作数的内容送入累加器A。例如: MOV A, 10H, 该指令执行时将立即数 10H送入累加器A中。,2. 数据传送到工作寄存器Rn的指令,MOV Rn, A,MOV Rn, direct,MOV Rn, data,这组指令的功能是: 把源操作数的内容送入当前工作寄存器区的R0R7中的某一个寄存器。指令中Rn在内部数据存储器中的地址由当前的工作寄存器区选择位RS1、RS0 确定, 可以是 00H07H、08H0FH、10H17H、18H1FH。 例如: MOV R0, A, 若当前RS1、RS0 设置为 00 (即工作寄存器 0 区), 执行该指令时,将累加器A中的数据传送至工作寄存器R0(内部RAM 00H)单元中。,3. 数据传送到内部RAM单元或特殊功能寄存器SFR的指令,MOV direct, A,MOV direct, Rn,MOV direct, direct,MOV direct, Ri,MOV direct, data,MOV Ri, A,MOV Ri, direct,MOV Ri, data,MOV DPTR, data16,这组指令的功能是:把源操作数的内容送入内部RAM单元或特殊功能寄存器。其中第三条指令和最后一条指令都是三字节指令。第三条指令的功能很强, 能实现内部RAM之间、特殊功能寄存器之间或特殊功能寄存器与内部RAM之间的直接数据传送。最后一条指令是将16位的立即数送入数据指针寄存器DPTR。,4. 累加器A与外部数据存储器之间的传送指令,MOVX A, DPTR,MOVX A, Ri,MOVX DPTR, A,MOVX Ri, A,这组指令是:在累加器A与外部数据存储器RAM单元或I/O口之间进行数据传送, 前两条指令执行时, P3.7 引脚上输出RD有效信号, 用作外部数据存储器的读选通信号; 后两条指令执行时, P3.6 引脚上输出WR有效信号, 用作外部数据存储器的写选通信号。DPTR所包含的 16 位地址信息由 P0 (低 8 位)和P2(高 8 位)输出, 而数据信息由P0 口传送, P0 口作分时复用的总线。由Ri作为间接寻址寄存器时, P0 口上分时输出Ri指定的 8 位地址信息及传输 8 位数据。,5. 堆栈操作指令,PUSH direct,POP direct,在MCS -51 单片机的内部RAM中, 可以设定一个先进后出的区域, 称其为堆栈。在特殊功能寄存器中有一个堆栈指针SP, 它指出栈顶的位置。 进栈指令的功能是: 首先将堆栈指针SP的内容加1, 然后将直接地址所指出的内容送入SP指出的内部RAM单元; 出栈指令的功能是: 将SP所指出的内部RAM单元的内容送入由直接地址所指出的字节单元, 接着将堆栈指针SP的内容减 1。,例如: 进入中断服务子程序时, 把程序状态寄存器PSW、 累加器A、 数据指针DPTR进栈保护。设当前SP为 60H。则程序段,PUSH PSW,PUSH ACC,PUSH DPL,PUSH DPH,执行后, SP内容修改为 64H, 而61H、62H、63H、64H单元中依次栈入PSW、A、DPL、DPH的内容。当中断服务程序结束之前, 如下程序段(SP保持 64H不变),POP DPH,POP DPL,POP ACC,POP PSW,执行之后, SP内容修改为 60H, 而64H、 63H、 62H、 61H单元中的内容依次弹出到DPH、DPL、A、PSW中。 ,MCS -51 提供一个向上升的堆栈, 因此SP设置初值时要充分考虑堆栈的深度, 要留出适当的单元空间, 满足堆栈的使用。,6.程序存储器内容送累加器,MOVC A, A+PC,MOVC A, A+DPTR,这是两条很有用的查表指令, 可用来查找存放在外部程序存储器中的常数表格。第一条指令是以PC作为基址寄存器, A的内容作为无符号数和 PC的内容 ( 下一条指令的起始地址)相加后得到一个 16 位的地址, 并将该地址指出的程序存储器单元的内容送到累加器A。 这条指令的优点是不改变特殊功能寄存器和PC的状态, 只要根据A的内容就可以取出表格中的常数。缺点是表格只能放在该条查表指令后面的 256 个单元之中, 表格的大小受到限制, 而且表格只能被一段程序所利用。,第二条指令是以DPTR作为基址寄存器, 累加器A的内容作为无符号数与DPTR内容相加, 得到一个 16 位的地址, 并把该地址指出的程序存储器单元的内容送到累加器A。这条指令的执行结果只与指针DPTR及累加器A的内容有关, 与该指令存放的地址无关, 因此, 表格的大小和位置可以在 64 KB程序存储器中任意安排, 并且一个表格可以为各个程序块所共用。,7. 字节交换指令,XCH A, Rn,XCH A, Ri,XCH A, direct,XCHD A, Ri,SWAP A,前三条指令是将累加器A的内容和源操作数内容相互交换; 后两条指令是半字节交换指令, 最后一条指令是将累加器A的高 4 位与低 4 位之间进行交换, 而另外一条指令是将累加器 A 的低 4 位内容和(Ri)所指出的内部RAM单元的低 4 位内容相互交换。,3.2.3 算术运算类指令,表 3.2 算术运算指令,表 3.2 算术运算指令,表 3.3 影响标志位的指令,表 3.3 影响标志位的指令,一、 加法指令,1. 普通加法指令,ADD A, Rn,ADD A, direct,ADD A, Ri,ADD A, data,例如: 120 和 100 之和为 220, 显然大于 127, 相加时,0 1 1 1 1 0 0 0 120,0 1 1 0 0 1 0 0 100,1 1 0 1 1 1 0 0 220,+,符号位(最高位)由 0 变 1, 两个正数相加结果变负, 实际上它是和数的最高位, 符号位移入了进位标志, 此时位 6 有进位而位 7 无进位, 置位溢出标志OV, 结果溢出。,同样, 120和100 相加, 结果应为220, 显然小于128, 相加时,1 0 0 0 1 0 0 0 -120,1 0 0 1 1 1 0 0 -100,+,1 0 0 1 0 0 1 0 0 -220,符号位由1变为0, 两个负数相加结果变为正数, 这是因为符号位移入进位标志, 位 6 无进位而位 7 有进位, 置位溢出标志OV, 由此可判断结果溢出。,2. 带进位加法指令,ADDC A, Rn,ADDC A, direct,ADDC A, Ri,ADDC A, data,这组指令的功能与普通加法指令类似, 唯一的不同之处是, 在执行加法时, 还要将上一次进位标志Cy的内容也一起加进去, 对于标志位的影响也与普通加法指令相同。,3. 增量指令,INC A,INC Rn,INC direct,INC Ri,INC DPTR,这组指令的功能是:将指令中所指出操作数的内容加1。 若原来的内容为 0FFH, 则加 1 后将产生溢出, 使操作数的内容变成 00H, 但不影响任何标志。最后一条指令是对16 位的数据指针寄存器DPTR执行加 1 操作, 指令执行时, 先对低 8 位指针 DPL的内容加 1, 当产生溢出时就对高 8 位指针DPH加 1, 但不影响任何标志。,4. 十进制调整指令,DA A,这条指令对累加器A参与的BCD码加法运算所获得的 8 位结果进行十进制调整, 使累加器A中的内容调整为二位压缩型 BCD码的数。使用时必须注意, 它只能跟在加法指令之后, 不能对减法指令的结果进行调整, 且其结果不影响溢出标志位。,执行该指令时, 判断 A中的低 4 位是否大于 9 和辅助进位标志 AC是否为“1”, 若两者有一个条件满足, 则低 4 位加 6 操作; 同样, A中的高 4 位大于 9 或进位标志 Cy为“1”两者有一个条件满足时, 高 4 位加 6 操作。例如: 有两个 BCD数 36 与 45 相加, 结果应为 BCD码 81, 程序如下:,MOV A, 36H,ADD A, 45H,DA A,这段程序中, 第一条指令将立即数36H(BCD码36)送入累加器A; 第二条指令进行如下加法:,0 0 1 1 0 1 1 0 36,0 1 0 0 0 1 0 1 45,0 1 1 1 1 0 1 1 7B,0 0 0 0 0 1 1 0 06,+,+,1 0 0 0 0 0 0 1 81,得结果 7BH; 第三条指令对累加器 A进行十进制调整, 低 4 位(为 0BH)大于 9, 因此要加 6, 得调整的 BCD码 81。,二、 减法指令,1. 带进位减法指令,SUBB A, Rn,SUBB A, direct,SUBB A, Ri,SUBB A, data,这组指令的功能是: 将累加器A的内容与第二操作数及进位标志相减, 结果送回到累加器A中。在执行减法过程中,如果位7(D7)有借位, 则进位标志Cy置“1”, 否则清“0”; 如果位 3(D3)有借位, 则辅助进位标志AC置“1”, 否则清“0”; 如位 6 有借位而位 7 没有借位, 或位 7 有借位而位 6 没有借位, 则溢出标志OV置“1”, 否则清“0”。 若要进行不带借位的减法操作, 则必须先将Cy清“0”。,2. 减1指令,DEC A,DEC Rn,DEC direct,DEC Ri,这组指令的功能是: 将指出的操作数内容减 1。 如果原来的操作数为 00H, 则减 1 后将产生下溢出, 使操作数变成 0FFH, 但不影响任何标志。 ,三、 乘法指令,乘法指令完成单字节的乘法, 只有一条指令: ,MUL AB,这条指令的功能是: 将累加器A的内容与寄存器B的内容相乘, 乘积的低 8 位存放在累加器A中, 高 8 位存放于寄存器B中。如果乘积超过0FFH, 则溢出标志OV置“1”, 否则清“0”。 进位标志Cy总是被清“0”。,四、 除法指令,除法指令完成单字节的除法, 只有一条指令: ,DIV AB,这条指令的功能是: 将累加器 A中的内容除以寄存器 B中的8位无符号整数, 所得商的整数部分存放在累加器A中, 余数部分存放在寄存器 B中, 清“0”进位标志Cy和溢出标志OV。 若原来 B中的内容为 0, 则执行该指令后 A与 B中的内容不定, 并将溢出标志OV置“1”, 在任何情况下, 进位标志Cy总是被清“0”。,3.2.4 逻辑运算类指令,表 3.4 逻辑运算指令,一、 简单逻辑操作指令,CLR A ; 对累加器A清“0”,CPL A; 对累加器A按位取反,RL A; 累加器A的内容向左环移 1 位,RLC A; 累加器A的内容带进位标志位向左环移 1 位,RR A; 累加器A的内容向右环移 1 位,RRC A; 累加器A的内容带进位标志位向右环移 1 位,这组指令的功能是: 对累加器A的内容进行简单的逻辑操作。除了带进位标志位的移位指令外,其它都不影响Cy, AC, OV等标志。,二、 逻辑与指令,ANL A, Rn,ANL A, direct,ANL A, Ri,ANL A, data,ANL direct, A,ANL direct, data,这组指令的功能是: 将两个操作数的内容按位进行逻辑与操作, 并将结果送回目的操作数的单元中。,三、 逻辑或指令,ORL A, Rn,ORL A, direct,ORL A, Ri,ORL A, data,ORL direct, A,ORL direct, data,这组指令的功能是: 将两个操作数的内容按位进行逻辑或操作, 并将结果送回目的操作数的单元中。,四、 逻辑异或指令,XRL A, Rn,XRL A, direct,XRL A, Ri,XRL A, data,XRL direct, A,XRL direct, data,这组指令的功能是: 将两个操作数的内容按位进行逻辑异或操作, 并将结果送回到目的操作数的单元中。,3.2.5 控制转移指令,控制转移指令共有 17 条, 不包括按布尔变量控制程序转移指令(见表 3.5)。其中有 64 KB范围内的长调用、 长转移指令; 有 2 KB范围内的绝对调用和绝对转移指令; 有全空间的长相对转移及一页范围内的短相对转移指令; 还有多种条件转移指令。由于MCS -51 提供了较丰富的控制转移指令, 因此在编程上相当灵活方便。这类指令用到的助记符共有 10 种: AJMP、LJMP、SJMP、JMP、ACALL、LCALL、JZ、JNZ、CJNE、DJNZ。,表 3.5 控 制 转 移 指 令,一、 无条件转移指令,1. 短跳转指令,AJMP addr,11,这是2KB范围内的无条件跳转指令, 执行该指令时, 先将PC+2, 然后将addr,11,送入PC,10,PC,0, 而PC,15,PC,11,保持不变。 这样得到跳转的目的地址。需要注意的是, 目标地址与AJMP后面一条指令的第一个字节必须在同一个 2 KB区域的存储器区内。,2. 相对转移指令,SJMP rel,执行该指令时, 先将 PC+2, 再把指令中带符号的偏移量加到PC上, 得到跳转的目标地址送入PC。 ,3. 长跳转指令,LJMP addr16,执行该指令时, 将 16 位目标地址addr,16,装入PC, 程序无条件转向指定的目标地址。转移的目标地址可以在 64 KB程序存储器地址空间的任何地方, 不影响任何标志。,4. 散转指令,JMP A+DPTR,执行该指令时, 把累加器 A中的 8 位无符号数与数据指针中的 16 位数相加, 结果作为下条指令的地址送入PC, 不改变累加器 A和数据指针DPTR的内容, 也不影响标志。 利用这条指令能实现程序的散转。,二、 条件转移指令,JZ rel; (A)= 0 转移,JNZ rel; (A)0 转移,这类指令是依据累加器A的内容是否为 0 的条件转移指令。条件满足时转移(相当于一条相对转移指令), 条件不满足时则顺序执行下面一条指令。转移的目标地址在以下一条指令的起始地址为中心的 256 个字节范围之内(128 +127)。当条件满足时, PC(PC)+N+rel, 其中(PC)为该条件转移指令的第一个字节的地址, N为该转移指令的字节数(长度), 本转移指令N=2。,三、 比较转移指令,在MCS - 51 中没有专门的比较指令, 但提供了下面 4 条比较不相等转移指令: ,CJNE A, direct, rel,CJNE A, data, rel,CJNE Rn, data, rel,CJNE Ri, data, rel,这组指令的功能是: 比较前面两个操作数的大小, 如果它们的值不相等则转移。转移地址的计算方法与上述两条指令相同。如果第一个操作数(无符号整数)小于第二个操作数, 则进位标志Cy置“1”, 否则清“0”, 但不影响任何操作数的内容。,四、 减 1不为 0转移指令,DJNZ Rn, rel,DJNZ direct, rel,这两条指令把源操作数减 1, 结果回送到源操作数中去, 如果结果不为 0 则转移(转移地址的计算方法同前)。,五、 调用及返回指令,在程序设计中, 通常把具有一定功能的公用程序段编制成子程序, 当主程序需要使用子程序时用调用指令, 而在子程序的最后安排一条子程序返回指令,以便执行完子程序后能返回主程序继续执行。,1. 绝对调用指令,ACALL addr,11,这是一条 2 KB范围内的子程序调用指令。执行该指令时,先将 PC+2 以获得下一条指令的地址, 然后将 16 位地址压入堆栈(PCL内容先进栈, PCH内容后进栈), SP内容加 2, 最后把 PC的高 5 位PC,15,PC,11,与指令中提供的 11 位地址addr,11,相连接(PC,15,PC,11, ,10,0,), 形成子程序的入口地址送入PC, 使程序转向子程序执行。所用的子程序的入口地址必须与 ACALL下面一条指令的第一个字节在同一个 2 KB区域的存储器区内。,2. 长调用指令,LCALL addr,16,这条指令无条件调用位于 16 位地址addr,16,的子程序。执行该指令时,先将PC+3以获得下一条指令的首地址, 并把它压入堆栈(先低字节后高字节), SP内容加 2, 然后将 16 位地址放入 PC中, 转去执行以该地址为入口的程序。 LCALL指令可以调用 64 KB范围内任何地方的子程序。指令执行后不影响任何标志。,3. 子程序返回指令,RET,这条指令的功能是: 恢复断点, 将调用子程序时压入堆栈的下一条指令的首地址取出送入PC, 使程序返回主程序继续执行。 ,4. 中断返回指令,RETI,这条指令的功能与RET指令相似, 不同的是它还要清除MCS -51 单片机内部的中断状态标志。,3.2.6 位操作类指令,表 3.6 位 操 作 指 令,指令中位地址的表达形式有以下几种: ,(1) 直接地址方式: 如 0A8H; ,(2) 点操作符方式: 如IE.0; ,(3) 位名称方式: 如 EX0; ,(4) 用户定义名方式: 如用伪指令 BIT定义:,WBZD0 BIT EX0,经定义后, 允许指令中使用WBZD0 代替EX0。 ,1. 位数据传送指令,MOV C, bit,MOV bit, C,这组指令的功能是: 把源操作数指出的布尔变量送到目的操作数指定的位地址单元中。其中一个操作数必须为进位标志 Cy, 另一个操作数可以是任何可直接寻址位。,2. 位变量修改指令,CLR C,CLR bit,CPL C,CPL bit,SETB C,SETB bit,这组指令对操作数所指出的位进行清“0”#, 取反#, 置“1”的操作, 不影响其它标志。,3. 位变量逻辑与指令,ANL C, bit,ANL C, /bit,这组指令的功能是: 如果源位的布尔值是逻辑 0, 则将进位标志清“0”; 否则, 进位标志保持不变, 不影响其它标志。bit前的斜杠表示对(bit)取反, 直接寻址位取反后用作源操作数, 但不改变直接寻址位原来的值。例如指令: ANL C, /ACC.0 执行前ACC.0 为 0, C为 1, 则指令执行后 C为 1, 而 ACC.0仍为 0。,4. 位变量逻辑或指令,ORL C, bit,ORL C, /bit,这组指令的功能是: 如果源位的布尔值是逻辑 1, 则将进位标志置“1”; 否则, 进位标志保持不变, 不影响其它标志。,5. 位变量条件转移指令,JC rel; 若(Cy)=1, 则转移 PC(PC)+2+rel,JNC rel; 若(Cy)=0, 则转移PC(PC)+2+rel ,JB bit, rel; 若(bit)=1, 则转移PC(PC)+3+rel,JNB bit, rel; 若(bit)=0, 则转移PC(PC)+3+rel,JBC bit, rel; 若(bit)=1, 则转移PC(PC)+3+rel, 并 bit 0,
展开阅读全文