《信号检测与控制技术》——汇编语言编程基础.doc_第1页
《信号检测与控制技术》——汇编语言编程基础.doc_第2页
《信号检测与控制技术》——汇编语言编程基础.doc_第3页
《信号检测与控制技术》——汇编语言编程基础.doc_第4页
《信号检测与控制技术》——汇编语言编程基础.doc_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

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

文档简介

淮安信息职业技术学院电气工程系 工业信号检测与控制技术课程组目 录目 录I附录C 汇编语言编程基础4一 汇编语言指令基本概念51汇编语言指令的基本格式52汇编语言指令中的常用符号63汇编语言中的伪指令84. 汇编语言程序基本格式12二 数据传送类指令与顺序程序设计151内部RAM的数据传送类指令(15条)15216位数据传送指令(1条)203片外RAM传送指令(4条)214读ROM的指令(查表指令)(2条)225堆栈及其操作指令(2条)246交换指令(5条)287顺序程序的设计30三 控制转移指令与循环程序设计321无条件转移指令(4条)332条件转移指令(13条)353调用和返回指令(4条)394空操作指令(1条)415循环移位指令(4条)426清零与取反指令(2条)437循环程序的结构及设计448、分支程序47四 逻辑运算指令491、逻辑“与”操作指令(6条)492、逻辑“或”操作指令(6条)503、逻辑“异或”操作指令(6条)514、位逻辑操作指令(4条)53五 算术运算指令541、加法指令(8条)552、减法指令(4条)583、乘法指令(1条)604、除法指令(1条)615、加1和减1指令(9条)626、十进制调整指令(1条)64六 位操作类指令651、位传送指令(2条)652、位修正指令(6条)65附录C 汇编语言编程基础单片机的应用系统需要硬件电路和软件的配合才能发挥作用。软件主要是指各种程序,其中的汇编语言编写的程序有一套与单片机相配合的指令系统。不同类型的单片机指令系统不太一样,下面就主要介绍51系列单片机的指令系统。学习和使用汇编语言编程时一个重要环节就是理解和在熟练掌握他的指令系统。一 汇编语言指令基本概念1汇编语言指令的基本格式指令的表示方法称为指令格式。MCS-51系列单片机汇编语言指令的基本格式由以下四个部分组成:标号:操作码 目的操作数,源操作数;注释例如:LOOP:MOV A , #20H ; (A)20H1)标号:指令的符号地址。它并不是指令的必需部分,可根据需要设置。标号的第一个字符必须是英文字母,是由英文字母和数字组成的字符串,但不能用指令助记符、伪指令、特殊功能寄存器名、未定义名和指令系统中用的符号“#”、“”等,长度为26个字符为宜。标号与操作码之间必须用冒号“:”隔开。2)操作码:表示指令的操作功能。是指令的必需部分,用助记符表示。3)操作数:参与操作的数据或地址。对不同功能的指令,操作数的个数不同,一般在03个之间。操作数和操作码之间用空格隔开,多个操作数之间用逗号“,”隔开。目的操作数在前,源操作数在后。4)注释:指令功能的解释说明。注释必须以分号“;”开头。2汇编语言指令中的常用符号Rn:当前工作寄存器R0R7中的一个。Ri:寄存器间接寻址,常常作间接寻址的地址指针。其中Ri代表R0和R1寄存器中的一个。direct:内部数据存贮器单元的二进制数编码地址及特殊功能寄存器SFR的地址,对SFR而言,既可使用它的物理地址(即用二进制数编码的地址),也可直接使用它的名字。#date:8位立即数,即8位常数,取值范围为#00H#0FFH。#date16:16位立即数,即16位常数,取值范围为#0000H#0FFFFH。addr16:16位直接地址。addr11:11位直接地址。rel:用补码形式表示的地址偏移量,取值范围为-128+127。bit:内部RAM和SFR中的具有位寻址功能的位地址。SFR中的位地址可以直接出现在指令中,为了阅读方便,往往也可用SFR的名字和所在的数位表示。如:表示PSW中奇偶校验位,可写成D0H,也可写成PSW.0的形式出现在指令中。:间接寻址寄存器或基址寄存器的前缀符号。$:当前指令的地址。3汇编语言中的伪指令将汇编语言源程序转换为计算机所能识别的机器语言代码程序的过程称为汇编。伪指令是指在汇编时起控制作用,自身并不产生机器码,不属于MCS-51指令系统,而仅是为汇编服务的一些指令。常用的伪指令有以下几种:1)起始伪指令 ORG(Origination)格式:ORG addr16功能:规定它下面的程序的起始地址。也就是在汇编时将它下面的程序翻译成机器码时,这些机器码在程序存储器中存放的起始地址为ORG指令指定的16位地址。例如:ORG 0000H2)结束伪指令 END格式:END 功能:汇编语言源程序的结束标志。在END后面的指令,汇编时将不再处理。3)等值伪指令 EQU(Equate)格式:字符名称 EQU 数据或汇编符号功能:将一个数据或特定的汇编符号赋予规定的字符名称。例:PP EQU R0;这里将PP等值为汇编符号R0,在指令中就可以用PP代替R0来使用。MOV A,PP4)数据地址赋值伪指令 DATA格式:字符名称 DATA 表达式功能:将数据地址或代码地址赋予规定的字符名称。例:5)定义字节伪指令DB(Define Byte)格式:DB 8位二进制数表功能:从指定的地址单元开始,定义若干个8位内存单元的数据。数据与数据之间用“,”分割。例:TAB:DB 73H,45,”A”6)定义字伪指令DW(Define Word)格式:DW 16位二进制数表功能:从指定的地址单元开始,定义若干个16位数据。例:TABH:DW 7365H,307)定义位地址伪指令BIT格式:字符名称 BIT 位地址功能:将位地址赋予所规定的字符名称。例:AQ BIT P0.0一般在给单片机引脚进行定义时,为了让各个引脚的名称和作用一目了然,往往会用比较易于记忆和理解的名称来定义对应的引脚。4. 汇编语言程序基本格式单片机的最小软件系统,也称为程序的一般结构。下面是满足最小软件系统要求的一个典型例子:ORG 0000H ;汇编程序开头LJMP SETUP ;跳过中断入口地址 ;中断入口地址区ORG 0030HSETUP: ;初始化区MAIN: ;主程序区LJMP MAIN ;主程序循环执行 ;子程序和中断服务程序区END ;程序结束汇编语言程序的从结构上分为6个部分:汇编程序开头、中断入口地址区、初始化区、主程序区、子程序和中断服务程序区以及程序结束。在我们编写程序时,只要将有关的程序嵌入到相应的区域即可。(1)汇编程序开头一般程序都是以起始伪指令ORG 0000H开头,后面跟一条LJMP长跳转指令,跳过中断入口地址区(0003H002BH)。而起始伪指令ORG 0030H表示下面的指令将从内ROM的0030H单元开始存放。(2)中断入口地址区0003H002BH这段存储空间分散地被5个中断源的中断入口地址占用,在这个区域里一般不放程序,只是放相关的跳转指令,以提供中断入口地址。该知识在后面项目中将会详细介绍。(3)初始化区初始化区的程序内容包括系统开始运行的初始参数设置。如果系统中用到中断资源,则对有关中断源的控制寄存器的设置也要在该区域完成。(4)主程序区主程序是单片机应用程序的核心,主程序区里的内容往往是CPU需要不断反复处理的任务,最常用的就是显示程序和键盘程序。(4)子程序和中断服务程序区子程序是供主程序调用的部分,通常放在主程序的后面(即程序一般结构中的子程序和中断服务程序区)。二 数据传送类指令与顺序程序设计1内部RAM的数据传送类指令(15条)数据传送类指令的指令格式为:MOV 目的字节,源字节该指令功能是将源字节的内容传送到目的字节,传送过程具有复制性质,即源字节的内容不变。1)以累加器A为目的字节的传送指令(4条)MOV A,#data ;#dataA MOV A,direct ;(direct)A MOV A,Rn ;RnAMOV A,Ri ;(Ri)A【例C-1】若R0=20H,(30H)=60H,(20H)=50H,将执行下列指令后累加器A中的内容写在注释区。MOV A,R0;A=20HMOV A,R0;A=50HMOV A,30H;A=60HMOV A,#30H;A=30H2)以寄存器Rn为目的字节的传送指令(3条)MOV Rn,direct;(direct)RnMOV Rn,#data;#dataRnMOV Rn,A;ARn这3条指令的功能是把源操作数所指定的内容送到所选定的工作寄存器Rn中。需要注意的是,工作寄存器之间没有直接传送的指令,若要传送,则需要通过一个中间寄存器如累加器A作缓冲。【例C-2】试将R1中的数据传送到R0。指令实现如下:MOV A,R1;R1AMOV R0,A;AR03)以直接地址为目的字节的传送指令(5条) 这组指令的功能是把源操作数指定的内容送到由直接地址direct所选定的片内RAM中。MOV direct,#data ;#data(direct) MOV direct2,direct1;(direct1)(direct2)MOV direct,A;A(direct)MOV direct,Rn;Rn(direct) MOV direct,Ri;(Ri)(direct) 4)以间接地址为目的字节的传送指令(3条)这组指令的功能是把源操作数指定的内容送到以Ri中的内容为地址的片内RAM中。MOV Ri,#data;#data(Ri)MOV Ri,direct;(direct)(Ri)MOV Ri,A;A(Ri) 【例C-3】 设内RAM(30H)=60H,分析以下程序连续运行的结果。MOV 60H,#30H;将立即数30H送到直接地址60H单元内MOV R0,#60H;将立即数60H送到寄存器R0中MOV A,R0;将以R0内数据为地址的单元的内容送给累加器AMOV R1,A;将累加器A中的内容送到寄存器R1中MOV 40H,R1;将以R0内数据为地址的单元的内容送到40H单元中MOV 60H, 30H;将30H单元中的内容送到60H单元中运行结果:A=30H,R0=60H,R1=30H,(60H)=60H,(40H)=60H,(30H)=60H。216位数据传送指令(1条)MOV DPTR,#data16 ;data16DPTR51系列单片机的指令系统中仅此一条16位的数据传送指令,其功能是把16位的立即数送入数据指针寄存器DPTR。其中16位常数的高8位送到DPH,低8位送到DPL。【例C-4】MOV DPTR,#3456H;DPTR=3456H,该指令也可以用两条8位数据传送指令实现:MOV DPH,#34H;DPH=34HMOV DPL,#56H ;DPL=56H3片外RAM传送指令(4条)MOVX A,DPTR;DPTRAMOVX A,Ri;(Ri)A MOVX Ri,A;A(Ri)MOVX DPTR,A;ADPTR这4条指令的作用是累加器A与片外RAM间的数据传送。前两条指令为读外部RAM,后两条指令为写外部RAM。需要注意的是:这几条指令因为是对片外RAM的数据操作,在硬件系统中没有进行外部RAM的扩展时,一般是用不到。4读ROM的指令(查表指令)(2条)MOVC A,A+DPTR;(A+DPTR)A MOVC A,A+PC;PC+1A,(A+PC)A这组指令的功能是对存放于程序存储器中的数据表格进行查找传送。也称查表指令。前一条指令的寻址范围为整个程序存储器的64KB空间,表格可以放在程序存储器的任何位置。后一条指令的寻址范围只能是该指令后256B的地址空间。三个不同的存储空间用三种不同的指令传送:内RAM(包括特殊功能寄存器):用MOV指令传送。外RAM:用MOVX指令传送。ROM:用MOVC指令传送。【例C-5】在程序存储器中从2000H单元开始依次存放置09的平方值:0、1、4、9、81,要求依据累加器A中的值(09)来查找所对应的平方值,分析下述程序的结果。MOV DPTR,#2000H;将立即数2000H送到DPTR中MOV A,#09H;将立即数09H送给累加器AMOVC A,A+DPTR;查表个中的第10个数据执行结果:(DPTR)=2000H,(A)=51H。思考:为何是第10个数据?5堆栈及其操作指令(2条)1)堆栈的概念堆栈是内部RAM中一段用来暂时存放数据的存储区,通常用来保护断点和现场。51系列的单片机通过专用的特殊工作寄存器SP-堆栈指针对其进行管理,SP始终指向堆栈顶部数据的地址,SP在单片机复位后的值是07H。堆栈中数据的操作的原则是:先进后出,后进先出。2)堆栈操作指令(2条)PUSH direct ;SP+1SP,(direct)SP POP direct ;SP(direct)SP-1SP PUSH为入栈指令,即将其指定的直接地址单元中的数据压入堆栈。由于51系列单片机的堆栈是向上生长型的堆栈,所以执行入栈指令时,堆栈指针SP要先加1,指向栈顶的一个空单元,然后再将其指定的直接地址单元中的数据压入SP指向的该单元中,如图C-1所示。例PUSH 30H;(30H)=2BH,具体操作是: 先将堆栈指针SP的内容(0FH)加1,指向堆栈顶的一个空单元,此时SP=10H; 然后将指令指定的直接寻址单元30H中的数据(2BH)送到该空单元中。图C-1 入栈操作POP为出栈指令,是将当前堆栈指针SP所指向的单元中的数据弹出到指定的内RAM单元中(即POP后面的单元中)。然后堆栈指针SP再进行减1操作,如图C-2所示。例:POP 40H ;(40H)=4CH,具体操作是:先将SP所指单元0FH(栈顶地址)中的数据(4CH)弹出,送到指定的内RAM单元40H,(40H)=4CH;然后SP-1SP,SP=0EH,SP仍指向栈顶地址。图C-2 出栈操作【例C-6】已知SP=50H,求执行下列程序后的结果。 MOV 30H,#12H;(30H)=12HMOV 31H,#34H;(31H)=34HPUSH 30H;SP+1SP , SP=51H,(30H)(51H)=12HPUSH 31H;SP+1SP , SP=52H,(31H)(52H)=34HPOP 30H;(52H)(30H)=34H,SP-1SP , SP=51HPOP 31H;(51H)(31H)=12H,SP-1SP , SP=50H程序执行结果:SP=50H ,(30H)= 34H,(31H)= 12H。6交换指令(5条)(1)字节交换指令XCH A,Rn ;ARn XCH A,Ri ;A(Ri)XCH A,direct;A(direct)。交换指令的功能是将累加器A中的数据与源字节中的数据互换。(2)半字节交换指令XCHD A,Ri;A3-0(Ri)3-0指令的功能是累加器A中数据的低4位与工作寄存器Ri间址单元中的数据的低4位互换。它们的高4位均不变。(3) 累加器A高低4位互换SWAP A;A3-0A7-4【例C-7】若要使内RAM 30H单元与40H单元的数据互换,如何实现?方法一: MOVA,30H MOV30H,40H MOV40H,A方法二: PUSH30H MOV30H,40H POP40H方法三: XCHA,30H XCHA,40H XCHA,30H7顺序程序的设计顺序程序是指按照指令的顺序依次执行的程序,又称直线程序,其结构非常简单。以下例题能帮助我们理解顺序程序的设计。【例C-8】将015共16个立即数送到内部RAM的40H开始的16个单元中。分析:题意为将0送到内部RAM的40H单元中,1送到41H单元中,以此类推,即用16条数据传送指令便可实现。程序设计如下: START:MOV 40H,#0 MOV 40H,#1 MOV 4FH,#15SJMP $;转到当前位置,即在当前位置循环。【例C-9】将内部RAM的30H开始的16个单元中的内容传送到内部RAM的60H开始的16个单元中。 START:MOV 60H,30H MOV 61H,31HMOV 6FH,3FHSJMP $三 控制转移指令与循环程序设计控制转移类指令包括无条件转移指令、条件转移指令、调用和返回指令。这类指令(除比较转移指令)一般不影响标志位。1无条件转移指令(4条)(1)长转移指令LJMP addr16; addr150PC可转移到64KB空间内的任意位置。(2)短转移指令AJMP addr11;PC+2PC,addr100PC100,PC1511不变转移范围是与PC值同一2KB,可以向前或向后,超出程序汇编时将出错。(最好不用)(3)相对转移指令SJMP rel;PC+2PC,PC+relPC转移范围是PC前后-128B+127B,也不能超出范围。SJMP $ = H:SJMP H(4) 间接转移指令(散转指令)JMP A+DPTR;A+DPTRPCLJMP、AJMP、SJMP三条无条件转移指令的区别:转移范围不一样。LJMP转移范围是64KB;AJMP转移范围是与当前PC值同一2KB;SJMP转移范围是当前PC-128B+127B。使用AJMP和SJMP指令应注意转移目标地址是否在转移范围内,若超出范围,程序将出错。指令字节不一样。LJMP是3字节指令;AJMP、SJMP是2字节指令。2条件转移指令(13条)判C转移指令、判bit转移指令、判A转移指令、减1非0转移指令和比较转移指令。满足条件则转移;不满足条件则程序顺序执行。(1)判C转移指令(2条)JC rel; PC+2PC,若Cy=1,转移;若Cy=0,则程序顺序执行JNC rel; PC+2PC,若Cy=0,转移;若Cy=1,则程序顺序执行(2)判bit转移指令(3条)JB bit,rel; PC+3PC,若(bit)=1,转移;若(bit)=0,则程序顺序执行JNB bit,rel; PC+3PC,若(bit)=0,转移;若(bit)=1,则程序顺序执行JBC bit,rel; PC+3PC,若(bit)=1,转移;且0(bit);若(bit)=0,则程序顺序执行【例C-10】设P1口上的数据为11001010B,A的内容为57H(01010111B),Cy=1,求依次执行下列指令后的结果。LOOP:JNB P1.7, LOOP1 JB Acc.0, LOOP2 LOOP1:JNC LOOP3 LOOP2:RLC A JC LOOP1 JBC P1.1, LOOP1LOOP3:SJMP $ 执行结果:P1=11001000B=C8H,A=10101111B,Cy=0。(3) 判A转移指令(2条)JZ rel ;若A=0,则PC+relPC,转移;若A0,则程序顺序执行JNZ rel ;若A0,则PC+relPC,转移;若A=0,则程序顺序执行(4)减1非0转移指令(2条)DJNZ Rn,rel ;Rn-1Rn,若Rn=0,则程序顺序执行;若Rn0,则PC+relPC,转移。DJNZ direct,rel;(direct)-1(direct),若(direct)=0,则程序顺序执行; 若(direct)0,则PC+relPC,转移。(5)比较转移指令(4条)CJNE A,direct,rel;若A=(direct),则程序顺序执行 若A(direct),则PC+relPC转移 且若A(direct),Cy=0;若A(direct),Cy=1CJNE A,#data,rel; 若A=data,则程序顺序执行 若Adata,则PC+relPC,转移 且若Adata,Cy=0;若Adata,Cy=1CJNE Rn,#data,rel;若Rn=data,则程序顺序执行 若Rndata,则PC+relPC,转移 且若Rndata,Cy=0;若Rndata,Cy=1CJNE Ri,#data,rel;若(Ri)=data,则程序顺序执行若(Ri)data,则PC+relPC,转移若(Ri)data,Cy=0;若(Ri)data,Cy=13调用和返回指令(4条)子程序是为了便于程序编写,减少那些需反复执行的程序占用多余的地址空间而引入的程序分支,从而有了主程序和子程序的概念。在编程过程中,需要反复执行的一些程序段,我们在编程时一般都把它们编写成子程序,当需要用它们时,就用一个调用命令使程序按调用的地址去执行,这就需要子程序的调用指令和返回指令。(1)长调用指令LCALL addr16 ;PC+3PC,SP+1SP,(PC)07(SP) SP+1SP,(PC)815(SP),addr16PCLCALL指令执行步骤:产生当前PC:PC+3PC,( PC+3是因为该指令为三字节指令 )断口地址低8位保存到堆栈中:SP+1SP,(PC)07(SP)断口地址高8位保存到堆栈中:SP+1SP,(PC)815(SP) 形成转移目标地址:addr16PC(2)短调用指令ACALL addr11; PC+2PC,SP+1SP,(PC)07(SP) SP+1SP,(PC)815(SP)addr010PC010 ,PC1115不变 ACALL指令执行步骤:产生当前PC:PC+2PC,( PC+2是因为该指令为双字节指令 )断口地址低8位保存到堆栈中:SP+1SP,(PC)07(SP)断口地址高8位保存到堆栈中:SP+1SP,(PC)815(SP) 形成转移目标地址:addr11PC010,PC1115不变 (3)返回指令返回指令有子程序返回和中断返回两种: RET ;子程序返回 RETI ;中断返回4空操作指令(1条)NOP ;PC+1PCNOP为单机周指令,在时间上占用一个机器周期,常用于时间“微调”。A7 A0A7 A0A7 A0CyA7 A0Cy5循环移位指令(4条)RL A ;循环左移RR A ;循环右移RLC A ;带进位位的循环左移RRC A ;带进位位的循环右移图C-3 四种循环移位指令的示意图如图C-3所示,为四种移位指令的示意图,前两种移位方式不带Cy单元的值,直接就是累加器A的8位数据首尾循环移位,只不过移动的方向一个向左,一个向右。而后两种移位方式则是将Cy单元的值也加入进行循环移位的,即一共有9位数据进行循环。这样在移位之前可以将Cy单元中存入需要的数据,增加移位指令的灵活性。6清零与取反指令(2条)CLR A ;对累加器A清零CPL A ;将累加器中的内容按位取反,如11101101B按位取反后为00010010B注:清零和取反指令只能对A操作。如果要对内部RAM的某个单元清零,只能用数据传送指令,如MOV 30H,#07循环程序的结构及设计在许多实际应用中,往往需要多次反复执行某种相同的操作,而只是参与操作的操作数不同,这时就可采用循环程序结构。循环程序可以缩短程序,减少程序所占的内存空间。循环程序一般包括以下几个部分:(1)循环初值。(2)循环体。循环程序中需要重复执行的部分。(3)循环修改。每执行一次循环,要对有关参数进行修改,为下一次循环做准备。(4)循环控制。在程序中还须根据循环计数器的值或其他条件,来控制是否退出循环。以上四部分可以有两种组织形式,其结构如图C-4所示。【例C-11】编写延时10ms子程序,fosc=12MHz。 解:fosc=12MHz,一个机器周期为1ms。DY10ms:MOV R6,#20;置外循环次数DLP1:MOV R7,#250;置内循环次数DLP2:DJNZ R7,DLP2;2机周250 =500机周DJNZ R6,DLP1;500机周20= 10000机周RET;说明:MOV Rn指令为1个机器周期;DJNZ指令为2个机器周期;RET指令为2个机器周期;(2机周250)+1+220+1+21ms/机周=10063ms10ms图C-4 循环程序的结构【例C-12】试编程将内RAM 30H3FH共16个连续单元清零。解:编程如下:START:MOV R0,#30H;置清零区首址MOV R2,#16;置数据长度CLR ALOOP:MOV R0,A ;清零 INC R0 ;修改间址DJNZ R2,LOOP ;判清零循环SJMP $思考:若采用CJNE指令有又该如何编程?8、分支程序根据不同条件转向不同的处理程序,这种结构的程序称为分支程序。51系列指令系统中的条件转移指令、比较转移指令判位转移指令,可以实现分支程序。如图C-5所示为常用的分支程序结构,其中条件判断可以直接用条件转移指令完成,当然各条件之间也不一定就是如图中的平行关系,也可以是先后递进的关系。图C-5 分支程序的结构四 逻辑运算指令逻辑运算和移位指令共有25条,有与、或、异或、求反、左右移位、清0等逻辑操作。这类指令一般不影响程序状态字(PSW)标志。1、逻辑“与”操作指令(6条)这组指令的作用是将两个单元中的内容执行逻辑与操作。即两个操作数按位相与,结果送到源操作数中。只有前4条指令会影响PSW中的奇偶标志位P。后2两条指令常用作对I/O口的操作,用于修改口的状态。两个二进制数相“与”,运算结果是“有0出0,全1出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)data(direct)ANL direct,A;(direct)A(direct)2、逻辑“或”操作指令(6条)这组指令的作用是将两个单元中的内容执行逻辑或操作。即两个操作数按位相或,结果送到源操作数中。只有前4条指令会影响PSW中的奇偶标志位P。两个二进制数相“或”,运算结果是“有1出1,全0出0”。ORL A,#data; AdataA。ORL A,Rn; ARnA。ORL A,direct; Adirect )A。ORL A,Ri; A(Ri)A。ORL direct,#data;(direct) data(direct)ORL direct,A;(direct) A(direct)3、逻辑“异或”操作指令(6条)这组指令的作用是将两个单元中的内容执行逻辑异或操作。即两个操作数按位相异或,结果送到源操作数中。只有前4条指令会影响PSW中的奇偶标志位P。两个二进制数相“异或”,运算结果是“相同出0,相异出1”。XRL A,#data; AdataAXRL A,Rn; ARnAXRL A,direct; Adirect )AXRL A,Ri; A(Ri)AXRL direct,#data;(direct) data(direct)XRL direct,A;(direct) A(direct)【例C-13】 已知A=11010101B,分别执行下面的三条指令,ANL A, #10110001B;A=10010001BORL A, #10110001B;A=11110101BXRL A, #10110001B;A=01100100B4、位逻辑操作指令(4条)(1)位逻辑“与”操作指令 ANL C,bit ;C(bit)CANL C,/bit ;C(/bit)C(2)位逻辑“或”操作指令ORL C,bit ;C(bit)C ORL C,/bit ;C(/bit)C【例C-14】 已知C=1,bit位为00H单元,其存放的据为数0,请分析以下指令的运行结果。ANL C,00H;数据1和数据0相与,结果为0,即C=0ANL C,/00H;数据1和数据1相与,结果为1,即C=1ORL C,00H;数据1和数据0相或,结果为1,即C=1ORL C,/00H;数据1和数据1相或,结果为1,即C=1五 算术运算指令MCS-51单片机算术运算指令共有24条,算术运算主要是执行加、减、乘、除法四则运算。另外MCS-51指令系统中有相当一部分是进行加、减1操作,BCD码的运算和调整,我们都归类为运算指令。需要指出的是,除加、减1指令外,这类指令大多数都会对PSW(程序状态字)有影响。这在使用中应特别注意。1、加法指令(8条)(1)不带进位的加法指令(4条)这4条指令的作用是把立即数,直接地址、工作寄存器及间接地址内容与累加器A的内容相加,运算结果存在A中。ADD A,#data;A+dataA,最高位有进位时,Cy=1,否则Cy=0ADD A,direct;A+directA,最高位有进位时,Cy=1,否则Cy=0ADD A,Rn;A+RnA ,最高位有进位时,Cy=1,否则Cy=0ADD A,Ri;A+(Ri)A,最高位有进位时,Cy=1,否则Cy=0(2)带进位的加法指令(4条)这4条指令除与(1)功能相同外,在进行加法运算时还需考虑进位位的值。ADDC A,#data;A+data+Cy A,最高位有进位时,Cy=1,否则Cy=0ADDC A,direct;A+(direct)+CyA,最高位有进位时,Cy=1,否则Cy=0ADDC A,Rn;A+Rn+ CyA ,最高位有进位时,Cy=1,否则Cy=0ADDC A,Ri;A+(Ri)+ CyA,最高位有进位时,Cy=1,否则Cy=0【例C-15】两个双字节的无符号数,分别存放在R0R1和R2R3中(高位在前),试编写程序求它们的和,结果存放在R6R4R5中。分析:多字节数相加运算,应预先分析结果可能占用的空间,分配足够的单元存放,题中两个16位的无符号数相加,和可能会超过16位,就需要3个字节。设计程序如下:START:MOV A,R1;取一个加数的低8位ADD A,R3;与另外一个数的低8位相加MOV R5,A;存低8位的和MOV A,R0;取一个加数的高8位ADDC A,R2;高8位相加,并加低8位相加时的CyMOV R4,A;存高8位的和CLR A;A清0ADDC A,#0;0+0+Cy A,取出高8位相加时的CyMOV R6,A;存进位RET2、减法指令(4条)这组指令包含立即数、直接地址、间接地址及工作寄存器与累加器A连同借位位Cy内容相减,结果送回累加器A中。这里我们对借位位Cy的状态作出说明,在进行减法运算中,Cy =1表示有借位,Cy=0则无借位。OV=1声明带符号数相减时,从一个正数减去一个负数结果为负数,或者从一个负数中减去一个正数结果为正数的错误情况。由于减法指令在执行时都会带进位位Cy一起减,因此在进行第一次减法运算时,必须保证此时的Cy=0,否则运算结果会出错.SUBB A,#data;A-data - CyASUBB A,direct;A-direct - CyASUBB A,Rn;A-Rn- CyA SUBB A,Ri;A-(Ri)- CyA 【例C-16】两个双字节的无符号数,被减数存放在R1R0

温馨提示

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

评论

0/150

提交评论