《单片机第4章8051单片机指令系统.ppt》由会员分享,可在线阅读,更多相关《单片机第4章8051单片机指令系统.ppt(126页珍藏版)》请在课桌文档上搜索。
1、第4章 8051单片机指令系统,寻址方式及常用符号注释,指令格式,知识点:,单片机系统,单片机系统:由硬件系统和软件系统组成,硬件是基础。第二章已介绍,软件是在硬件的基础上对其资源进行合理调配和使用,从而完成应用系统所要求的任务,二者相互依赖,缺一不可。(本章着重介绍),805l单片机指令系统简介,指令是软件的基础(如同盖房子的砖和瓦),计算机能够识别的一种命令称作指令(相当于汉语中汉字),同种计算机的指令的集合称为指令系统(相当于汉语的新华字典),定义一种任务的指令的集合称为程序(相当于一篇文章),8051单片机共有111条指令,单字节指令(49条)单字节指令格式由8位二进制编码表示,例如:
2、CLR A该指令以E4H存放在内存中,占1个字节,双字节指令(45条)双字节指令格式由两个字节组成,操作码和操作数,例如:MOV A,10H 该指令以74H 10H顺序存放在内存,占2字节,A,CLR A,MOV A,10H,A,三字节指令(17条)三字节指令格式中,第一个字节为操作码,后两个字节为操作数,例如:MOV 40H,30H该指令在内存中以75H 40H 30H顺序存放,占3字节,40H,MOV 40H,#30H,从执行时间看:单周期(执行一条指令需占用1个机器周期)64条 双周期(执行一条指令需占用2个机器周期)45条 四周期(执行一条指令需占用4个机器周期)2条(乘法和除法),按
3、指令完成的功能分:数据传送类指令28条 算术运算类指令24条 逻辑操作类指令25条 位操作类指令17条 控制转移类指令17条,操作码:规定了指令所实现的操作功能 操作数:指出了参加操作的数据来源(称作源操作数)和操作结果存放 在什么地方(称作目的操作数),指令格式,8051单片机指令由操作码和操作数两部分组成操作码 目的操作数,源操作数,例如:MOV A,#00H;累加器清0,操作码,目的操作数,源操作数,寻址方式,什么是寻址方式?,寻址方式是指计算机在执行指令过程中获取操作数的方式。,例如:MOV A,#20H;立即寻址:源操作数为立即数20H,目的 操作数在A中。MOV B,R2;寄存器寻
4、址:源操作数在工作寄存器R2 中,目的操作数在寄存器B中。,寻址方式中常用符号注释,1Rn(n=07)当前选中的工作寄存器组R0R7,它在片内RAM中的地址由PSW中的RS1、RS0确定。如:RS1=0 RS0=1表明此时的R0R7是内存中的08H0FH,例如:MOV A,R5;是将内存0DH中的内容A 记作:(R5)A,0DH,A,MOV A,R5,2Ri(i0,1)当前选中的工作寄存器组中可作为地址指针的两个工作寄存器R0、R,操作数在片内RAM中的地址由RSl或RS0确定。如:RS1=0 RS0=1表明此时的R0、R1是内存中的08H、09H,例如:MOV A,R0;是由内存08H中的内
5、容作为 地址,将该地址指定的存储单元的内容A 记作:(R0)A,R0,39H,A,MOV A,R0,3#data 8位立即数,即包含在指令中的8位常数。如:MOV A,#56H的功能是56H A,4#data 16 16位立即数,即包含在指令中的16位常数。如:MOV DPTR,#5678的功能是5678 DPTR,A,A,MOV A,#56H,MOV DPTR,#5678H,DPTR,DPTR,5data 8位片内RAM单元的直接地址(包括SFR 即特殊功能寄存器)。如:MOV A,56H的功能是(56H)A;即56H存储单元的内容(数据)送A,56H,A,MOV A,56H,6.addr
6、11 11位地址。用于ACALL(短调用)和AJMP(短跳转)指令中,目的地址必须是与下一条指令第一个字节的同一个2K字节程序存储器地址空间之内。因为211=2048简称2K,7addr 16 16位目的地址。用于LCALL(长调用)和LJMP(长转移)指令中,目的地址在64K字节程序存储器地址空间中。因为216=65536字节简称64K例如:LJMP addr 16,8.Rel 补码形式的8位地址偏移量。用于相对转移指令中,偏移量以下一条指令第一字节地址(也称当前PC值)为基址,地址偏移量范围为一128+127,-128的补码为10000000B(也是-0的补码),+127的补码是它自己,即
7、01111111B,例如:JNZ Rel;其中Rel以补码形式表示(10000000B01111111 B之间),9bit 片内RAM或SFR(特殊功能寄存器)的直接寻址位地址用于对可寻址位进行操作如:MOV C,bit;功能是bit所指位的内容送进位标志位C例如:MOV C,00H,10 间接寻址方式中,表示间接寻址寄存器的符号。在寄存器前冠以“”时,说明该寄存器的内容不是“所需数据”,而是存放“所需数据”的地址如:MOV A,R0假设:R0的内容为20H,记做(R0)=20H 20H单元的内容为21H,记做(20H)=21H 那么,R0指向的“所需数据”就是21H,记做(R0)=21H,2
8、0H,C,1,MOV C,00H,R0,20H,A,MOV A,R0,11 位操作指令中,表示对该位先求反再参与操作,但不影响该位原值。如:MOV C,/bit;的功能是bit位的内容先求反后送进位标志位C,即(/bit H)C,例如:MOV C,/05H;将20H单元的D5位的内容求反后送进位位C,20H,MOV A,/05H,C,1,12(X)表示X中的内容 用于对指令的注释 例如:(R7)A;表示将R7的内容送(赋值)到A,14 指令操作流程,将箭头左边的内容送(赋值)到箭头右边的单元中 用于对指令的注释 如上面所述,13(X)表示由X所指地址单元中的内容 用于对指令的注释,特指R0、R
9、1、DPTR 例如:MOV A,R0;(R0)A MOV A,R1;(R1)A MOV A,DPTR;(DPTR)A,3点特别提示,1、助记符语言一般由操作码和操作数两部分组成 操作码:规定了指令的操作功能 操作数:代表了指令的操作对象,2、对选定的工作寄存器R0R7,只有R0和R1既能存放数据又能存放地址,若R0、R1前面加“”,表示R0、R1中存放地址,若不加“”表示存放数据,3、同样DPTR既能存放数据又能存放地址,若DPTR前面加“”表示数据指针寄存器存放16位地址,否则表示存放16位数据,1、8051单片机指令系统共多少条指令?2、按字节分类各是多少条?3、按指令执行周期分类各是多少
10、条?4、按功能分类各是多少条?,思考题,111条,49,45,17,单64,双45,四2,按指令完成的功能分:数据传送类指令28条 算术运算类指令24条 逻辑操作类指令25条 位操作类指令17条 控制转移类指令17条,7种寻址方式,(1)立即寻址 如:MOV A,#45H,(2)直接寻址 如:MOV A,45H,(3)寄存器寻址 如:MOV A,R2,(4)寄存器间接寻址 如:MOV A,R0,(5)变址寻址 如:MOVC A,A+PC,(6)相对寻址 如:JC rel,(7)位寻址 如:CLR bit,1、立即寻址 立即寻址方式是指操作数包含在指令字节中。跟在指令操作码后面的数就是参加运算的
11、数,该操作数称为立即数,以“#”为标志。立即数有一字节和二字节两种:例如:MOV A,#3AH 和 MOV DPTR,#0DFFFH,执行这条指令是完成3AHA操作,A,执行这条指令是完成DFFFHDPTR操作,DPTR,注意:#DFFFH一定要写成#0DFFFH,这是因为十六进制的AF与字母相同,必须区别,例如:MOVA,#0FFH;FFH 这条指令是把FFH这个数送入累加器A中,该指令的代码为74H、FFH,累加器A的地址为E0H。下面我们看看执行过程和结果,片内程序存储器,0000H,0FFFH,PC,00H,FFH,片内数据存储器,E0H,A,MOV A,#0FFH,11111111,
12、2.直接寻址 在指令中直接给出操作数的地址,这种寻址方式就属于直接寻址方式。在这种方式中,指令的操作数部分直接是操作数的地址 在8051 单片机指令系统中,直接寻址方式可以访问 3 种存储器空间:,(1)内部数据存储器的低 128 个字节单元(00H7FH)。如:MOV A,20H(2)特殊功能寄存器。特殊功能寄存器只能用直接寻址方式进行访问。如:MOV A,SBUF(3)位地址空间(00H7FH)。如:MOV C,20H,注意:这里的20H是字节地址,注意:这里的20H是位地址,注意:这里的SBUF是串口输入输出缓存器,地址为99H,例如:MOV A,69H;(69H)(A)这条指令的代码为
13、E5H、69H 这条指令功能是把69H单元内容送入累加器A中 下面我们一起看看执行这条指令的过程和结果,00H,FFH,片内数据存储器,A,0000H,0FFFH,69H,片内程序存储器,PC,E0H,MOV A,69H,3、寄存器寻址 在该寻址方式中,参加操作的数存放在寄存器里。寄存器包括8个工作寄存器R0R7,累加器A,寄存器B、数据指针DPTR,如:MOV A,R3;(假定PSW中RS1=0、RS0=0,则R3的地址为03H)MOV B,A;(A的地址为E0H)MOV A,B;(B的地址为F0H,代码为E5H、FOH)MOV DPL,A;(DPL的地址为82H),00H,FFH,片内数据
14、存储器,B,0000H,0FFFH,E0H,片内程序存储器,PC,F0H,A,下面我们一起看看执行MOV A,B指令的过程和结果 MOV A,B;(B的地址为F0H,代码为E5H、FOH),MOV A,B,4.寄存器间接寻址 在这种寻址方式中,操作数所指定的寄存器中存放的不是操作数本身,而是操作数地址。可用来间接寻址的寄存器有:R0、R1以及数据指针DPTR,使用时前面加符号表示间接寻址。,如:MOV A,R1;(假定PSW中RS1=0、RS0=0,则R1的地址为01H)MOV R0,A;(假定PSW中RS1=0、RS0=0,则R0的地址为00H)MOVX DPTR,A;(DPTR的地址为82
15、H),00H,FFH,片内数据存储器,0000H,0FFFH,E0H,片内程序存储器,PC,A,下面我们一起看看执行MOVX DPTR,A指令的过程和结果 MOVX DPTR,A;(DPTR的地址为82H,指令代码为F0H)假定DPTR=FFFDH,0FFDH,0000H,FFFFH,片外数据存储器,FFFDH,MOVX DPTR,A,5.变址寻址 这种寻址方式用于访问程序存储器中的数据表格,它以基址寄存器DPTR或PC的内容为基本地址,加上变址寄存器A的内容作为操作数的地址,如:MOVC A,ADPTR MOVC A,APC 下面我们一起看看这两条指令的执行过程和结果,00H,FFH,片内数
16、据存储器,0000H,0FFFH,E0H,片内程序存储器,PC,A,1、MOVC A,ADPTR;(指令代码为93H)假定A=05H、(DPTR)=0300H,0305H,0300H,0300,05,DPTR,A+,0305,10001000,10001000,00H,FFH,片内数据存储器,0000H,0FFFH,E0H,片内程序存储器,PC,A,2、MOVC A,APC;(指令代码为83H)假定A=15H、(PC)=02F0H,0305H,02F0,15,PC,A+,0305,02F0H,02F0H,6.相对寻址 相对寻址是指以当前PC值作为基准,向上或向下寻找下一条指令的存放地址。相对寻
17、址主要是用于寻找下一条指令的存放地址以决定程序走向,其他寻址方式是用于寻找操作数。这是相对寻址区别于其他寻址方式的关键,在8051 指令系统中设有相对转移指令,在相对转移指令中采用相对寻址方式。这种寻址方式是以PC的内容为基本地址,加上指令中给定的偏移量作为转移地址。指令中给出的偏移量是一个 8 位带符号的常数,以补码表示,其范围为128+127。,0000H,FFFFH,片内程序存储器,PC,PC+2+18H,PC+2,C=0,C=1(正转),注意:PC当前值=本指令代码存放的地址值+本指令代码的字节数(JC 18H的字节数为2)+偏移量(rel)的原码本例的转移目标地址=PC+2+18H,
18、又如:JC 18H;机器代码为40H、18H 这条指令表示若进位位C=o,执行下一条指令;若进位位C=1,则跳到以PC中的当前值为基地址,加上偏移量18H后所得到的结果为地址的地方去执行指令,0000H,0FFFH,片内程序存储器,PC,又如:JC F5H;机器代码为40H、F5H 这条指令表示若进位位C=o,执行下一条指令;若进位位C=1,则跳到以PC中的当前值为基地址,加上偏移量【F5H】原=-B后所得到的结果为地址的地方去执行指令,PC+2,PC+2+【F5H】原=PC-9,C=0,C=1(反转),注意:PC当前值=本指令代码存放的地址值+本指令代码的字节数(JC F5H的字节数为2)+
19、偏移量(rel)的原码本例的转移目标地址=PC+2+(-0BH)=PC-9记住:正转rel80H、反转 rel 80H,7.位寻址 位寻址是指对片内RAM的位寻址区和某些可位寻址的特殊功能寄存器进行位操作时的寻址方式。位地址与直接寻址中的字节地址形式完全一样,主要由操作码来区分,使用时应注意,例如:CLR 92H 92H这一位是特殊功能寄存器P1的D2位,假设指令执行前P1=F7H,则执行该指令后,P1=F3H,P1,P1,CLR 92H,1、JZ 67H是哪种寻址方式?2、JC 10H是转移指令,它是正转还是反转?如果PC=0FF5H,C=1。转移后的PC=?3、JC F8H是转移指令,它是
20、正转还是反转?如果PC=0FF8H,C=1。转移后的PC=?,思考题,相对寻址,1007H,0FF2H,指令分类,(1)数据传送类 如:MOV A,#45H,(2)算术运算类 如:ADD A,#45H,(3)逻辑操作类 如:RL A,(4)控制转移类 如:JC 45H,(5)位操作类 如:CPL C,数据传送类指令,传送类指令是指令系统中最基本、使用最多的一类指令。主要用于数据的传送、保存以及交换等场合。按照源和目的不同,分9小类,1)以累加器A为目的操作数的指令(4条),MOV A,Rn;(Rn)(A)寄存器寻址MOV A,data;(data)(A)直接寻址MOV A,Ri;(Ri)(A)
21、间接寻址MOV A,#data;#data(A)立即寻址,2)以寄存器Rn为目的操作数的指令(3条)这组指令的功能是把源操作数指定的内容送到所选定的工作寄存器Rn中。,MOV Rn,A;(A)(Rn)寄存器寻址MOV Rn,data;(dara)(Rn)直接寻址MOV Rn,#data;#data(Rn)立即寻址,例如:MOV R2,45H假定RS1=0、RS0=1那么R2的地址为0AH假定(45H)=88H执行该指令后结果为:(0AH)=88H(45H)=88H(不变),00H,45H,片内数据存储器,0AH,10001000,MOV R2,45H,3)以直接地址为目的操作数的指令(5条)这
22、组指令的功能是把源操作数指定的内容送到由直接地址data所指定的片内RAM,MOV data,A;(A)(data)寄存器寻址MOV data,Rn;(Rn)(data)寄存器寻址MOV data1,data2;(data2)(datal)直接寻址MOV data,Ri;(Ri)(data)间接寻址MOV data,#data;#data(data)立即寻址,00H,45H,片内数据存储器,0AH,MOV 0AH,45H,10101010,例如:MOV 0AH,45Hdata1=0AH data2=45H(45H)=AAH执行该指令后结果为:(0AH)=AAH(45H)=AAH(不变),4)以
23、间接地址为目的操作数的指令(3条)这组指令的功能是把源操作数指定的内容送到以Ri中的内容为地址的片内RAM中,MOVRi,A;(A)(Ri)寄存器寻址MOVRi,data;(data)(Ri)直接寻址MOVRi,#data;#data(Ri)立即寻址,00H,45H,片内数据存储器,18H,MOV R0,45H,01100110,例如:MOV R0,45H假定:RS1=1 RS0=1 则:R0的地址为18H如果:(45H)=66H执行该指令后结果为:(18H)=66H(45H)=66H(不变),5)查表指令(2条)这组指令的功能是对存放于程序存储器中的数据表格进行查找传送(源数据地址是4位十六
24、进制数),MOVC A,A+DPTR;(A+(DPTR)(A)变址寻址MOVC A,A+PC;(PC)+1(PC)(A+(PC)(A)变址寻址,例如:MOVC A,A+PC本指令为单字节,代码83H假定:PC=0234H 则:当前PC=0235H(指令为单字节)如果:A=06H 则:源操作数的地址=0235H+06H=023BH如果(023BH)=55H执行该指令后结果为:A=55H(023BH)=55H(不变),片内程序存储器,0000H,0FFFH,0234H,023BH,0235H,00000110,A,PC+1+A,01010101,MOVC A,A+PC,6)累加器A与片外RAM传送
25、指令(4条)这组指令的功能为累加器A与片外RAM间的相互传送 由于MCS51的指令系统中没有专门的输入输出指令,且片外扩展的IO口与片外RAM是统一编址的,故以下4条指令也可以作为输入输出指令。使用寄存器间接寻址方式,MOVX A,DPTR;(DPTR)(A)MOVXDPTR,A;(A)(DPTR)MOVXA,Ri;(Ri)(A)MOVXRi,A;(A)(Ri),例如:MOVX A,DPTR本指令为单字节,代码E0H假定:DPTR=1234H(1234H)=77H执行该指令后结果为:A=77H(1234H)=77H(不变),片外数据存储器,0000H,FFFFH,1234H,A,MOVX A,
26、DPTR,01110111,7)堆栈操作类指令(2条)该类指令的功能是把直接寻址单元的内容传送到堆栈指针SP所指的单元中,以及把SP所指单元的内容送到直接寻址单元中,PUSH data;(SP)+1(SP),(data)(SP)POP data;(SP)(data),(SP)一1(SP),00H,69H,片内数据存储器,68H,例如:PUSH A假定:(SP)=68H A=9AH执行该指令后结果为:(69H)=9AH A=9AH(不变)(SP)=69H,原先SP,执行后SP,10011010,A,PUSH A,10011010,00H,69H,片内数据存储器,68H,又如:POP A假定:(S
27、P)=69H、(69H)=9AH执行该指令后结果为(69H)=9AH(不变)、(SP)=68H、A=9AH,7FH,A,原先SP,执行后SP,POP A,10011010,从以上2例可知:进栈时SP+1出栈时SP-1进出栈的原则是“先进后出、后进先出”堆栈开口向下,8)交换指令(4条)该类指令的功能是把累加器A中的内容与源操作数所指出的数据相互交换,XCH A,Rn;(A)(Rn)XCH A,data;(A)(data)XCH A,Ri;(A)(R1)XCHDA,Ri;(A30)(Ri)30),00H,7FH,片内数据存储器,1AH,例如:XCH A,R2假定:RS1=1 RS0=1 则:R2
28、的地址为1AH如果:(1AH)=66H、A=55H执行该指令后结果为:A=66H(1AH)=55H,01010101,01100110,01010101,A,XCH A,R2,又如:XCHDA,R1;(A30)(Ri)30)假定:RS1=1、RS0=1 则:R1的地址为19H如果:(19H)=F0H、A=0FH执行该指令后结果为:A=00H(19H)=FFH,00H,7FH,片内数据存储器,19H,00001111,00000000,11111111,A,XCHD A,R1,9)16位数据传送类指令(1条)MOV DPTR,#datal6;#dataH(DPH),#dataL(DPL)如:MO
29、V DPTR,#00FFH,立即数,DPTR,MOV DPTR,#00FFH,DPL,DPH,分析下面程序,回答问题。1、MOV A,#78H MOV R0,A MOV 78H,#35H MOV B,R0 B=?2、MOV DPTR,#1234H MOV A,#22H MOVX DPTR,A DPTR=?(1234H)=?3、MOV SP,#78H MOV 78H,#45H MOV A,#45H PUSH A(78H)=?(79H)=?SP=?4、MOV SP,#34H MOV 34,#22H POP A A=?SP=?,思考题,35H,1234H22H,22H33H,45H45H79H,算术
30、运算类指令,算术运算指令主要完成加、减、乘、除四则运算,以及加1、减1、BCD码的运算和调整等,除加1、减1运算外,这类指令大多数要影响到程序状态字寄存器PSW。虽然算术逻辑单元ALU仅能对8位无符号整数进行运算,但利用进位位C,可进行多字节无符号整数的运算。利用溢出标志,还可以方便地对带符号数进行补码运算。,1)加法指令(4条),ADD A,#data;(A)+#data(A)ADD A,data;(A)+(data)(A)ADD A,Ri;(A)+(Ri)(A)ADD A,Rn;(A)+(Rn)(A),例如:ADD A,45H假定A=AAH、(45H)=55H执行该指令后结果为:A=FFH
31、(45H)=55H(不变),00H,45H,片内数据存储器,7FH,11111111,10101010,A,ADD A,45H,2)带进位加法指令(4条),ADDC A,#data;(A)+#data+(C)(A)ADDC A,data;(A)+(data)+(C)(A)ADDC A,Ri;(A)+(Ri)+(C)(A)ADDC A,Rn;(A)+(Rn)+(C)(A),例如:ADDC A,45H假定A=AAH(45H)=9AHC=1执行该指令后结果为:A=45H(45H)=9AH(不变)C=1,00H,45H,片内数据存储器,7FH,10101010,A,10101010+10011010、
32、1,01000101,01000101,ADDC A,45H,原来C=1,辅助进位AC=1,执行指令后进位位C=1,3)带借位减法指令(4条),SUBB A,#data;(A)#data(C)(A)SUBB A,data;(A)(data)(C)(A)SUBBA,Ri;(A)(Ri)(C)(A)SUBB A,Rn;(A)(Rn)(C)(A),例如:SUBB A,45H假定A=87H(45H)=9AHC=1执行该指令后结果为:A=ECH(45H)=9AH(不变),00H,45H,片内数据存储器,7FH,10000111,A,10000111-10011010 1,11101100,1110110
33、0,SUBB A,45H,、,原来借位C=1,现借位位C=1,注意:单字节相减时,必须先将借位位C清零。,4)乘法指令(1条),MUL AB;(A)(B)(B)158 积的高位,(A)70积的低位,例如:MUL AB假定A=22H、B=14H执行该指令后结果为:A=A8HB=02H,00H,F0H,片内数据存储器,FFH,10101000,00100010,A,00100010 000101000000001010101000,00000010,注意:乘法总是使C=0,B,5)除法指令(1条),DIV AB;(A)(B)(A)商、(B)余数,例如:DIV AB假定A=22H、B=0FH执行该指
34、令后结果为:A=02HB=04H,00H,F0H,片内数据存储器,FFH,00000100,00100010,A,0010001000001111=0000001000000100,00000010,注意:除数B不能为零,6)加1指令(5条),INC A;(A)1(A)INC data;(data)1(data)INCRi;(Ri)l(Ri)INC Rn;(Rn)1(Rn)INC DPTR;(DPTR)1(DPTR),例如:INC A假定A=55H、执行该指令后结果为:A=56H,01010110,01010101,A,INC A,注意:如果A=FFH,执行INC A后,A=00H 加1指令不
35、影响标志位,7)减1指令(4条),DEC A;(A)l(A)DEC data;(data)1(data)DECRi;(Ri)一1(Ri)DEC Rn;(Rn)一1(Rn),例如:DEC A假定A=55H、执行该指令后结果为:A=54H,01010100,01010101,A,DEC A,注意:如果A=00H,执行DEC A后,A=FFH 减1指令不影响标志位,DA A 这条指令是在进行BCD码运算时,跟在ADD和ADDC指令之后,将相加后存放在累加器A中的结果进行修正。修正的条件和方法为:若(A03)9或(AC)=1,则(A03)6H(A03);若(A47)9或(CY)=1,则(A47)+6H
36、(A47)若以上两条同时发生,或高4位虽等于9,但低4位修正后有进位(即:AC=1),则应加66H修正,8)十进制调整指令(1条),如:A=56H、B=49H,观察执行下列程序的结果 ADD A,B DA A,01010110,01001001,A,B,10011111,DA A,00000101,因为1111B9,所以F+6=5、且AC=1,AC=1,因为1001B=9,且AC=1。所以9+1+6=0,且C=1,1,C,A,A,分析下面程序,回答问题。1、MOV A,#78H ADD A,#87HA=?、C=?2、MOV A,#14H MOV B,#12H MUL AB A=?B=?,思考题
37、,3、MOV A,#78H MOV B,#87H ADD A,B DA A A=?、C=?4、MOV A,#14H MOV B,#12H DIV AB A=?B=?,A=FFH C=0,A=68H B=01H,A=65H C=1,A=01H B=02H,逻辑操作类指令有与、或、异或、求反、左右移位、清等逻辑操作 对应的寻址方式有直接、寄存器和寄存器间接寻址 该类指令的执行一般不影响PSW 先介绍移位指令(4条),逻辑操作类指令,A,A,RL A,RR A,C,0,1,1,0,1,A,0,RLC A,C,0,1,A,0,1,0,1,0,RRC A,累加器半字节交换指令,SWAP A 这条指令的功
38、能是将累加器A的高低两半字节交换。如(A)=56H,执行指令SWAP A后,结果(A)=65H。,A,求反指令(1条)CPL A;/(A)(A),如:A=55H,执行指令CPL A后,结果(A)=AAH。,A,CPL A,清0指令(1条)CLR A;0(A),A,CLR A,ANL A,#data;(A)#data(A)ANL data,#data;(data)#data(data)ANL A,Rn;(A)(Rn)(A)ANL A,data;(A)(data)(A)ANL data,A;(data)(A)(data)ANL A,Ri;(A)(Ri)(A)注意:与逻辑运算操作的规则是有0则0、无
39、0则1,逻辑与指令(6条),例如:ANL A,45H 其中A=55H、(45H)=AAH 执行结果 A=00H、(45H)=AAH(不变),1,0,1,0,1,0,1,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,1,0,0,A,45H,ORL A,#data;(A)#data(A)ORL data,#data;(data)#data(data)ORL A,Rn;(A)(Rn)(A)ORL A,data;(A)(data)(A)ORL data,A;(data)(A)(data)ORL A,Ri;(A)(Ri)(A)注意:或逻辑运算操作的规则是有1则1、无1则0,逻辑或指令(
40、6条),例如:ORL A,45H 其中A=55H、(45H)=AAH 执行结果 A=FFH、(45H)=AAH(不变),1,0,1,0,1,0,1,0,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,0,1,A,45H,XRL A,#data;(A)#data(A)XRL data,#data;(data)#data(data)XRL A,Rn;(A)(Rn)(A)XRL A,data;(A)(data)(A)XRL data,A;(data)(A)(data)XRL A,Ri;(A)(Ri)(A)注意:异或逻辑操作的规则是相同为0、不同为1,逻辑异或指令(6条),例如:XRL
41、 A,45H 其中A=55H、(45H)=AAH 执行结果 A=FFH、(45H)=AAH(不变),1,0,1,0,1,0,1,0,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,0,1,A,45H,逻辑类操作指令小结:,逻辑操作是按位进行的。左移位相当于算术算术运算的,右移位相当于算术运算的。ANL操作常用来屏蔽字节中的某些位,要保留的位用“1”去“与”,要清除的位用“”去“与”。ORL操作常用来对字节中的某些位置“1”,要保留的位用“”去“或”,要置1的位用“1”去“或”。XRL操作常用来对字节中的某些位求反,要保留的位用“”去“异或”,要求反的位用“1”去“异或”。,1、
42、读下面的程序回答问题.MOV A,#55HMOV B,ARL A MOV R1,AMOV R2,BANL A,BMOV R3,AR1=?R2=?R3=?,思考题,2、读下面的程序回答问题.MOV 55H,#55HMOV R0,#55HMOV A,#0AAHANL A,R0MOV R1,AORL A,R0MOV R2,AXRL A,R0MOV R3,AR1=?R2=?R3=?,R1=AAH R2=55H R3=00H,R1=00H R2=55H R3=00H,控制转移类指令,控制转移类指令用于控制程序的走向,故其作用区间是程序存储器空间。利用具有16位地址的长调用、长转移指令可对64K程序存储器
43、的任一地址单元进行访问,具有11位地址的绝对调用和绝对转移指令,访问2K字节的空间。还有在一页范围的短相对转移以及许多条件转移指令。这类指令一般不影响标志位,下面分别给予介绍。,长转移:LJMP addr 16;addr 16(PC)指令提供16位目标地址,将指令中第二字节和第三字节地址码分别装入PC高8位和低8位中,所以,无条件转移的目标地址范围是64K字节空间。如:LJMP 2000H 执行该指令是使(PC)=2000H即程序转到2000H处执行。,无条件转移指令,0000H,2000H,LJMP 2000H,MOV 20H,40H,LJMP 2000H,程序存储器,AJMP addr 1
44、1;(PC)+2(PC),addr 11(PC100),(PC1511)不变下面通过一个实例加以说明:假定(PC)=0000H,执AJMP BRAN,而BRAN所在地址为0625H。AJMP BRAN为2字节指令:代码C1H、25H,无条件绝对转移指令,0000H,0625H,AJMP 0625H,MOV 20H,40H,AJMP 0625H,程序存储器,JMP rel;(PC)+2+rel(PC)rel是目标地址与当前地址的差值的补码,由汇编语言在汇编过程中自动计算偏移地址。在手工汇编时,可用下式计算偏移地址:即:目标地址=当前地址+偏移量由此可见:目标地址当前地址,偏移量0(称为正转)目标
45、地址当前地址,偏移量0(称为反转)由于:正数的补码是它自己,负数的补码是其反码+1所以:rel=(目的地址一当前地址)补,相对转移指令,例如:目标地址=1009H,当前地址=1080H 则:1009H-1080H=(-0077H)而(-0007H)补=FF89H 所以 目标地址=1080H+FF89H=1009H又如:目标地址=10CCH,当前地址=10A0H 则:10CCH-10A0H=(002CH)而(002CH)补=002CH 所以 目标地址=10A0H+002CH=10CCH注意:由于正数的补码前面添0和负数的补码前面添1都不 影响数值的大小,所以为节省存储空间,在指令代码中的rel只
46、表明有效部分.即:FF89H 只取rel=89H,002CH只取rel=2CH,如PC=0000H,执行SJMP SUB1,SUB1为0025H其中:80H为SJMP的机器码,23H为rel。注意:rel=目标地址(2)当前地址()00。因为指令为字节,所以当前地址。,又如:,执行,而为,则:其中:80H为SJMP的机器码,H为rel。注意:rel=【目标地址()当前地址()】补FF。因为指令为字节,所以当前地址。即:目标地址=+FF=,JMP DPRT;(A)+(DPRT)(PC)该指令称为散转指令(又称为间接转移指令),该指令把累加器A中的8位无符号数与作为基址寄存器DPTR中的16位数据
47、相加,所得的值送入PC作为转移的目的地址。该指令执行后不影响累加器A和数据指针DPTR中的原内容,也不影响任何标志位。这条指令的特点是其转移地址不是编程时确定的,而是在程序运行时动态决定的。因此,可以在DPTR中装入多条转移程序的首地址,而由累加器A中的内容来动态选择该时刻应转向哪一条分支程序。,散转移指令,如,执行JMP DPRT;(A)+(DPRT)(PC)图解如下:,程序存储器,0000H,1000H,2002H,2012H,2022H,2000H,02H,DPTR,A+,2002H,PC,JMP A+DPTR,若A=12H,若A=22H,只要改变A的内容就能选择不同目标地址,JMP D
48、PRT的机器 码,JZ rel;A=0;(PC)+2+rel(PC)A0:(PC)+2(PC)JNZ rel;A0:(PC)+2+rel(PC)A=0:(PC)+2(PC)CJNE A,data,rel;(A)=(data):(PC)+3(PC),0(C)(A)(data):(PC)+3+rel(PC),0(C)(A)(data):(PC)+3+rel(PC),1(C)CJNE A,#data,rel;(A)=#data:(PC)+3(PC),0(C)(A)#data:(PC)+3+rel(PC),0(C)(A)#data:(PC)+3+rel(PC),1(C),条件转移指令,CJNE Rn,
49、#data,rel;(Rn)=#data:(PC)+3(PC),0(C)(Rn)#data:(PC)+3+rel(PC),0(C)(Rn)#data:(PC)+3+rel(PC),1(C)CJNE Ri,#data,rel;(Ri)=#data:(PC)+3(PC),0(C)(Ri)#data:(PC)+3+rel(PC),0(C)(Ri)#data:(PC)+3+rel(PC),1(C)DJNZ Rn,rel;(Rn)1(Rn),若(Rn)0;(PC)+2+rel(PC)若(Rn)=0:(PC)+2(PC)DJNZ data,rel;(data)1(data)若(data)0:(PC)+3+
50、rel PC)若(data)=0:(PC)+3(PC),上述指令执行满足某种特定条件的转移,其目标地址在以下一条指令的起始地址为中心的256个字节范围内(128+127)(rel的算法与相对短转移指令相同)。第一条和每二条指令是判别累加器A中的内容是否为0来确定是顺序执行还是转移。第三条至第六条是比较转移指令,该指令通过比较前面两个操作数的大小,如果它们的值不相等则转移,相等则继续执行。指令执行后要影响到进位位CY,若操作数1小于操作数2,则CY=1;若操作数1大于操作数2,则CY=0。第七条、第八条指令是对操作数减1后,判断结果是否为0;若不为0转移,为0顺序执行。,判断下列程序的转移目的地