指令与汇编语言程序设计.ppt_第1页
指令与汇编语言程序设计.ppt_第2页
指令与汇编语言程序设计.ppt_第3页
指令与汇编语言程序设计.ppt_第4页
指令与汇编语言程序设计.ppt_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章 指令与汇编语言 程序设计,本章主要内容,一、程序设计的步骤,1、分析问题,明确所要解决问题的要求,确定算法或解题思路 2、画流程图,3、编写源程序画流程图 4、汇编和调试 程序书写的两种格式: 第一种是完整程序格式的形式,即在第二章介绍的程序一般结构 。 第二种就是子程序的形式。,二、顺序程序设计 顺序程序设计 :又叫直线程序,它是按照指令的顺序依次执行的程序,它也是所有程序设计中最基本、最重要的程序 。,例3-1 015共十六立即数送到内部RAM 30H开始的单元中。 本题题意非常清楚,就是将0送到内RAM 30H单元,将1送到内RAM 31H单元,以此类推。将立即数送到内部RAM单元有现成的指令,这是一个功能性数据处理,格式上可以写成子程序的形式,程序设计如下: START: MOV 30H,#0 ;(30H)#0 MOV 31H,#1 ;(31H)#1 MOV 3FH,#15 ;(3FH)#15 RET ;返回,一、循环程序的结构,1、循环程序:主要是用来实现功能相同、反复执行的操作。,循环程序一般包括四个部分:循环初值、循环体、循环修改和循环控制。 循环初值:循环程序开始循环执行的初始条件,如循环的次数等,在循环程序的开始部分,只执行一次。 循环体:是循环程序的核心,就是反复要完成的具体操作功能。 循环修改:循环体执行一次后,再次执行之前,需要对有关参数进行修改,为下一轮循环做准备,和循环体一样,循环修改的程序内容也是反复多次执行的。 循环控制:根据循环预先确定的次数,或者循环过程中有关操作数的内容进行判断,控制循环的结束。,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共十六个立即数送到内部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 ;子程序返回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,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中数据判断比较控制程序结束,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 LJMP SETUP ORG 0030H SETUP: MOV A,#0FEH ;循环初值 MAIN: MOV P1,A ;点亮灯 LCALL DELAY ;调延时子程序 RL A ;循环修改 LJMP MAIN ; DELAY:MOV R6,#80H ;延时子程序 DEL1: MOV R7,#0 DEL: 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)判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条件转移指令应用 例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多分支结构程序,例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 R3 CC: 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中加1 AA: JMP A+DPTR ;散转指令 TAB: AJMP LOOP0 ;无条件转移指令表 AJMP LOOP1 AJMP LOOPn LOOP0: ;分支程序0 LOOP1: ;分支程序1 ,一、堆栈的概念,1、堆栈是内部RAM中一段用来暂时存放数据的存储区,通常用来保护断点和现场。 2、SP堆栈指针对其进行管理,SP始终指向堆栈顶部数据的地址,SP在单片机复位后它的值是07H。 3、堆栈中数据的存取方式按照先进后出、后进先出的原则进行 。 4、堆栈操作 (1)压栈:先将SP加1,然后将要压入堆栈的数据送到SP指示的单元中。 (2)弹栈:先将数据弹出,然后将SP减1,指向新的单元 。,二、堆栈操作指令,1、堆栈操作指令 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=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进行设置,将堆栈设定在数据缓冲区。,一、算术运算指令,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=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 ;高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 ;高位和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-18 已知两个双字节数,被减数存放在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 已知一个原码表示的双字节有符号数存放在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中(高位在前)。,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。,二、逻辑运算指令,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,#data ;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(bit)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 MUL 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,39H TAB1: DB “0”,“1”,“2”,“3”,“4”,“5”,“6”,“7”,“8”,“9” 这两条指令的功能一样,都是在指定的标号处开始的地址单元中存放09的字符信息。,2查表指令 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中加上适当的偏移量(查表指令下一条指令的首地址与表格首地址的间隔数)。 执行MOVC A,A+PC指令。 例3-24已知一位十进制数存放在R0中,编写程序求它的平方结果放在R1中。 START: MOV DPTR,#TAB MOV A,R0 MOVC A,A+DPTR MOV R1,A RET TAB: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数码管的静态显示电路 数码管的静态显示电路中,公共端直接接电源(共阳)或地(共阴),每个

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论