《指令与汇编语言程序设计.ppt》由会员分享,可在线阅读,更多相关《指令与汇编语言程序设计.ppt(52页珍藏版)》请在三一办公上搜索。
1、第3章 指令与汇编语言 程序设计,本章主要内容,一、程序设计的步骤,1、分析问题,明确所要解决问题的要求,确定算法或解题思路2、画流程图,3、编写源程序画流程图 4、汇编和调试程序书写的两种格式:第一种是完整程序格式的形式,即在第二章介绍的程序一般结构。第二种就是子程序的形式。,二、顺序程序设计 顺序程序设计:又叫直线程序,它是按照指令的顺序依次执行的程序,它也是所有程序设计中最基本、最重要的程序。,例3-1 015共十六立即数送到内部RAM 30H开始的单元中。本题题意非常清楚,就是将0送到内RAM 30H单元,将1送到内RAM 31H单元,以此类推。将立即数送到内部RAM单元有现成的指令,
2、这是一个功能性数据处理,格式上可以写成子程序的形式,程序设计如下:START:MOV 30H,#0;(30H)#0 MOV 31H,#1;(31H)#1 MOV 3FH,#15;(3FH)#15 RET;返回,一、循环程序的结构,1、循环程序:主要是用来实现功能相同、反复执行的操作。,循环程序一般包括四个部分:循环初值、循环体、循环修改和循环控制。循环初值:循环程序开始循环执行的初始条件,如循环的次数等,在循环程序的开始部分,只执行一次。循环体:是循环程序的核心,就是反复要完成的具体操作功能。循环修改:循环体执行一次后,再次执行之前,需要对有关参数进行修改,为下一轮循环做准备,和循环体一样,循
3、环修改的程序内容也是反复多次执行的。循环控制:根据循环预先确定的次数,或者循环过程中有关操作数的内容进行判断,控制循环的结束。,2、加1和减1指令。(1)加1指令 1)INC A;AA+1 2)INC Rn;RnRn+1 3)INC direct;(direct)(direct)+1 4)INC Ri;(Ri)(Ri)+1 5)INC DPTR;DPTRDPTR+1(2)减1指令 1)DEC A;AA-1 2)DEC Rn;RnRn-1 3)DEC direct;(direct)(direct)-1 4)DEC Ri;(Ri)(Ri)-1,3、循环程序设计举例例3-3 015共十六个立即数送到
4、内部RAM 30H开始的单元中。,MOV R0,#30H MOV A,#0 MOV R0,A,MOV R0,#31H MOV A,#1 MOV R0,A,MOV R0,#3FH MOV A,#15 MOV R0,A,MOV 30H,#0,MOV 31H,#1,MOV 3FH,#15,START:MOV R2,#16;循环次数 MOV R0,#30H;指向第一个单元;循环初值 MOV A,#0;送的第一个数AA:MOV R0,A;循环体,完成数据传;送循环体循环修改 INC A;循环修改 INC R0;修改指向的单元 DJNZ R2,AA;循环次数减1,到0退;出循环,循环控制 RET;子程序返
5、回0,二、比较转移指令与循环程序设计,1、比较转移指令(1)CJNE A,#data,rel;PCPC+3,若A=data,程序顺序执行;若Adata,PCPC+rel,程序转移,Cy=0;若Adata,PCPC+rel,程序转移,Cy=1;(2)CJNE Rn,#data,rel;PCPC+3,若Rn=data,程序顺序执行;若Rndata,PCPC+rel,程序转移,Cy=0;若Rndata,PCPC+rel,程序转移,Cy=1;(3)CJNE Ri,#data,rel;PCPC+3,若=data,程序顺序执行;若(Ri)data,PCPC+rel,程序转移,Cy=0;若(Ri)data,
6、PCPC+rel,程序转移,Cy=1;(4)CJNE A,direct,rel;PCPC+3,若A=(direct),程序顺序执行;若A(direct),PCPC+rel,程序转移,Cy=0;若A(direct),PCPC+rel,程序转移,Cy=1;,2比较转移指令应用举例 例3-3程序用比较转移指令修改如下:START:MOV R0,#30H;指向第一个单元 MOV A,#0;送的第一个数AA:MOV R0,A;循环体,完成数据传送 INC A;修改送的数据 INC R0;修改指向的单元 CJNE A,#16,AA;根据操作数信息控;制循环循环控制 RET;子程序返回也可以通过对R0中数据
7、判断比较控制程序结束,1循环移位指令(1)循环左移指令 RL A;,三、循环移位指令与程序设计,(2)循环右移指令 RR A;,(3)带进位位的循环左移指令 RLC A;,(4)带进位位的循环右移指令 RRC A;,例3-6 执行下面的指令,在注释区记录A中数据的变化。MOV A,#03H;A=00000011B=3 CLR C;Cy=0 RLC A;A=00000110B=6,Cy=0 RLC A;A=00001100B=12,Cy=0可以看出左移一次相当于乘2;类似右移相当除以2。2循环移位指令应用,2循环移位指令应用例3-7将第二章的循环流水灯程序修改成循环程序 ORG 0000H LJ
8、MP SETUP ORG 0030HSETUP:MOV A,#0FEH;循环初值MAIN:MOV P1,A;点亮灯 LCALL DELAY;调延时子程序 RL A;循环修改 LJMP MAIN;DELAY:MOV R6,#80H;延时子程序DEL1:MOV R7,#0DEL:DJNZ R7,DEL DJNZ R6,DEL1 RET;子程序返回 END,1条件转移指令(1)判A转移指令 JZ rel;PCPC+2,若A=0,则转移,;PCPC+rel;若A0,则顺序执行。JNZ rel;PCPC+2,若A0,则转移,;PCPC+rel;若A=0,则顺序执行。,四、条件转移指令与循环程序设计,(2
9、)判Cy转移指令 JC rel;PCPC+2,若Cy=1,则转移,;PCPC+rel;若Cy=0,则顺序执行。JNC rel;PCPC+2,若Cy=0,则转移,;PCPC+rel;若Cy=1,则顺序执行。,(3)判A转移指令 JB bit,rel;PCPC+3,若(bit)=1,;则转移,PCPC+rel;若(bit)=0,则顺序执行。JNB bit,rel;PCPC+3,若(bit)=0,;则转移,PCPC+rel;若(bit)=1,则顺序执行。JBC bit,rel;PCPC+3,若(bit)=0,;则顺序执行。;若(bit)=1,则转移,;PCPC+rel,且(bit)0,2条件转移指令
10、应用例3-9编写程序计算内RAM 20H单元中“1”的个数,存放在R3中。START:MOV R3,#0 MOV A,20H MOV R2,#8 AA:RLC A JNC BB INC R3 BB:DJNZ R2,AA;RET,例3-10内部RAM 30H开始的十六个单元,有一组无符号数,试编写程序将其中满足偶校验的数送到内部RAM 50H开始的单元。START:MOV R0,#30H MOV R1,#50H MOV R2,#16 AA:MOV A,R0 JB P,BB MOV R1,A INC R1 BB:INC R0 DJNZ R2,AA;RET,五、分支程序的设计,1单分支结构程序,2多
11、分支结构程序,例3-11 内部RAM 30H开始的单元,存放有一组无符号数据块,数据块的长度在20H单元中,试编写程序计算数据块中满足偶校验和满足奇校验数的个数,分别存放在R2和R3中。START:MOV R0,#30H MOV R2,#0H MOV R3,#0 AA:MOV A,R0 JB P,BB INC R2 SJMP CC BB:INC R3CC:INC R0 DJNZ 20H,AA;RET,例3-12根据A中的内容选择相应的程序段执行。START:MOV DPTR,#TAB;指令表首址送DPTR CLR C RLC A;A的值乘以2 JNC AA;INC DPH;超过256在DPH中
12、加1 AA:JMP A+DPTR;散转指令TAB:AJMP LOOP0;无条件转移指令表 AJMP LOOP1 AJMP LOOPnLOOP0:;分支程序0 LOOP1:;分支程序1,一、堆栈的概念,1、堆栈是内部RAM中一段用来暂时存放数据的存储区,通常用来保护断点和现场。2、SP堆栈指针对其进行管理,SP始终指向堆栈顶部数据的地址,SP在单片机复位后它的值是07H。3、堆栈中数据的存取方式按照先进后出、后进先出的原则进行。4、堆栈操作(1)压栈:先将SP加1,然后将要压入堆栈的数据送到SP指示的单元中。(2)弹栈:先将数据弹出,然后将SP减1,指向新的单元。,二、堆栈操作指令,1、堆栈操作
13、指令 PUSH direct;SP+1SP,;(direct)(SP)POP direct;(SP)(direct),;SP-1SP例3-13已知SP=60H,分析执行下列指令后的结果。MOV DPTR,#1234H;DPTR=1234H PUSH DPH;SP+1SP,SP=61H,(DPH)(SP),;(61H)=12H。PUSH DPL;SP+1SP,SP=62H,(DPH)(SP),;(62H)=34H。POP DPH;DPH=(SP)=(62H)=34H,SP-1SP,;SP=61H。POP DPL;DPH=(SP)=(61H)=12H,SP-1SP,;SP=60H。执行结果:SP=
14、60H,两次压栈,两次出栈,SP不变;DPTR=3412H,和原来的值高低位颠倒,从本例可以看出,堆栈的操作一定要注意操作规则:先进后出、后进先出。,(2)隐含的堆栈操作指令 LCALL addr16;PCPC+3,;SP+1SP,PC70(SP);SP+1SP,PC158(SP),;addr16PC ACALL addr11;PCPC+2,;SP+1SP,PC70(SP);SP+1SP,PC158(SP),;addr11PC100 RET;(SP)PC158,SP-1SP。;(SP)PC70,SP-1SP。中断的响应与返回也会对堆栈进行操作。,一般情况下,应在初始化区对SP进行设置,将堆栈设
15、定在数据缓冲区。,一、算术运算指令,1、加法指令(1)不带进位位的加法指令 ADD A,#data;A+dataA,最高位有进位;时,Cy=1;否则,Cy=0。ADD A,Rn;A+RnA,最高位有进位时,;Cy=1;否则,Cy=0。ADD A,direct;A+(direct)A,最高位;有进位时,Cy=1;否则,Cy=0。ADD A,Ri;A+(Ri)A,最高位有进位;时,Cy=1;否则,Cy=0。,(2)带进位位的加法指令ADDC A,#data;A+data+CyA,最高位有进位;时,Cy=1;否则,Cy=0。ADDC A,Rn;A+Rn+CyA,最高位有进位时,;Cy=1;否则,Cy
16、=0。ADDC A,direct;A+(direct)+CyA,最高位;有进位时,Cy=1;否则,Cy=0。ADDC A,Ri;A+(Ri)+CyA,最高位有进;位时,Cy=1;否则,Cy=0。ADD用于首次相加,ADDC用于除首次以外的相加,例3-14 已知两个双字节无符号数,分别存放在R1R0和R3R2中(高位在前),试编写程序求它们的和,结果存放在R6R5R4中。,R1 R0+R3 R2 R6 R5 R4,START:MOV A,R0;取一个加数的低8位 ADD A,R2;与另外一个数的低8位相加 MOV R4,A;存低8位的和 MOV A,R1;取一个加数的高8位 ADDC A,R3;
17、高8位相加,并加低8位相加时;的Cy MOV R5,A;存高8位的和 CLR A;A清0 ADDC A,#0;0+0+CyA,取出高8位相加时;的Cy MOV R6,A;存进位 RET,(3)BCD码调整指令 DA A 例3-17已知两个BCD码表示的数,分别存放在R1R0和R3R2中(高位在前),试编写程序求它们的和,结果存放在R6R5R4中。START:MOV A,R0;取一个加数的低位 ADD A,R2;与另外一个数的低位相加 DA A;低位和BCD码调整 MOV R4,A;存低位的和 MOV A,R1;取一个加数的高位 ADDC A,R3;高位相加,并加低位相加时的Cy DA A;高位
18、和BCD码调整 MOV R5,A;存高位的和 CLR A;A清0 ADDC A,#0;0+0+CyA,取出高位相加时的Cy MOV R6,A;存进位 RET,2减法指令 SUBB A,#data;A-data-CyA,高位有借位;时,Cy=1,否则,Cy=0。SUBB A,Rn;A-Rn-CyA,高位有借位时,;Cy=1,否则,Cy=0。SUBB A,direct;A-(direct)-CyA,高位;有借位时,Cy=1,否则,Cy=0。SUBB A,Ri;A-(Ri)-CyA,高位有借;位时,Cy=1,否则,Cy=0。减法只有带进位位的减法指令,因此第一次执行除法时,需要将Cy清0。,例3-1
19、8 已知两个双字节数,被减数存放在R1R0中减数存放在R3R2中(高位在前),试编写程序求它们的差,结果存放在R5R4中。,R1 R0 R3 R2 R5 R4,START:CLR C;清Cy MOV A,R0;取被减数的低8位 SUBB A,R2;减去减数的低8位 MOV R4,A;存低8位的差 MOV A,R1;取被减数的高8位 SUBB A,R3;减去减数的高8位;和低8位的借位 MOV R5,A;存高8位的差 RET,注意下面两条指令的区别:(有些情况不能互换)INC A;不影响Cy、OV、AC标志位 ADD A,#1;影响Cy、OV、AC标志位 例3-16 已知一个原码表示的双字节有符
20、号数存放在R1R0(高位在前)中,试编写程序求它的补码,结果存放在R1R0中。START:MOV A,R1;取高8位 JNB ACC.7,AA;高位为0,表示正数转移,不需变换 MOV A,R0;取低8位 CPL A;求反 ADD A,#1;加1 MOV R0,A;存低8位 MOV A,R1;取高8位 CPL A;求反 ADDC A,#0;加低8位的进位 SETB ACC.7;高位置1,负数 MOV R1,A;存高8位AA:RET,3乘法指令 MUL AB;ABBA 实现两个8位的无符号数相乘 例3-19已知两个无符号数分别存放在R1R0和R2中,试编写程序计算它们的积,结果存放在R5R4R3
21、中(高位在前)。,R1 R0 R2 B1 A1+B2 A2 R5 R4 R3,积的高8位放在寄存器B中,而积的低8位放在累加器A中。,START:MOV A,R0;取被乘数的低8位 MOV B,R2;取乘数 MUL AB;相乘 MOV R3,A;MOV R4,B;存放积 MOV A,R1;取被乘数的高8位 MOV B,R2;取乘数 MUL AB;相乘 ADD A,R4;错位相加 MOV R4,A;和回存 CLR A;清A ADDC A,B;进位加到高字节中 MOV R5,A;存高字节 RET,4除法指令 DIV AB;AB的商存放在A中,余数存放;在B中,Cy=0,OV=0。,二、逻辑运算指令
22、,1逻辑“与”运算指令 ANL A,#data;AdataA ANL A,Rn;ARnA ANL A,direct;A(direct)A ANL A,Ri;A(Ri)A ANL direct,#data;(direct)dataA ANL direct,A;(direct)AA,2逻辑“或”运算指令 ORL A,#data;AdataA ORL A,Rn;ARnA ORL A,direct;A(direct)A ORL A,Ri;A(Ri)A ORL direct,#data;(direct)dataA ORL direct,A;(direct)AA,3逻辑“异或”运算指令 XRL A,#da
23、ta;AdataA XRL A,Rn;ARnA XRL A,direct;A(direct)A XRL A,Ri;A(Ri)A XRL direct,#data;(direct)dataA XRL direct,A;(direct)AA例3-22已知A中内容是10110110B,分别执行下面三条指令,分析A中的内容。ANL A,#01101010B;A=00100010B ORL A,#01101010B;A=11111110B XRL A,#01101010B;A=11011100B,4位逻辑运算指令(1)位逻辑“与”运算指令 ANL C,bit;C(bit)C ANL C,/bit;C(b
24、it)C(2)位逻辑“或”运算指令 ORL C,bit;C(bit)C ORL C,/bit;C(bit)C,5交换指令(1)字节交换指令 XCH A,Rn;ARn XCH A,Ri;A(Ri)XCH A,direct;A(direct)(2)半字节交换指令 XCHD A,Ri;A30(Ri)30(3)累加器高低4位互换指令 SWAP A;A30A74,例3-23已知2位BCD码存放在内部RAM 30H中,试编写程序将其转换为二进制数,存放在31H单元中。START:MOV A,30H;ANL A,#0F0H;取数屏蔽低4位 SWAP A;高低位互换,的十位数 MOV B,#10;乘数10 M
25、UL AB;A=10a MOV 31H,A;暂存数据 MOV A,30H;ANL A,#0FH;取数屏蔽高4位,得个位 ADD A,31H;得到二进制数 MOV 31H,A;保存二进制数 RET,一、查表指令,1、定义字节伪指令DB 格式:标号:DB 8位二进制数表功能:从标号所指定的地址空间开始,定义若干个ROM单元的数据。如:TAB:DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39HTAB1:DB“0”,“1”,“2”,“3”,“4”,“5”,“6”,“7”,“8”,“9”这两条指令的功能一样,都是在指定的标号处开始的地址单元中存放09的字符信息。,2查表
26、指令 MOVC A,A+DPTR;(A+DPTR)A MOVC A,A+PC;PC+1PC,(A+PC)A 功能是从ROM(程序存储器)空间单元中取一个数到A中。,二、查表程序设计,1、用MOVC A,A+DPTR设计查表程序的步骤定义表格。表格中的数据必须按照一定的顺序。将表格的首地址送给数据指针DPTR(基址)将要找的项与表格首地址的间隔数送给A(变址)执行MOVC A,A+DPTR指令。,2、用MOVC A,A+PC设计查表程序的步骤定义表格。表格中的数据必须按照一定的顺序。将要找的项与表格首地址的间隔数送给A(变址)。A中加上适当的偏移量(查表指令下一条指令的首地址与表格首地址的间隔数
27、)。执行MOVC A,A+PC指令。例3-24已知一位十进制数存放在R0中,编写程序求它的平方结果放在R1中。START:MOV DPTR,#TAB MOV A,R0 MOVC A,A+DPTR MOV R1,A RETTAB:DB 0,1,4,9,16,25,36,49,64,81;十进制数;码的平方,三、LED数码管,1LED数码管 段:a、b、c、d、e、f、g、Dp 位:COM(公共端),2LED数码管编码方式,3、LED数码管的静态显示电路 数码管的静态显示电路中,公共端直接接电源(共阳)或地(共阴),每个数码管的段需要一个8位的口去控制。,图3-12 LED数码管静态显示电路,4、
28、LED数码管的动态显示电路 数码管动态显示电路是将所有数码管相同的段并连在一起,构成一个公共的8位段口,用一个8位的I/O口控制,每个数码管的位用一位的I/O口控制。,例共阳型LED数码管的动态显示电路,图3-14 4位共阳型数码管动态扫描电路,在数码管上显示1、2、3、4,程序如下:,ORG 0000H LJMP SETUP ORG 0030HSETUP:MOV 70H,#1;MOV 71H,#2;MOV 72H,#3;70H73H作为显示缓冲区 MOV 73H,#4;并分别赋初值MAIN:LCALL DIS;主程序反复调用显示子程序 LJMP MAINDIS:;显示子程序 MOV DPTR
29、,#TAB;表格首地址送DPTR MOV A,70H;显示缓冲区送A MOVC A,A+DPTR;查表求出字段码 MOV P0,A;字段码送段输出口 CLR P2.0;开通位 LCALL DEL;调延时 SETB P2.0;关断位,第一个显示完,;以下程序类似 MOV A,73H MOVC A,A+DPTR MOV P0,A CLR P2.3 LCALL DEL SETB P2.3 RETTAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H DB 0F8H,80H,90H;共阳型数码管十进制数字段;码表格DEL:MOV R7,#0;延时子程序 DJNZ R7,$RET END,共阴型LED数码管的动态显示电路,四、寻址方式,1寻址方式(1)立即寻址:MOV A,#30H(2)直接寻址:MOV A,30H(3)寄存器寻址:MOV A,R0(4)寄存器间接寻址:MOV A,R1(5)变址寻址:MOVC A,A+DPTR(6)相对寻址:JZ AA(7)位寻址:SETB 30H,2几个常用的伪指令(1)等值伪指令EQU格式:字符名称 EQU 数据功能:将一个数据赋予规定的字符名称。(2)定义位地址伪指令BIT格式:字符名称 BIT 位地址功能;将位地址赋予字符名称。,