单片机汇编语言ASM_第1页
单片机汇编语言ASM_第2页
单片机汇编语言ASM_第3页
单片机汇编语言ASM_第4页
单片机汇编语言ASM_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

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

文档简介

§3.1概述7种寻址方式,111条指令字节数运算速度单字节指令:49条双字节指令:45条三字节指令:17条单周期指令:64条双周期指令:45条四周期指令:2条第三章MCS-51指令系统

InstructionSet7/20/20231功能数据传送类:29条算术运算类:24条逻辑运算类:24条控制转移类:17条位操作类:17条7/20/20232常用符号Rn:工作寄存器中的寄存器R0、R1…R7之一,Ri:工作寄存器中的寄存器R0或R1#data:8位立即数#data16:16位立即数direct:片内RAM或SFR的地址(8位)@间接寻址寄存器Bit:片内RAM或SFR的位地址addr11:11位目的地址addr16:16位目的地址7/20/20233rel:补码形式的8位地址偏移量。偏移范围为-128~127/:位操作指令中,该位求反后参与操作,不影响该位X:片内RAM的直接地址或寄存器(X):相应地址单元中的内容→:箭头左边的内容送入箭头右边的单元内7/20/20234§3.2寻址方式3.2.1立即寻址ImmediateAddressing操作数就包含在指令代码中,在操作码之后,称为立即数,用“#”表示。

MCS-51如:MOVP1,#80HMOVR7,#0F5HMOVDPTR,#1245H操作数存在程序存储器中7/20/202353.2.2直接寻址

DirectAddressing直接使用数所在单元的地址找到了操作数,所以称这种方法为直接寻址。操作数在SFR、内部RAM、位地址空间。如:MOVA,00H

MOVC,60H

MOVA,0F0H7/20/202363.2.3寄存器寻址RegisterAddressing对选定的工作寄存器R0~R7、累加器A、通用寄存器B、地址寄存器DPTR中的数进行操作。

例:MOVA,R0;将R0工作寄存器中的数据送到累加器A中去。提一个问题:我们知道,工作寄存器就是内存单元的一部分,如果我们选择工作寄存器组0,则R0就是RAM的00H单元,那么这样一来,MOVA,00H和MOVA,R0不就没什么区别了吗?7/20/20237的确,这两条指令执行的结果是完全相同的,都是将00H单元中的内容送到A中去,但是执行的过程不同,执行第一条指令需要2个机器周期,而第二条则只需要1个机器周期,第一条指令变成最终的目标码要两个字节(E5H00H),而第二条则只要一个字节(E8H)就可以了。7/20/202383.2.4寄存器间接寻址Register

IndirectAddressing把地址放在另外一个寄存器中,根据这个寄存器中的数值决定该到哪个单元中取数据。R0,R1----8位地址,片内低128字节或片外DPTR----16位,片外64KB

MCS-51如: MOVA,@R0 MOVXA,@R0 MOVXA,@DPTR操作数在片内RAM中操作数在片外RAM中操作数在片外RAM中7/20/20239以DPTR或PC为基址寄存器,累加器A为变址寄存器。把两者内容相加,结果作为操作数的地址。常用于查表操作。

MCS-51

MOVCA,@A+DPTR

;(A+DPTR)→A

MOVCA,@A+PC

;PC+1→PC,(A+PC)→A3.2.5变址寻址(基址+变址)Base-Register-plus-Index-Register-IndirectAddressing操作数在程序存储器中7/20/202310E0A程序存储区2040H9320E0H472041H………DPH20DPL00ALU如:MOVCA,@A+DPTR设DPTR=2000H,A=E0H20E0H47指令代码7/20/2023113.2.6相对寻址将PC中的当前内容与指令第二字节给出的数相加,结果作为跳转指令的转移地址(转移目的地址)。PC中的当前内容称为基地址(本指令后的字节地址)指令第二字节给出的数据称为偏移量,1字节带符号数.常用于跳转指令。如:JC23H若C=0,不跳转;C=1,跳转.RelativeAddressing改变PC7/20/202312程序存储区ALU如:JC231025H1000H401025H451001H

23……1024H471002H3023H1002H指令代码当前PC7/20/202313

