LessonAia《51汇编指令》指令描述约定学习指点符号含义A累加器,用于运算及存放数据B专用寄存器,用于MUL和DIV指令中,存放第二操作数、乘积高位字节。C进位标志位,或布尔处理器中的累加器,也可用Cy表示。bit位寻址区的直接寻址位//——位操作的前缀,表示对该位操作数取反,如/bit。DPTR16位数据指针,也可作为16位地址寄存器Rn工作寄存器中的寄存器Rn(R0…R7之一)Ri工作寄存器中的寄存器R0或R1#data表示8位立即数,即00H~FFH#data16表示16位立即数,即0000H~FFFFHdirect片内RAM或SFR的地址(8位)@间接寻址符,如@Ri、@DPTR。LessonAir指令中,可在该指令的下条指令地址所在页的2KB范围内调用或转移地址的低11位。addr1616位二进制数地址,用于LCALL、LJMP等指令中,能调用或转移到64KB程序存储器地址空间的任何地方rel补码形式的8位地址偏移量,偏移范围为-128~127x片内RAM的直接地址或寄存器(x)X地址单元中的内容,或X作为间接寻址寄存器时所指单元的内容((x))X中的内容为地址的空间中的内容。←用箭头右边的内容取代箭头左边的内容。$指本条指令的首地址指令速查指令详解LessonAir学习指点条,另有伪指令(常用)17条,共128条指令速查指令详解LessonAir需求分析:将要设计一个单片机控制系统,如图示,单片机控制发光二极管1和发光二极管2交替发光,交替的时间间隔为500ms。电路设计:因为外设为两支发光二极管,所以可以在最简系统基础上添加这两个外设,并给每个发光二极管串联一个限流电阻,。两支发光二极管的负极分别与单片机的P1.7口和P1.0口相连,如果这两个I/O口为高电平发光二极管不发光,而如果I/O口为低电平发光二极管发光。以例0学指令——发光二极管交替发光指令速查指令详解LessonAir程序操作流程如图所示:一开始,令P1.0=0、P1.7=1,这样,发光二极管D1点亮而D2熄灭。延时500ms使得这个状态保持500ms,接着P1.0=1、P1.7=0,发光二极管D1熄灭而D2点亮,再保持这个状态500ms后回到一开始的D1点亮而D2熄灭。以此循环,发光二极管D1、D2就在不断的交替发光。以例0学指令——发光二极管交替发光指令速查指令详解LessonAir程序设计:以例0学指令——发光二极管交替发光ORG00H;设置起始地址MAIN:;标号MOVP1,#0FEH;向P1.0口输出低电平,使发光二极管D1点亮ACALLDELAY;调用延时子程序MOVP1,#7FH;向P1.7口输出高电平,使发光二极管D2点亮ACALLDELAY;调用延时子程序AJMPMAIN;跳回MAIN,循环执行DELAY:;延时子程序(500ms)MOVR3,#50D1:MOVR4,#20D2:MOVR5,#248DJNZR5,$DJNZR4,D2DJNZR3,D1RET;返回主程序END;汇编程序结束指令速查指令详解LessonAir指令一般由助记符、目的操作数、源操作数、注释(有时可省略)组成。汇编语言书写的单片机程序,以伪指令ORG和END为开始和结束的标志。伪指令只是告诉汇编器一些汇编的信息,对单片机的操作没有影响。真正指挥单片机干活的是从“MAIN:”开始到“END”之前的多行指令。汇编语言对字母的大小写不敏感,但习惯上程序中都使用大写字母。以例0学指令——发光二极管交替发光指令速查指令详解在图示指令中,立即数00H是一个十六进制数,在汇编语言中,十六进制数后面必须附上H,否则将认作十进制数。如果十六进制数以字母A、B、C、D、E、F开头时,应该在前面加上0。例如,十六进制数B7H,在指令中应当写成0B7H,如“MOVP1,#0B7H”。如果把十六进制的立即数转换成二进制数,就可知道指令所影响目的操作数每一位的情况。比如指令“MOVP0,#00H”,立即数00H转换成二进制数为00000000,所以指令把这8个0载入P0口,于是单片机P0口都出现低电平。有时为了直观,可把二进制数作为立即数,但是需要在后面加上B,如“MOVP0,#00000000B”。当然,立即数也可以由十进制数充当,比如“MOVP0,#23”实现把十进制数23载入P0寄存器中,执行后P0口的状态为00010111(十进制数23对应的二进制数)。LessonAir学指令——发光二极管交替发光指令速查指令详解LessonAir单片机指令系统单片机的指挥官——程序程序是单片机的灵魂,离开程序单片机就是一个无用的驱壳。汇编语言真面目汇编语言(assemblylanguage)是一种低级的计算机编程语言,它直接与计算机的机器码打交道。用汇编语言设计的程序称为汇编程序。汇编程序在µVision中汇编之后可生成以.HEX为后缀的执行代码文件执行代码是一系列的十六进制数,与指令一一对应。除了汇编语言外,C51语言也可以用来设计单片机程序。C51语言是高级语言,它与C语言极为相似,大多数单片机程序开发环境(如µVision)都支持C51语言。但无论是汇编语言或是C51语言,经过汇编后结果都是一样的——生成以.HEX为后缀的执行代码文件。从汇编程序到执行代码汇编指令(instructionset):一条指令“指挥”单片机完成一个操作。比如指令“MOVP1,A”实现将累加器A中的数据从P1输出。51单片机的指令分为了算术运算指令、逻辑运算指令、数据传送指令、布尔指令、调用指令、跳转指令、循环指令等。汇编程序(assemblyprogram):经过设计者思考和组织,将许多指令组合在一起形成实现特定功能的集合,就是汇编程序。源文件(sourcecodefile):汇编程序在开发环境中设计、书写,保存时以.asm为后缀就成了源文件。指令速查指令详解LessonAir单片机指令系统单片机的指挥官——程序执行代码文件(opcodeoroperationcode):汇编过程中,汇编器将源文件中每一条指令汇编成执行代码。某条指令的执行代码的长度在1个到3个字节之间。执行代码会以.HEX为后缀以文件的形式保存在硬盘中,再使用下载线就可以把这些执行代码下载到单片机的程序存储器。伪指令(pseudoopcode)并不算可执行程序的一部分,所以不会被汇编器汇编,也不生成执行代码,但却告知汇编器一些信息。如常用的伪指令ORG告诉汇编器程序的起始地址、伪指令END表明汇编程序的结束。指令速查指令详解LessonAir单片机指令系统单片机的指挥官——程序指令的执行指令“MOVA,32H”,将数据存储器地址32H中的内容载入累加器A。这条指令经过汇编后在程序存储器中形成的执行代码为“E5”、“32”。“E5”是这条MOV指令的执行代码(附录),“32”是源操作数32H。首先,当程序计数器PC指向执行代码E5时,①CPU就“意识到”要执行的操作是把下一个执行代码所指向的数据存储器地址中的数据载入累加器A。②PC加1,CPU根据PC所指抓取下一个执行代码“32”。于是CPU机到数据存储器地址32H中取得数据(③)。④并把所得数据载入累加器A,最后A=88H。指令速查指令详解LessonAir汇编语言指令由操作码助记符字段和操作数字段两部分组成。指令格式如下:操作码目的操作数,源操作数操作码和操作数都有对应的二进制代码,指令代码由若干字节组成。对于不同的指令,指令的字节数不同。89C51指令系统中,有单字节、双字节或3字节指令。1.单字节指令单字节指令中的8位二进制代码既包含操作码的信息,也包含操作数的信息。这种指令有两种情况。指令码中隐含着对某一个寄存器的操作例:INCDPTR指令代码为A3H(10100011)由指令码中低三位的不同编码指定某一个寄存器例:MOVA,Rn指令代码格式为(11101xxx)其中,高5位为操作内容—传送;最低3位的不同组合编码用来表示从哪一个寄存器(R0~R7)取数。89C51单片机共有49条单字节指令。2.双字节指令用一字节表示操作码,另一字节表示操作数或操作数所在的地址。89C51中有45条双字节指令。3字节指令一字节操作码,两字节操作数。共有3字节指令17条指令速查指令详解LessonAir指令汇解(汇编程序)寻址方式(寻址就是寻找指令中操作数或操作数所在地址。)直接寻址直接寻址(directaddressing):直接地址的内容载入一个寄存器中或寄存器的内容载入直接地址中。AT89S51单片机片内数据存储器的00H~7FH(但常用30H~7FH)以及特殊功能寄存器SFR都能被直接寻址。注意地址前是没有“#”号的。如以下几条指令属于直接寻址指令:MOVA,30H;把直接地址30H上的内容载入累加器AMOV50H,B;把B寄存器的值载入直接地址50H上ADDA,60H;累加器A和直接地址60H的内容相加,结果存回A间接寻址间接寻址:用R0、R1、SP、DPTR中的某一寄存器来代替直接寻址中的直接地址来寻址。其中“@”符号表示间接寻址,注意在书写时不要遗漏。MOVR1,#32H;R1=32HMOVA,@R1;R1所指向的地址的内容载入ACC中寄存器寻址寄存器寻址:是指与工作寄存器R0-R7有关的寻址指令。例如:MOVA,R0;将R0的值载入累加器AADDA,R5;将A与R5的值相加,并把结果存回AMOVR7,A;将A的值载入R7中指令速查指令详解LessonAir指令汇解(汇编程序)寻址方式寄存器特征寻址寄存器特征寻址:与特定寄存器有关的寻址方式。有些指令总是与累加器A或数据指针寄存器DPTR等有关,而没有涉及其他地址。这类指令只影响特定寄存器,不会改变其他地址或寄存器。如以下几条指令属于寄存器特征寻址指令:INCA;累加器A自增1SWAPA;A的高4位与低4位互换INCDPTR;数据指针DPTR自增1立即寻址立即寻址:与立即数相关的寻址方式。立即数的特征就是在数据前加一个“#”号。这类寻址方式比较简单,如以下几条指令都属于立即寻址指令:MOVA,#100;将立即数100(64H)载入累加器AMOV33H,#10H;将立即数10H载入数据存储器地址33H上变址寻址变址寻址:针对的仅是程序存储器,而且这种寻址方式只能从程序存储器中读数据。通常我们对程序存储器访问得较多的是数据表中的数据(比如取表法)。在变址寻址中,使用程序计数器PC或数据指针DPTR作为间接地址,有时还加上累加器A,根据这些间接地址在程序存储器找到相应的内容。MOVCA,@A+DPTR;累加器A和数据指针DPTR之