第3章 AT89C51指令系统 3.1基本概念内部结构和引脚功能 3.1.1 指令、指令系统、机器代码 3.1.1 指令、指令系统、机器代码 指令:是单片机CPU执行某种操作的命令。 指令系统:单片机CPU所能执行的全部指令的集合。指令用单 片机CPU能识别和执行的八位二进制机器代码表示;有 单字节、双字节、三字节指令。(参看书281~284页) 【例3-1】三字节、单字节、双字节指令举例 01110101 10010000 11110001 ;将数据11110001传送到内 RAM地址单元10010000中11111000 ;将寄存器A中的内容传送到 寄存器R0中 10000000 11111110 ;是短转移指令,11111110是 转移相对地址。
机器代码:由于指令用八位二进制机器代码表示,所以,指令又称为机器代码。机器代码也可用16进制表示。例3-1的指令用十六进制表示为(省去了“H”,本书对机器代码都如此处理) 75 90 F1 ;将数据F1传送到内RAM地址 单元90中 F8 ;将寄存器A中的内容传送到 寄存器R0中 80 FE ;是短转移指令,FE是转移 相对地址。 3.1.2 程序、程序设计、机器语言 程序:按人的要求又符合单片机指令系统规则而编排的指令序列被称为程序。编写程序的过程称程序设计。 机器语言:根据机器代码表编写出的单片机CPU能认识和直接执行的程序称为目标代码程序。也称机器语言。例3-1是由三条指令构成的机器语言程序段。
3.1.3 汇编语言、汇编语言指令格式、常用符号 1.汇编语言:汇编语言是用助记符、字符串和数字等来表示指令的程序语言。它与机器语言指令是一一对应的,比较接近人的自然语言。 汇编语言的助记符多是与指令操作相关的英文缩写;便于记忆、修改。若将例3-1的机器语言指令用汇编语言来写便是: MOV P1,#0F1H ;意思是将数(称立即数)F1H 传送到特殊功能寄存器P1中 MOV R0,A ;将寄存器A(累加器)中的内 容传送到寄存器R0中 SJMP $ ;是短转移指令,符号$表示该 条指令的首地址。 AT89C51单片机汇编语言指令系统有42种助记符,111种指令。按指令长度可分单字节指令,双字节指令和三字节指令。按指令执行时间可分为单机器周期指令(64种),双机器周期指令(45种)的四机器周期指令(只有乘、除法指令两种)。 汇编语言比机器语言易懂、方便;但单片机CPU是不认识的,必须要将它们转换成机器语言。
2.汇编语言指令的书写格式 [ 标号:]操作码 [操作数1][,操作数2][,操作数3] [;注释] AT89C51汇编语言指令系统的指令格式一般为 [ 标号:]操作码 [操作数1][,操作数2][,操作数3] [;注释] 标 号:用符号表示的该条指令的首地址,根据需要设置。位于一条指令(语句)的开头,以冒号结束。它以英文字母开头,由字母、数字、下划线等组成。 操作码:操作码规定指令实现何种功能(传送、加、减……)操作。是由助记符表示的字符串,是任一指令语句不可缺少的部分,是汇编软件生成目标代码的依据。 操作数:在汇编语言中,操作数可以是被传送的数(立即数),或数在内RAM中的地址,寄存器,转移的指令地址,……。可以采用字母、字符和数字等多种表示形式。操作数个数因指令的不同而不同,多至3个操作数,各操作数之间要用“,”号分开。 注 释:为便于阅读而对指令附加的说明语句。必须以“;”开始。可以采用字母、数字和汉字等多种表示形式。 注意事项: ①每条指令必须有操作码,而方括号所括内容可有可无,由指令、编程情况决定;②标号不能采用系统中已定义过的字符(如MOV,DB等);③标号与操作码之间要有“:”隔开;④操作码和操作数之间一定要有空格;⑤操作数之间必须用“,”隔开;⑥每行只能有一条指令。
3.汇编语言常用符号 指令系统中除表示操作码的42种助记符之外(如MOV,JB……),还使用了一些符号。这些符号的含义如下: Rn——当前选中的工作寄存器组中的8个寄存器R0~R7(n=0~7) Ri——当前选中的工作寄存器组中的2个寄存器R0、R1(i=0,1). direct——8位直接地址。可以是内部RAM单元的地址(00H~7FH)或特殊功能寄存器的地址。 #data8——包含在指令中的8位二进制数。 #data16——包含在指令中的16位二进制数。 Addr16——16位二进制地址,用于LCALL、LJMP……指令中,能调用或转移到64KB程序存储器地址空间的任何地方。 Addr11——用于ACALL和AJMP指令中,可在该指令的下条指令首地址所在页的2K字节内调用或转移地址的低十一位。其含意在相关汇编语言指令中讲解。 rel——在以下相关的汇编语言指令中讲解它的意义。
DPTR——数据指针,可用作16位二进制的地址寄存器。 bit——位,内部RAM(包括特殊功能寄存器)中的可寻址位。 A——累加器。 B——特殊功能寄存器,常用于乘除法指令MUL和DIV中。 C——进位标志或进位位,或位处理器中的累加器。也可用Cy表示。 @——间址寄存器或基址寄存器的前缀,如@ Ri,@DPTR 。 / ——位操作的前缀,表示对该位操作数取反,如 / bit 。 (×)——× 中的内容。 ((×))——×中内容为地址的其中的内容。 ← 用箭头右边的内容取代箭头左边的内容。 $ —— 指本条指令的首地址。
3.1.4 汇编(编译)和编程(固化) 用汇编语言编写的程序称源程 序。单片机是不认识的。故必 须转换成二进制格式(BIN)或 十六进制格式(HEX)文件(称目 标代码文件)。一般都用计算 机软件(例Keil、Wave)来实 现。该转换过程称“汇编”。 汇编后的BIN或HEX文件再通过 编程器编程(固化)到单片机 ROM中。有的单片机(例AT89S51) 可通过ISP下载到单片机FLASH ROM中。编程后,程序中第一 条指令必须安置在单片机ROM 中0000H单元开始的地址单元 中。单片机CPU从该地址开始 取指令并执行。 图3-1 程序机器码在ROM中的安排
3.2 指令寻址方式 3.2.1 寻址、寻址方式、寻址存储器范围 1.寻址、寻址方式 2.七种寻址方式及其寻址存储器范围 寻址就是单片机CPU寻找指令中参与操作的数据的地址 寻址方式就是单片机CPU寻找指令中参与操作的数据地址的方法。 2.七种寻址方式及其寻址存储器范围 AT89C51单片机的硬件结构是寻址方式的基础。“寻址”是单 片机CPU寻址。AT89C51单片机CPU有七种寻址方式,即立即寻址、 直接寻址、寄存器寻址、寄存器间接寻址、变址寻址、相对寻址 和位寻址。它们体现在机器语言的各机器代码指令之中。在汇编 语言指令中也有相应的表现形式。不同的寻址方式有不同的寻址 存储器范围。表3-2 列出了七种寻址方式及相应的寻址存储器范 围。
表3-2 寻址方式及相应的寻址存储器范围 寻 址 方 式 寻 址 存 储 器 范 围 立即寻址 程序存储器ROM 直接寻址 片内RAM低128B,特殊功能寄存器 寄存器寻址 工作寄存器R0~R7,A, C, DPTR,AB 寄存器间接寻址 片内RAM低128B,片外RAM 变址寻址 程序存储器ROM(@A+DPTR,@A+PC) 相对寻址 程序存储器ROM (相对寻址指令的下一指令PC值加-128~+127) 位寻址 片内RAM的20H~2FH字节地址中所有的位,可位寻址的特殊功能寄存器
3.2.2 直接寻址 特征:指令中直接给出参与操作的数据 的地址,该地址一般用direct表示。 机器代码:E5 direct ;双字节指令 对应汇编语言指令:MOV A,direct 若direct为40H,则 机器代码 :E5 40 对应汇编语言指令:MOV A,40H 该指令的功能操作是将片内RAM地址40H 单元中的内容(参与操作的数据)传送 到累加器A中。汇编语言中可用符号标 识法表示功能操作,即用符号 (A)←(40H)表示。 若该指令的机器代码首址在ROM中 0100H,且内RAM地址40H单元中的内容 为68H,则单片机CPU执行此指令的过程 与结果可用示意图3-2表示。 最后(A)=68H。 图3-2 直接寻址 MOV A,40H执行示意图, 执行结果 (A)=(40H)=68H
3.2.3立即寻址 特征:指令中直接给出参与操作的数据,称 立即数。用data表示。汇编语言中,在该 对应汇编语言指令:MOV A,#data 若data为40H,则 机器代码 :74 40H 汇编语言指令:MOV A,#40H 该指令是将立即数40H传送到累加器A中。用 符号标识法表示功能操作,即 (A)← 40H。 若该指令的机器码首址在ROM中0100H,则执 行此指令可用示意图3-3表示。最后 (A)=40H。从图中看出,立即数所在 的地址就在ROM中;说明立即寻址范围为程 序存储器ROM。立即寻址实际上是寻找立即 数所在的ROM中的地址。 图3-3 立接寻址指令 MOV A,#40H执行示意图。结果(A)=40H
3.2.4寄存器寻址 特征:参与操作的数据存放在寄存器中 汇编指令中直接以寄存器名来表示参与 操作的数据的地址,寄存器包括工作寄 存器R0~R7、累加器A、数据指针… 。 机器代码:E8~ EF ;单字节指令 汇编语言指令:MOV A,Rn ;n=0~7 机器代码是单字节,用其低三位(范围 为000~111)表示寄存器R0~R7。若Rn 为R1,机器代码:E9 ;低三位为001 对应汇编语言指令:MOV A,R1 指令操作是将R1中的内容传送到累加器 A中。符号标识法表示功能操作为, (A)←(R1)。 若该指令的机器代码地址在ROM中 100H,且R1中内容为40H,则执行此指 令的过程与结果可用示意图3-4表示。 最后(A)=40H。 图3-4 寄存器寻址 MOV A,R1执行示意图。 结果(A)=40H
3.2.5寄存器间接寻址 特征:为二次寻址。第一次寻址得到寄存器 的内容为(Ri)或(DPTR),第二次寻址是 将第一次寻址所得的寄存器内容为地址并在 其中取参与操作的数据。汇编语言中,寄存 器的前缀@是寄存器间接寻址的标志,有 @Ri、@DPTR等。 例:机器代码:E6~E7 ;单字节指令 对应汇编语言指令:MOV A,@Ri ;i=0、1 对@Ri而言为寄存器间接寻址。若i=1,则 机器代码 :E7 ;单字节指令 对应汇编语言指令:MOV A,@R1 指令操作是将R1中的内容作为地址,再将该 地址中的内容传送到累加器A中。用符号标识 法表示功能操作为:(A)←((R1))。 若该指令的机器代码首址在ROM中0100H,并 设R1中的内容为40H,地址40H中的内容为 59H,则执行此指令的过程与结果可用示意图 3-5表示。 最后(A)=59H。 图3-5 寄存器间接寻址 MOV A,@R1执行示意图。 结果(A)=59H
3.2.6 变址寻址 特征:间接地址由两个寄存器提供。若由A、PC提供,汇编语言中为 @A+PC;若 由A和DPTR提供,汇编语言中表示为@A+DPTR。其中PC或DPTR称基址寄存器,A称 变址寄存器。相加为十六位无符号加法。若变址寄存器A中内容加基址寄存器 DPTR(或PC)中内容,低8位有进位, 该进位直接加到高位,不影响进位标志。例如机器代码 : 93 ;单字节指令 对应汇编语言指令: MOVC A,@A+DPTR。该指令操作是将DPTR中的内容加上A中 的内容作为地址,再将该地址中的内容传送到累加器A中。符号标识法表示为 (A)← ((A)+(DPTR))。 图3-6 变址寻址 MOVC A,@A+DPTR执行示意图。 结果(A)=18H 因指令多用于查表,故常称它为查表指令。 若该指令的机器代码地址在ROM中100H,并设DPTR中的内容为0500H,A中内容为0EH,而ROM地址050EH中的内容为18H, 则指令执行可用示意图3-6表示。最后A中内容由0EH改为18H, 即(A)=18H。
3.2.7相对寻址 特征:以相对寻址指令的下一条指令的程序计数器PC的内容为基值,加上指令机器代码中“相对地址”形成新的PC值(要转移的指令地址)的寻址方式。例如 机器代码 :80 相对地址 ;双字节指令 对应汇编语言指令:SJMP rel 指令机器代码中“相对地址”指的是用一个带符号的八位二进制补码表示的偏移字节数,其取值范围为 -128~+127。负数表示向后转移,正数表示向前转移。 若(PC)表示该指令在ROM中的首地址,该指令字节数为2;执行 该指令的操作为两步: (PC)←(PC)+ 2 ;得到下条指令首址 (PC)←(PC)+ 相对地址 。 第一步完成后,PC中的值为该指令的下一条指令的首地址。第二步完成后,PC中的内容(PC)为转移的目标地址。所以,转移的目标地址范围是该相对寻址指令的下一条指令首址加-128~+127字节的地址。汇编语言相对寻址指令中的往往是一个标号地址,表示ROM中某转移目标地址。汇编软件对该汇编语言指令进行汇编时,自动算出“相对地址”并填入机器代码中。
所以,应将汇编语言中 “rel” 理解 为“带有相对意义的转移 目标地址”。“相对地址”与“rel”的关系如下式表示 “rel”=(PC)+相对寻址指令字节数+“相对地址”; 或: “相对地址”= rel-[(PC)+相对寻址指令字节数]。 其中(PC)为该指令所在ROM中的首地址。 若该指令机器代码在ROM中的首址为0100H,并设“相对地址”为 21H,它是带符号二进制补码表示的偏移字节数。则 机器代码: 80H 21 执行该指令的过程与结果可用示意图3-7表示。最后转移的目的地址为0123H。 可由上式算出对应汇编语言指令SJMP rel 中的 “rel”=0100H+0002H +0021H=0123H 图3-7 相对寻址指令80 21 执行示意图。结果转移目的地址为0123H
3.2.8 位寻址“bit” 特征:参与操作的数据为“位”,不是字节。是对片内数据存储器RAM和 SFR中可位寻址单元的位进行操作的寻址方式。例如 机器代码 :82 bit 对应汇编语言指令:ANL C,bit 对指令中bit而言,为位寻址。该指令的功能操作是将bit(位地址)中的 内容(0或1)与C中的内容相与,再将相与的结果传送到PSW中的进位标志C 中。汇编语言中可用符号标识法表示功能操作,即用符号 (C)←(C)∧(bit)表示。 图3-8 位寻址 ANL C,26H执行示意图。结果(C)=1 若bit为位地址26H,且(26H)=1。则指令为 机器代码 :82 26 对应汇编语言指令: ANL C,26H 若该指令机器代码在ROM中的首址为0100H,设(C)=1。执行该指令的过程与结果可用示意图3-8表示。 执行结果是进位标志(C)=1。 应注意位地址26H是字节地址24H中的D6位(即次高位)的位地址。
3.3 汇编语言的指令系统 按指令功能可把111种指令分为五类: ① 数据传送类(29种); ② 算术操作类(24种); ③ 逻辑操作类(24种); ④ 控制程序转移类(17种); ⑤ 布尔变量操作类(17种),即位操作类指令。 3.3.1数据传送指令 数据传送类指令有29种。可分为内部RAM数据传送指令 (MOV类)、外部数据RAM传送指令(MOVX类)、程序存 储器ROM数据传送指令(MOVC类)、堆栈操作指令、数 据交换指令。数据传送指令操作数一般为两个,即“操 作数1”和“操作数2”。这时,“操作数2”可称为 “源操作数”,“操作数1”可称为“目的操作数”。
1.内部RAM数据传送指令 2.外部RAM数据传送指令 表3-3列出了内部RAM数据传送指令、功能操 作、机器代码和执行机器周期数。此类指令 的特征是操作码为“MOV” 2.外部RAM数据传送指令 表3-4列出了外部RAM数据传送指令、功能操作、机器代码和执行机器周期数,它们都是与外RAM有关的数据传送指令,其特征是操作码为“MOVX”。 该类指令均涉及对外RAM 64K地址单元操作,而指令MOVX @Ri,A MOVX A,@Ri中Ri只提供外RAM地址的低8位地址,所以高8位应由P2提供。
3.ROM数据传送指令(查表指令) 表3-5列出了ROM数据传送指令、功能操作、机器代码和执行机器周期数。这类指令共有两条,其特征是操作码为“MOVC”。均属变址寻址指令,涉及ROM的寻地址空间均为64K。它们在程序中多用于查数据表,故又称查表指令。一般,A中内容称变址,DPTR、PC中内容称基地址。 4.堆栈操作指令 表3-6列出了堆栈操作指令、功能操作、机器代码 和执行机器周期数。 5.数据交换指令 表3-7列出了数据交换指令、功能操作、机器代码和执行机器周期数。
3.3.2 算术运算类指令 算术运算类指令有24种。包括加减乘除四种基本算术指令, 能对 8位的无符号数进行直接的运算。有些算术运算类指令执行后将 会影响程序状态字(PSW)中的标志位C、AC、OV。但是加1和减1 指令不影响这些标志。表3-8列出了对进位标志位C(也可用Cy表 示)、辅助进位标志位AC、溢出标志OV位有影响的所有指令,包 括一些非算术类操作的指令。 表3-8 影响标志位C、OV、AC的指令 指 令 影响标志 C OV AC ADD,ADDC,SUBB √ CPL C MUL,DIV CJNE DA ANL C,bit SETB C 1 ORL C,bit CLR C ANL C,/bit MOV C,bit ORL C,/bit RRC,RLC √:表示根据运行结果使该位置位或复位。
2.带进位C的加法指令(C是此指令执行前的C) 1.加法指令 表3-9列出了加法指令、功能操作、机器代码和执行机器周期数。这些指令分别将工作寄存器中的数、内部RAM单元中的数、以Ri内容为地址中的数或8位二进制立即数与累加器A中的数相加,并将“和”存放在A中。 2.带进位C的加法指令(C是此指令执行前的C) 表3-10列出了带进位C的加法指令、功能操作、机器代 码和执行机器周期数。若相加时第3位或第7位有进位 时,则分别将AC、C标志位置1,否则为0。 3.加1指令 表3-11列出了加1指令、功能操作、机器代码和指令执行机器周期。这些指令执行后,不影响PSW中的标志位C、AC、OV。
4.带进位C减法指令 表3-12列出了带进位C减法指令、功能操作、机器代码和执行机器周期。减法操作会对PSW中标志位C、AC、OV产生影响。 5.减1指令 表3-13列出了减1指令、功能操作、机器代码和指令执行机器周期数。这些指令执行后,不影响标志位C、AC、OV。 6.十进制调整指令 表3-14列出了十进制调整指令、功能操作、机器代码和执行机器周期数。指令将A中按二进制相加后的结果调整成按BCD数相加的结果。 7.乘除法指令 表3-15列出了乘除法指令、功能操作、机器代码和和执行机器周期。
3.3.3 逻辑运算指令 逻辑运算指令对两个8位二进制数进行与、或、非和 异或等逻辑运算。逻辑运算是按位进行的。运算符 分别为∧、∨、!、⊕,其中与、或、异或的运算 法则如表3-16所示 表3-16与、或、异或的运算法则表 参与运算的两位数据 与(∧) 或(∨) 异或(⊕) 1
1.逻辑与指令 表3-17列出了逻辑与指令、功能操作、机器代码和执行机器周期。 2.逻辑或指令 表3-18列出了逻辑或指令、功能操作、机器代码和执行机器周期数。 3.逻辑异或指令 表3-19列出了逻辑异可指令、功能操作、机器代码和执行机器周期数。 4.累加器清零、取反指令 表3-20列出了累加器清零、取反指令、功能操作、机器代码和执行机器周期数。这两类指令皆为单字节单周期指令。
5.移位指令 表3-21列出了移位指令、功能操作、机器代码和执行机器周期数。图3-9为四条移位指令的功能操作示意图。 3.3.4控制转移指令 控制转移指令通过修改PC的内容来控制程序的执行 的流向。这类指令包括无条件转移指令、条件转移 指令、比较转移指令、循环转移指令、子程序调用 和返回指令、空操作指令等。 1.无条件转移指令 表3-22列出了无条件转移指令、功能操作、机器代码和执行机器周期数。
2.条件转移指令 有累加器A判零转移、比较条件转移和循环转移(减1条件)指令等。 3.子程序调用和返回 表3-27列出了子程序调用和返回指令、功能操作、 机器代码和执行机器周期数。 4.空操作指令 NOP ;(PC)←(PC)+1;机器代码:00 这是一条单字节单周期控制指令。机器执行这条指令仅使(PC)加1,不进行任何操作,耗时1个机器周期,常用来延时 。
3.3.5位操作指令 表3-28列出了位操作指令、功能操作、机器代码和执行机器周期数。位操作指令的操作数不是字节,而只是字节中的某一位,每位取值只能是0或1。位操作指令有位传送、位置位和位清零操作,位运算以及位控制转移指令。 点击进下章点击进上章 习题与思考3 1,2,3,4,5,6,9, 10,11