对片内RAM的位寻址区和某些可位寻址的特殊功能寄存器进行位操作时的寻址方式。如:SETB3DH;将27H.5位置1 CLRC;Cy位清03.2.7位寻址BitAddressing操作数在片内RAM位地址区或SFR某些位中7/20/202314寻址方式涉及的存储器空间寻址方式寻址空间(操作数存放空间)立即寻址程序存储器直接寻址片内RAM低128字节、SFR寄存器寻址工作寄存器R0~R7,A,B,DPTR寄存器间接寻址片内RAM:@R0,@R1,SP片外RAM:@R0,@R1,@DPTR变址寻址程序存储器:@A+PC,@A+DPTR相对寻址程序存储器256字节范围内:PC+偏移量位寻址片内RAM的位寻址区(20H~2FH字节地址)某些可位寻址的SFR7/20/202315§3.3数据传送类指令(29条)

DataTransferInstructionMCS-51助记符:助记符:MOV、MOVX、MOVC

XCH、XCHD、SWAP

PUSH、POP

源操作数寻址方式(5种):立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、变址寻址。目的操作数寻址方式(3种):直接寻址、寄存器寻址、寄存器间接寻址

除了目的操作数为ACC的指令影响奇偶标志P外,一般不影响标志位。7/20/2023163.3.1十六位数的传递指令(1条) MOVDPTR,#data168051是一种8位机,这是唯一的一条16位立即数传递指令。功能:将一个16位的立即数送入DPTR中去。其中高8位送入DPH,低8位送入DPL。

例:MOVDPTR,#1234H执行完了之后DPH中的值为12H,DPL中的值为34H。如果我们分别向DPH,DPL送数,则结果也一样。如下面两条指令:MOVDPH,#35H MOVDPL,#12H。则就相当于执行了MOVDPTR,#3512H。7/20/2023173.3.2累加器A与片外RAM之间的数据传递类指令(4条)

MOVX

A,@Ri

MOVX

@Ri,A

MOVX

A,@DPTR

MOVX

@DPTR,A说明:1.在51中,与外部存储器RAM打交道的只可以是A累加器。所有需要送入外部RAM的数据必需要通过A送去,而所有要读入的外部RAM中的数据也必需通过A读入。在此我们可以看出内外部RAM的区别了,内部RAM间可以直接进行数据的传递,而外部则不行。比如,要将外部RAM中某一单元(设为0100H单元的数据)送入另一个单元(设为0200H单元),也必须先将0100H单元中的内容读入A,然后再送到0200H单元中去。7/20/2023182.要读或写外部的RAM,当然也必须要知道RAM的地址,在后两条指令中,地址是被直接放在DPTR中的。而前两条指令,由于Ri(即R0或R1)只是8位的寄存器,所以只提供低8位地址。高8位地址由P2口来提供。3.使用时应先将要读或写的地址送入DPTR或Ri中,然后再用读写命令。

例:将外部RAM中100H单元中的内容送入外部RAM中200H单元中。 MOVDPTR,#0100H MOVXA,@DPTR MOVDPTR,#0200H MOVX@DPTR,A7/20/2023193.3.3读程序存储器指令(2条)MOVCA,@A+DPTRMOVCA,@A+PC本组指令是将ROM中的数送入A中。本组指令也被称为查表指令,常用此指令来查一个已做好在ROM中的表格说明:查找到的结果被放在A中,因此,本条指令执行前后,A中的值不一定相同。例:有一个数在R0中,要求用查表的方法确定它的平方值(此数的取值范围是0-5) MOVDPTR,#100H MOVA,R0 MOVCA,@A+DPTR .…

ORG0100H DB0,1,4,9,16,25如果R0中的值为2,则最终地址为100H+2为102H,到102H单元中找到的是4。7/20/2023203.3.4堆栈操作(2条)

PUSHdirect;SPSP+1,(SP)(direct)

POPdirect;(direct)(SP),SPSP-1第一条为压入指令,就是将direct中的内容送入堆栈中,第二条为弹出指令,就是将堆栈中的内容送回到direct中。例: MOVSP,#5FH MOVA,#100 MOVB,#20

PUSHACC PUSHB

则执行第一条PUSHACC指令是这样的:将SP中的值加1,即变为60H,然后将A中的值送到60H单元中,因此执行完本条指令后,内存60H单元的值就是100,同样,执行PUSHB时,是将SP+1,即变为61H,然后将B中的值送入到61H单元中,即执行完本条指令后,61H单元中的值变为20。7/20/2023211.给出每条指令执行后的结果MOV23H,#30HMOV12H,#34HMOVR0,#23HMOVR7,12HMOVR1,#12HMOVA,@R0MOV34H,@R1MOV45H,34HMOVDPTR,#6712HMOV12H,DPHMOVR0,DPLMOVA,@R0;(23H)=30H;(12H)=34H;R0=23HXXXXXXXXXXXXXXXXXXDPHDPL45H34H23H12HR7R1R0XXXXXXXX3034XXXX23XXXXXXXX3034341223671234343034341223671234343067341212;R7=34H;R1=12H;A=30H;(34H)=34H;(45H)=34H;DPTR=6712H;(12H)=67H;R0=12H;A=67H内部RAM7/20/202322§3.4算术运算类指令(24条)

ArithmeticOperations

主要对8位无符号数;也可用于带符号数运算。包括:加、减、乘、除、加1、减1运算指令影响PSW有关位。7/20/2023233.4.1

加法指令

ADDA,#data ;A+data→A

ADDA,direct ;A+(direct)→A

ADDA,Rn ;A+Rn→A

ADDA,@Ri ;A+(Ri)→A用途:将A中的值与源操作数所指内容相加,最终结果存在A中。1.不带进位位的加法指令(4条)7/20/2023242.带进位位的加法指令(4条)

ADDCA,Rn ;A+Rn+CY→A

ADDCA,direct ;A+(direct)+CY→A

ADDCA,@Ri ;A+(Ri)+CY→A

ADDCA,#data ;A+data+CY→A用途:将A中的值和其后面的值以及进位位C中的值相加,最终结果存在A,常用于多字节数运算中。说明:由于51单片机是一种8位机,所以只能做8位的数学运算,但8位运算的范围只有0~255,这在实际工作中是不够的,因此就要进行扩展,一般是将2个8位(两字节)的数学运算合起来,成为一个16位的运算,这样,可以表达的数的范围就可以达到0~65535。7/20/202325例:先做67H+A0H=107H,而107H显然超过了0FFH,因此最终保存在A中的是07H,而1则到了PSW中的CY位了。换言之,CY就相当于是100H。然后再做10H+30H+CY,结果是41H,所以最终的结果是4107H。1067H+30A0H0001000001100111001100001010000001000001000001111067H30A0H4107H7/20/202326设:1067H存在R1R0中,30A0H存在R3R2中,计算R1R0+R3R2,结果存在R5R4中。MOVA,R0ADDA,R2;R0+R2→A和CYMOVR4,AMOVA,R1ADDCA,R3;R1+R3+CY→A和CYMOVR5,A7/20/202327又例:先做67H+20H=87H,没有超过0FFH,因此最终保存在A中的是87H,而PSW中的CY=0。然后再做10H+30H+CY,结果是40H,所以最终的结果是4087H。1067H+3020H0001000001100111001100000010000001000000100001111067H3020H4087H7/20/202328DAA在进行BCD码加法运算时,跟在ADD和ADDC指令之后,用于对累加器A中刚进行的两个BCD码的加法的结果进行十进制调整。例:A=00010101BCD(代表十进制数15)ADDA,#83.十进制调整指令(1条);A=1DH,按二进制规律加;A=23H,按十进制规律加DAA7/20/202329

调整要完成的任务是:(1)当累加器A中的低4位数出现了非BCD码(1010~1111)或低4位产生进位(AC=1),则应在低4位加6调整,以产生低4位正确的BCD结果。(2)当累加器A中的高4位数出现了非BCD码(1010~1111)或高4位产生进位(CY=1),则应在高4位加6调整,以产生高4位正确的BCD结果。

十进制调整指令执行后,PSW中的CY表示结果的百位值。7/20/202330例若(A)=01010110B,表示的BCD码为56,(R3)=01100111B,表示的BCD码为67,(CY)=0。执行以下指令:ADDA,R2DAA由于(A)=00100011B,即,且(CY)=1,即结果为BCD数123。应该注意,DA指令不能对减法进行十进制调整。7/20/2023313.4.2减法指令(8条)SUBBA,Rn ;A-Rn-CY→ASUBBA,direct;A-(direct)-CY→ASUBBA,@Ri ;A-(Ri)-CY→ASUBBA,#data ;A-data-CY→A将A中的值减去源操作数所指内容以及进位位C中的值,最终结果存在A中。如:

SUBBA,R2设:A=C9H,R2=55H,CY=1,执行指令之后,A中的值为73H。1.带借位的减法指令(4条)7/20/202332说明:没有不带借位的减法指令,如果需要做不带位的减法指令(在做第一次相减时),只要将CY清零即可。对带符号数,要注意OV标志。OV=1,出错。7/20/202333§3.5逻辑运算类指令(24条)主要用于对2个操作数按位进行逻辑操作,结果送到A或直接寻址单元。

主要操作与、或、异或、移位、取反、清零等。

对标志位的影响除了目的操作数为ACC的指令影响奇偶标志P外,一般不影响标志位。LogicOperations7/20/2023343.5.1逻辑或指令(6条)ORLA,Rn ;A∨Rn→AORLA,direct ;A∨(direct)→AORLA,@Ri ;A∨(Ri)→AORLA,#data ;A∨data→AORLdirect,A ;(direct)∨A→(direct)ORLdirect,#data;(direct)∨data→(direct)影响P标志例:71H和56H相或:

01110001(71H) ∨)01010110(56H)01110111即77H后两条指令,若直接地址为I/O端口,则为“读-改写”操作。

OR

LogicInstruction7/20/2023353.5.2逻辑与指令(6条)ANLA,Rn ;A∧Rn→AANLA,direct ;A∧(direct)→AANLA,@Ri ;A∧(Ri)→AANLA,#data;A∧data→AANLdirect,A ;(direct)∧A→(direct)ANLdirect,#data;(direct)∧data→(direct)影响P标志例:71H和56H相与: 01110001(71H) ∧)01010110(56H)01010000即50H后两条指令,若直接地址为I/O端口,则为“读-改写”操作。

ANdLogicInstruction7/20/202336例:71H和56H相异或: 01110001(71H)

⊕)01010110(56H)

3.5.2逻辑异或指令(6条)XRLA,Rn ;A⊕Rn→AXRLA,direct ;A⊕(direct)→AXRLA,@Ri ;A⊕(Ri)→AXRLA,#data ;A⊕data→AXRLdirect,A ;(direct)⊕A→(direct)XRLdirect,#data;(direct)⊕data→(direct)影响P标志00100111即27H后两条指令,若直接地址为I/O端口,则为“读-改写”操作。

eXclusive-oR

LogicInstruction7/20/2023373.5.3清0与取反指令(2条)取反:CPLA;/A→A例:若A=5CH,执行CPLA结果:A=A3H清0:CLRA ;0→AComPlementLogicOperation7/20/2023383.5.4循环移位指令(4条)RLA

RRARLCARRCAA.7 A.0A.7 A.0A.7 A.0CYCYA.7 A.0后两条指令,影响P标志和CY。

RotateLogicinstruction7/20/202339例:若A=5CH,CY=1,执行RLCA后,对RLC、RRC指令,在CY=0时

RLC相当于乘以2 RRC相当于除以2结果:A=B9H,CY=0,P=10101110011011100107/20/202340§3.6

控制转移类指令(17条)

BranchingInstruction共有控制程序转移类指令(不包括位操作类的转移指令)。此类指令一般不影响PSW。包括以下类型:无条件转移和条件转移相对转移和绝对转移长转移和短转移调用与返回指令7/20/2023413.6.1

无条件转移类指令(4条)短转移类指令:AJMPaddr11

长转移类指令:LJMPaddr16

相对转移指令:SJMPrel

间接转移指令:JMP@A+DPTR(1)上面的前三条指令,统统理解成:PC值改变,即跳转到一个标号处。那么他们的区别何在呢?7/20/202342跳转的范围不同。短转移类指令:AJMPaddr11

长转移类指令:LJMPaddr16

相对转移指令:SJMPrel转移范围:2KB64KB-128~+127指令构成不同。

AJMP、LJMP后跟的是绝对地址,而SJMP后跟的是相对地址。

指令长度不同原则上,所有用SJMP或AJMP的地方都可以用

LJMP来替代。7/20/202343间接转移指令:JMP@A+DPTR这条指令的用途也是跳转,转到什么地方去呢?这可不能由标号简单地决定了。转移地址由A+DPTR形成,并直接送入PC。指令对A、DPTR和标志位均无影响。本指令可代替众多的判别跳转指令,又称为散转指令,多用于多分支程序结构中。(2)第四条指令与前三条指令相比有所不同7/20/202344例:MOVDPTR,#TAB;将TAB代表的地址送入DPTRJMP@A+DPTR;跳转TAB:AJMPROUT0;跳转ROUT0开始的程序段TAB+2:AJMPROUT1;跳转ROUT1开始的程序段TAB+4:

AJMPROUT2;跳转ROUT2开始的程序段TAB+6:

AJMPROUT3;跳转ROUT3开始的程序段...ROUT0:...ROUT1:...ROUT2:...ROUT3:执行该段程序后,程序将根据A中的内容转移到不同的程序段去执行----散转。A=0,转ROUT0A=2,转ROUT1A=4,转ROUT2A=6,转ROUT37/20/2023453.6.2条件转移指令(8条)条件转移指令是指在满足一定条件时进行相对转移,否则程序继续执行本指令的下一条指令。一、判A内容是否为0转移指令(2条)

JZrel;如果A=0,则转移,否则顺序执行。JNZ

rel;如果A≠0,就转移。转移到相对于当前PC值的8位移量的地址去。即:

新的PC值=当前PC+偏移量rel我们在编写汇编语言源程序时,可以直接写成:JZ

标号 ;即转移到标号处。7/20/202346例:MOVA,R0

JZL1MOVR1,#00HAJMPL2L1:MOVR1,#0FFH

L2:SJMPL2END在执行上面这段程序前:如果R0=0,结果R1=0FFH。而如果R00,则结果是R1=00H。把上面的那个例子中的JZ改成JNZ,看看程序执行的结果是什么?如果R0=0,结果R1=00H。如果R00,结果是R1中的值为0FFH。7/20/202347二、比较不等转移指令(4条)CJNEA,#data,rel

CJNEA,direct,relCJNERn,#data,relCJNE@Ri,#data,rel此类指令的功能是将两个操作数比较,如果两者相等,就顺序执行,如果不相等,就转移。同样地,使用时,我们可以将rel理解成标号,即: CJNEA,#data,标号 CJNEA,direct,标号 CJNERn,#data,标号 CJNE@Ri,#data,标号7/20/202348利用这些指令,可以判断两数是否相等。但有时还想得知两数比较之后哪个大,哪个小,本条指令也具有这样的功能:如果两数不相等,则CPU还会用CY(进位位)来反映哪个数大,哪个数小。如果前面的数大,则CY=0,否则CY=1。因此在程序转移后再次利用CY就可判断出哪个数大,哪个数小了。7/20/202349举例: MOVA,R0CJNEA,#10H,L1MOVR1,#0;如R0=10H,则不转移R1=00H; AJMPL3L1:JCL2 ;如CY=1即R0<10H,则转移 MOVR1,#0AAH;否则CY=0即R0>10H,则转移 AJMPL3L2:MOVR1,#0FFHL3:SJMPL3因此最终结果是:本程序执行前,如果R0=10H,则R1=00H;如果R0>10H,则R1=0AAH;如果R0<10H,则R1=0FFH。7/20/202350三、减1不为0转移指令(2条)DJNZRn,relDJNZdirect,relDJNZ指令的执行过程是这样的:它将第一个参数中的值减1,然后看这个值是否等于0,如果等于0,就往下执行,如果不等于0,就转移到第二个参数所指定的地方去。例:DJNZ10H,LOOP...LOOP:...7/20/202351例:MOV23H,#0AHCLRALOOP:ADDA,23HDJNZ23H,LOOPSJMP$上述程序段的执行过程是:将23H单元中的数连续相加,存至A中,每加一次,23H单元中的数值减1,直至减到0,共加(23H)次。7/20/2023523.6.3调用与返回指令(4条)一、调用指令(2条)

LCALLaddr16

;长调用指令(3字节)

ACALLaddr11

;短调用指令(2字节)上面两条指令都是在主程序中调用子程序,两者的区别:对短调用指令,被调用子程序入口地址必须与调用指令的下一条指令的第一字节在相同的2KB存储区之内。使用时可以用:

LCALL

标号;标号表示子程序首地址ACALL

标号

来调用子程序。7/20/202353指令的执行过程是:当前PC压栈,子程序首地址送PC,实现转移。二、返回指令

(2条)子程序执行完后必须回到主程序,如何返回呢?只要执行一条返回指令就可以了。RET ;子程序返回指令RETI ;中断子程序返回指令两者不能互换使用。7/20/2023543.6.4空操作指令(1条)

NOP空操作,就是什么事也不干,停一个周期,一般用作短时间的延时。RET指令的执行过程是:堆栈栈顶内容(2字节,调用时保存的当前PC值)弹出给PC,实现返回。RETI指令除了具有RET指令的功能实现程序返回外,还有对中断优先级状态触发器的清零。7/20/202355§3.7位操作指令(17条)BooleanOperationsMCS-51单片机的硬件结构中,有一个位处理器(又称布尔处理器),它有一套位变量处理的指令集,包括位变量传送、逻辑运算、控制程序转移等。在MCS-51中,有一部份RAM和一部份SFR是具有位寻址功能的。位操作区:内部RAM的20H-2FH这16个字节单元,即128个位单元(位地址空间位00~7FH);可以位寻址的特殊功能寄存器:

温馨提示

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

评论

0/150

提交评论