[理学]MCS-51_指令系统与程序设计.doc

上传人:音乐台 文档编号:1986557 上传时间:2019-01-28 格式:DOC 页数:35 大小:240.50KB
返回 下载 相关 举报
[理学]MCS-51_指令系统与程序设计.doc_第1页
第1页 / 共35页
[理学]MCS-51_指令系统与程序设计.doc_第2页
第2页 / 共35页
[理学]MCS-51_指令系统与程序设计.doc_第3页
第3页 / 共35页
亲,该文档总共35页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《[理学]MCS-51_指令系统与程序设计.doc》由会员分享,可在线阅读,更多相关《[理学]MCS-51_指令系统与程序设计.doc(35页珍藏版)》请在三一文库上搜索。

1、2.2.1 立即数寻址采用这种方式时,指令中直接给出了参与操作的8 位或16位二进制常数,并在此常数前面加“#”作为标志。例如:MOV A,#30H第2 章 MCS-51 指令系统与程序设计执行完这条指令后,A 中的值是确定的,就是十六进制数30H。在形式上,立即数前面总有一个“#”符号作为标志。2.2.2 直接寻址在直接寻址方式中,指令直接给出操作数所在的存储单元地址。例如:MOV A,20H其功能是把内部RAM 中地址为20H 的单元中的数送到A 中。执行完这条指令后,A中的值并不确定,但可以肯定它一定与地址为20H 的单元中的值相同。在形式上,20H 前面没有“#”符号。2.2.3 寄存

2、器寻址寄存器寻址就是操作数存放在寄存器中,因此,指定了寄存器就能得到操作数。例如:MOV A,R0其功能就是把寄存器R0 的内容传送到累加器A 中。指令执行后,累加器A 中的内容与R0中的内容相同。2.2.4 寄存器间接寻址首先考虑这样一个问题:如何从片内RAM 的20H 单元开始,连续取10 个数,依次送入累加器A 中。显然,要从20H 单元取数,可以用指令MOV A, 20H;然后取21H 单元中的数,可以用MOV A, 21H。依次类推,取10个数就要用10条类似的指令,这样的做法显然不聪明。出现这种情况的原因是把地址的具体数值写在指令中了,或者说,每条指令中的地址值是一个常数,它不能改

3、变。如果能把单元地址用一个变量来表示,其值可增可减,那么问题即可简便地解决。寄存器间接寻址的方式就是用于解决这种问题的。它是以指令中给出的某一寄存器的内容作为操作数的存放单元地址,从而获得操作数。在这种寻址方式下,寄存器前面要用符号“”作为标志。例如:MOV A, R0因为R0 前面有一个“”,所以R0 中的内容就被看做是地址。要改变R0 的内容,就可以用这条指令操作到不同地址单元中的数据。于是上面的问题就可以得到解决。首先将R0 的内容设定为20H,然后用指令MOV A, R0 读取R0 指向的单元中的数据,再将R0 的内容加1,重复操作10 次即可完成任务。重复可以利用循环来进行。示例代码

4、如下。MOV R2, #0AH ;用R2存放循环次数MOV R0, #20H ;R0指向起始单元LOOP:MOV A, R0 ;将R0所指向的单元中的内容送到A中INC R0 ;将R0中的值加1DJNZ R2, LOOP ;将R2中的值减1,如果不等于0,则跳到LOOP处继续执行,否则结束循环2.2.5 变址寻址变址寻址方式是将基址寄存器(DPTR或PC)的内容加上变址寄存器(只能是A)的内容作为操作数的地址。这类指令经常用于查表、换码程序的编写,DPTR或PC指向一个表的首地址,A中的内容是相对于基址DPTR或PC的一个偏移量。例如:MOV A, A + DPTRMOV A, A + PC该

5、指令的功能是先用DPTR 或PC 的内容加上A 的内容形成一个新的地址,然后再把相应的存储单元的内容送入A 中。 2.2.6 相对寻址相对寻址方式是为实现程序的相对转移而设计的,所寻找的地址用相对于本条指令所在地址的偏移量来表示,用于指定程序转移的目的地址。如:JC relrel 是一个带符号的8 位二进制数,所能表示的范围是-128+127,它决定了相对转移距离的范围。转移的目的地址可用以下公式计算:目的地址=转移指令所在地址+转移指令字节数 + rel但在一般的编程过程中,通常会用一个标号来代替偏移量,程序可自动根据该标号得到偏移量,不需要人工计算相对地址的值。如:JC NEXT2.2.7

6、 位寻址位寻址方式中的操作数不再是整个字节,而是某一个位,指令中给出的是位地址。例如:MOV C, 20H该指令的功能是将位地址20H 单元的内容送入C 中。注意:字节地址和位地址并不相同。如指令MOV A, 20H 中的20H 是字节地址,因为目的操作数A 是8 位的;而在指令MOV C, 20H 中的20H 是位地址,它其实是字节地址24H 单元中的D0 位,因为目的操作数在CY 中,是1 位二进制数。2.3 指 令 系 统对于MCS-51系列单片机的指令系统,按指令功能的不同可以将全部的111 条指令分为5大类即数据传送类、算术运算类、逻辑运算类、控制转移类、位操作类指令。Rn:当前选中

7、的工作寄存器组R0R7 共8 个。工作寄存器共有4 组,默认使用的是第0组,也可以用标志寄存器(PSW)中两个位(RS1 和RS0)的组合来选定其中的任意一组。Ri:当前选中的工作寄存器中可以作为地址指针(间址寄存器)的两个工作寄存器(R0 和R1)。direct:片内RAM 或特殊功能寄存器(SFR)的地址,为8 位。#data:8 位立即数,即指令中直接给出的8位常数,如#12H。#data16:16 位立即数,即指令中直接给出的16 位常数,如#1234H。addr16:16 位的地址,如1000H。addr11:11 位的地址。bit:片内RAM 或特殊功能寄存器的直接寻址位地址。:在

8、寄存器间接寻址方式中,作为间址寄存器的前缀,如Ri、DPTR。/:在位操作指令中,表示对该位先取反再参与运算,但并不影响该位的原值。(x):x 表示某一寄存器或存储单元的地址,加上括号表示该寄存器或存储单元中的内容。:将箭头左边的内容送入箭头右边的单元中,表示的是数据传送方向。2.3.2 数据传送类指令数据传送类指令是MCS-51 单片机指令系统中最基本的,也是在编程时使用最频繁的一类指令。其基本功能是把源操作数传送到目的操作数中。执行完指令后,源操作数不变,目的操作数等于源操作数;或者是源操作数与目的操作数互换,即源操作数变成目的操作数,目的操作数变成源操作数。数据传送指令不影响标志C、AC

9、 和OV,但可能会对奇偶标志P有影响。1. 以累加器A为目的操作数的指令(4条)这4条指令的作用是把源操作数指向的内容送到累加器A 中。有直接寻址、立即数寻址、寄存器寻址和寄存器间接寻址共4 种寻址方式。MOV A,direct ;(direct)(A), 将直接寻址单元中的内容送到累加器A中MOV A,#data ;#data(A), 将立即数送到累加器A中MOV A,Rn ;(Rn)(A), 将Rn中的内容送到累加器A中MOV A,Ri ;(Ri)(A), 将Ri所指地址单元中的内容送到累加器A中2. 以寄存器Rn为目的操作数的指令(3条)这3 条指令的功能是把源操作数指定的内容送到所选定

10、的工作寄存器Rn 中。有直接寻址、立即寻址和寄存器寻址方式。MOV Rn,direct ;(direct)(Rn), 将直接寻址单元中的内容送到寄存器Rn中MOV Rn,#data ;#data (Rn), 将立即数直接送到寄存器Rn中MOV Rn,A ;(A)(Rn), 将累加器A中的内容送到寄存器Rn中3. 以直接地址为目的操作数的指令(5条)这5 条指令的功能是把源操作数指定的内容送到由直接地址data 所选定的片内RAM中。有直接寻址、立即寻址、寄存器寻址和寄存器间接寻址4 种寻址方式。MOV direct1,direct2 ;(direct2)(direct1), 将直接寻址地址单元

11、中的内容送到直接寻址单元中MOV direct,#data ;#data (direct), 将立即数送到直接寻址单元中MOV direct,A ;(A) (direct), 将累加器A中的内容送到直接寻址单元中MOV direct,Rn ;(Rn)(direct), 将寄存器Rn中的内容送到直接寻址单元中MOV direct,Ri ;(Ri)(direct), 将寄存器Ri中的内容所指地址单元中的数据送到直接寻址单元中4. 以间接地址为目的操作数的指令(3条)这组指令的功能是把源操作数指定的内容送到以Ri 中的内容为地址的片内RAM 中。有直接寻址、立即寻址和寄存器寻址3 种寻址方式。MOV

12、 Ri,direct ;(direct)(Ri), 将直接寻址单元中的内容送到以Ri中的内容为地址的RAM单元中MOV Ri,#data ;#data (Ri), 将立即数送到以Ri中的内容为地址的RAM单元中MOV Ri,A ;(A)(Ri), 将累加器A中的内容送到以Ri中的内容为地址的RAM单元中5. 16位数据传送指令(1条)这条指令的功能是把16位常数送入数据指针寄存器中。MOV DPTR,#data16 ;#dataH(DPH),#dataL(DPL)DPTR 有DPH(存放高八位)与DPL(存放低八位)6. 累加器A 与程序存储器(ROM)传送指令(两条)这组指令也称为查表指令,

13、其功能主要是对存放于程序存储器(ROM)中的数据表格进行查找传送,使用变址寻址方式。MOVC A,A + DPTR ;(A)+(DPTR)(A),将累加器A与DPTR内容之和看作地址,然后把改地址单元的内容送到累加器A中MOVC A,A + PC ;(PC)+1(A),(A)+(PC)(A)将累加器A与DPTR内容之和看作地址,然后把改地址单元的内容送到累加器A中【例2.1】 把程序存储器2000H单元的内容送R0 中。MOV A,#00HMOV DPTR,#2000HMOVC A,A + DPTR /将DPTR的值加上A的值形成一个新的地址,然后把相应的储存单元送到A中MOV R0,A片内任

14、何寄存器或存储单元要与程序存储器(ROM)交换数据都必须要经过累加器A。7. 累加器A 与片外数据存储器(RAM)传送指令(4条)这4条指令的作用是累加器A 与片外RAM 间传送数据。使用寄存器寻址方式。MOVX DPTR,A ;(A)(DPTR), 将累加器A中的内容送到数据指针指向的片外RAM地址单元中MOVX A,DPTR ;(DPTR)(A), 将数据指针指向片外RAM地址单元中的内容送到累加器A中MOVX A,Ri ; (Ri)(A), 将寄存器Ri指向片外RAM地址单元中的内容送到累加器A中MOVX Ri,A ;(A)(Ri), 将累加器A中的内容送到寄存器Ri指向的片外RAM地址

15、单元中MOVX 指令专门用于MCS-51 芯片内部与片外数据存储器(RAM)之间的数据交换,这种交换必须要经过累加器A,且外部RAM 不能像内部RAM 那样有各种寻址方式,因此对外部RAM 的操作不如对内部RAM 的操作方便,很多运算必须要借助于内部RAM才能进行。例2.2 将片外RAM 20H 单元的内容送入片内RAM 30H 单元中。MOV DPTR,#20HMOVX A,DPTRMOV 30H, A上面用到的数据指针DPTR 为16 位,可以寻址64KB 的范围。因为20H 处于低256B的区间中,所以这里也可以不用DPTR,而使用8 位的间址寄存器R0或R1。如果片外RAM的地址高于F

16、FH,那么就只能使用DPTR,而不能使用R0 或R1 了。8. 堆栈操作类指令(两条)这类指令的作用是将直接寻址单元中的内容传送到堆栈指针(SP)所指的单元中,并把SP所指单元的内容送到直接寻址单元中。这类指令只有两条,即入栈操作指令和出栈操作指令。PUSH direct ;(SP)+1(SP),(direct)(SP), 堆栈指针首先加1,然后将直接寻址单元中的数据送到堆栈指针(SP)所指的单元中 POP direct ;(SP)(direct),(SP)-1(SP), 将堆栈指针(SP)所指单元的数据送到直接寻址单元中,然后SP再进行减1操作入栈和出栈操作是两条功能刚好相反的指令,常利用这

17、两条指令操作堆栈可保护和恢复现场。9. 交换指令(5条)这5条指令的功能是把累加器A中的内容与源操作数所指的数据相互交换。XCH A,Rn ;(A)(Rn), 累加器与工作寄存器Rn交换内容XCH A,direct ;(A)(direct), 累加器与直接寻址字节交换内容XCH A,Ri ;(A)(Ri),累加器与工作寄存器Ri所指存储单元中的内容互换XCHD A,Ri ;(A3-0)(Ri)3-0), 累加器与工作寄存器Ri所指存储单元中内容的低半字节互换SWAP A ;(A3-0)(A7-4), 累加器中内容的高、低半字节互换2.3.3 算术运算类指令算术运算指令主要是执行加、减、乘、除法

18、四则运算。另外,MCS-51 指令系统中有相当一部分是进行加、减1的操作,还有BCD 码的运算和调整,都可归为运算指令。这类指令的结果大多数都会对PSW 的进位(CY)、半进位(AC)、溢出位(OV)有影响(置位或复位),只有加1和减1 操作不影响这些标志位,这在使用中应特别注意。1. 不带进位的加法指令(4 条)这4 条指令的作用是把立即数、直接地址、工作寄存器及间接地址的内容与累加器A中的内容相加,运算结果存在A中。ADD A,#data ;(A)+#data(A),将累加器A中的内容与立即数#data相加,结果存在A中ADD A,direct ;(A)+(direct)(A),将累加器A

19、中的内容与直接寻址单元中的内容相加,结果存在A中ADD A,Rn ;(A)+(Rn)(A),将累加器A中的内容与工作寄存器Rn中的内容相加,结果存在A中ADD A,Ri ;(A)+(Ri)(A),将累加器A中的内容与工作寄存器Ri所指地址单元中的内容相加,结果存在A中可见,8 位二进制数加法运算的一个加数固定在累加器A 中,而另一个加数可由不同的寻址方式得到,相加的结果均送回累加器A中。2. 带进位的加法指令(4条)这4 条指令与ADD 的4 条指令的功能基本相同,只是在进行加法运算时还需考虑进位问题。ADDC A,direct ;(A)+(direct)+(C)(A), 将累加器A中的内容与

20、直接寻址单元中的内容连同进位位相加,结果存在A中ADDC A,#data ;(A)+ #data +(C)(A), 将累加器A中的内容与立即数连同进位位相加,结果存在A中ADDC A,Rn ;(A)+ Rn +(C)(A),将累加器A中的内容与工作寄存器Rn中的内容,连同进位位相加,结果存在A中ADDC A,Ri ;(A)+(Ri)+(C)(A), 将累加器A中的内容与工作寄存器Ri指向地址单元中的内容连同进位位相加,结果存在A中MCS-51 单片机中的累加器A 为8 位,因此只能直接做8 位二进制的加法,如果要做双字节数的加法,则必须拆分为高字节和低字节分别做。【例2.3】 把(R2R3)和

21、(R6R7)两个双字节无符号数相加,结果送到(R4R5)中。MOV A,R3ADD A,R7 ;先对低字节做加法,无须考虑进位,但有可能产生进位MOV R5,AMOV A,R2ADDC A,R6 ;将对高字节做加法时可能产生的进位也累加进来MOV R4,A3. 带借位的减法指令(4条)这组指令是将立即数、直接地址、间接地址及工作寄存器与累加器A连同借位位C的内容相减,结果送回累加器A 中。SUBB A,direct ;(A)-(direct)-(C)(A),将累加器A中的内容与直接寻址单元中的内容连同借位位相减,结果存在A中SUBB A,#data ;(A)-#data -(C)(A),将累加

22、器A中的内容与立即数连同借位位相减,结果存在A中SUBB A,Rn ;(A)-(Rn) -(C)(A),将累加器A中的内容与工作寄存器中的内容连同借位位相减,结果存在A中SUBB A,Ri ;(A)-(Ri)-(C)(A),将累加器A中的内容与工作寄存器Ri所指地址单元中的内容连同借位位相减,结果存在A中MCS-51 指令系统中的减法运算只有带借位的减法指令,而没有不带借位的减法指令。如果要进行不带借位的减法运算,可以在运算前先将CY清0,指令为:CLR C同样,MCS-51 单片机只能直接做8 位二进制的减法,如果要做双字节数的减法,必须要拆分为高字节和低字节分别做。【例2.4】 将(R2R

23、3)和(R6R7)两个双字节数相减,结果送到(R4R5)中。MOV A,R3CLR CSUBB A,R7 ;低字节的减法,不需要考虑借位,但可能产生借位MOV R5,AMOV A,R2SUBB A,R6 ;高字节的减法,将前面可能产生的借位也减去MOV R4,A4. 乘法指令(1条)这条指令的作用是把累加器A 和寄存器B中的8 位无符号数相乘,得到16位的乘积,将结果的低8位存在累加器A 中,高8 位存在寄存器B 中。乘法指令影响PSW 的状态,其中进位标志(CY)总是被清0。溢出标志位的状态与乘积有关,如果乘积小于FFH(即高8位为0),则OV清0;否则OV 置位。MUL AB ;(A)(B

24、)(A)和(B), 将累加器A中的内容与寄存器B中的内容相乘,结果的低8位存在累加器A中,高8位存在寄存器B中【例2.5】 做50H 乘以A0H 的操作。MOV A, 50H ;(A)=50HMOV B, A0H ;(B)=A0HMUL AB ;(B)=32H,(A)=00H,CY=0,OV=115. 除法指令(1条)这条指令的作用是把累加器A中的8位无符号整数除以寄存器B中的8位无符号整数,所得到的商存在累加器A中,余数存在寄存器B中。除法运算总是使OV和进位标志位(CY)等于0。如果OV=1,则表明寄存器B中的内容为00H,执行结果为不确定值,表示有溢出。DIV AB ;(A)/(B)(A

25、)和(B),将累加器A中的内容除以寄存器B中的内容,所得商存在累加器A中,余数存在寄存器B中【例2.6】 做7除以3 的操作。MOV A,#07H ;(A)=7MOV B,#03H ;(B)=3DIV AB ;(A)=2,(B)=16. 加1 指令(5 条)这5条指令的功能是将原寄存器或单元的内容加1,结果送回原寄存器或单元中。加1指令不会对任何标志有影响,如果原寄存器的内容为FFH,则执行加1 指令后,结果就是00H。该指令有直接寻址、寄存器寻址、寄存器间址等寻址方式。INC A ;(A)+1(A), 将累加器A中的内容加1,结果存在A中INC direct ;(direct)+1(data

26、), 将直接寻址单元中的内容加1,结果送回原地址单元中INC Ri ;(Ri)+1(Ri), 将寄存器的内容所指地址单元中的内容加1,结果送回原地址单元中INC Rn ;(Rn)+1(Rn), 将寄存器Rn的内容加1,结果送回原地址单元中INC DPTR ;(DPTR)+1(DPTR), 将数据指针的内容加1,结果送回数据指针中7. 减1 指令(4 条)这组指令的作用是将原寄存器或单元的内容减1,结果送回原寄存器或单元中。若原寄存器或单元的内容为00H,则减1 后即为FFH,运算结果不影响任何标志位。该指令有直接寻址、寄存器寻址、寄存器间址等寻址方式。DEC A ;(A)-1 (A), 将累加

27、器A中的内容减1,结果送回累加器A中DEC direct ;(direct)-1(direct), 将直接寻址单元中的内容减1,结果送回直接寻址单元中DEC Ri ;(Ri)-1 (Ri), 将寄存器Ri所指地址单元中的内容减1,结果送回原地址单元中DEC Rn ;(Rn)-1 (Rn),将寄存器Rn中的内容减1,结果送回寄存器Rn中8. 二十进制调整指令(1 条)二十进制调整指令专门用于对累加器A 中的BCD 码十进制数加法计算结果进行调整。两个BCD 码二进制数相加后,必须经过本指令调整才能得到正确的计算结果。所以,该指令一般跟在ADD 或ADDC 之后。DA A例如:(1) 2 + 6

28、= 8; (2) 3 + 8 = 110 0 1 0 0 0 1 1+ 0 1 0 1 + 1 0 0 00 1 1 1 1 0 1 1其中(1)式的计算结果是正确的,(2)式的计算结果是不正确的,因为BCD 码中不存在1011 这个编码,(2)式的以上情况说明正确结果应该是00010001。,二进制数的加法指令并不完全适用于BCD 码的计算,因此计算之后必须要对结果进行修正,这就是所谓的二十进制调整问题。出错的原因在于BCD 码是4位二进制编码,4 位二进制数共有16个编码,但BCD 码只使用了其中的前10 个,剩下的6 个没有用。通常将这6 个没有用的编码(1010、1011、1100、1

29、101、1110 和1111)称为无效码。在BCD 码的加法运算中,只要结果进入或者跳过无效编码,那么就是错误的。因此一位BCD 码加法运算出错的情况有以下两种。_ 相加结果大于9,说明已进入无效编码区。_ 相加结果有进位,说明已跳过无效编码区。不管出现哪一种情况,相加结果都会比正确值小6。因此,只要BCD 码的加法运算结果出现上述两种情况之一,就必须进行调整,这样才能得到正确结果。二十进制调整的方法就是用指令DA A根据运算后A中的值和PSW中有关位的状态,自动选择一个修正值(00H、06H、60H 或66H)与原运算结果相加,以得到正确结果。【例2.7】 试写出能完成85+59 的BCD

30、加法程序。ORG 0000HAJMP MAINORG 0030HMAIN:MOV A,#85HADD A,#59HDA ASJMP $END2.3.4 逻辑运算及移位类指令逻辑运算及移位类指令包括对累加器A 的逻辑操作、对字节变量的逻辑与、或、异或操作。这类指令的操作数都是8 位数,且进行逻辑运算时都不会影响PSW 中标志位的状态。1. 对累加器A的逻辑操作指令(6条)这类指令主要包括对累加器直接清0、取反、循环和移位操作。CLR A ;0 (A),将累加器中的内容清0CPL A ;将累加器A中的内容按位取反RL A ;将累加器A中的内容左移一位RR A ;将累加器A中的内容右移一位RLC A

31、 ;将累加器A中的内容连同进位位(CY)左移一位RRC A ;将累加器A中的内容连同进位位(CY)右移一位如图2.1 所示。A7 RL A A0RLC A C A7 A0RRC A C A7 A0RR A A7 A02. 逻辑与操作指令(6 条)这组指令的作用是对两个单元中的内容执行逻辑与操作。ANL A,direct ;对A中的内容和直接寻址单元中的内容执行与操作,结果存到A中ANL A,#data ;对A中的内容和立即数执行与操作,结果存到A中ANL A,Rn ;对A中的内容和寄存器Rn中的内容执行与操作,结果存到A中ANL A,Ri ;对A中的内容和工作寄存器Ri所指的地址单元中的内容执

32、行与操作,结果存到A中ANL direct,A ;对直接寻址单元中的内容和A中的内容执行与操作,结果存到直接寻址单元中ANL direct,#data ;对直接寻址单元中的内容和立即数执行与操作,结果存到直接寻址单元中在单片机的编程过程中,经常要对某个单元或寄存器的一个或几个位进行置位、清0、取反等操作,但又不能影响其他位的状态。用MCS-51指令系统中的ANL、ORL、XRL 指令就可以进行以上操作。【例2.8】 将累加器A 的第0、2、5 位清0,但不能不影响其他位。分析:要将一个单元或寄存器中的某些位清0、置1 或取反等,一般的解决办法是:根据问题的具体需要,先构造一个立即数,然后对该单

33、元或寄存器的内容与立即数进行合适的逻辑操作。逻辑与的真值表如下:A B Y0 0 00 1 01 0 01 1 1可以看出,两者中只要有一个为0,那么运算结果就是0。因此,要将某些位清0,显然要构造一个立即数与其进行与运算。要将A 的哪个位清0,那么立即数中对应的位就应为0,且其他位为1。程序:ANL A,#11011010B3. 逻辑或操作指令(6 条)这组指令的作用是对两个单元中的内容执行逻辑或操作。ORL A,direct ;对A中的内容和直接寻址单元中的内容执行或操作,结果存到A中ORL direct,#data ;对直接寻址单元中的内容和立即数执行逻辑或操作,结果存在直接寻址单元中O

34、RL A,#data ;对A中的内容和立即数执行逻辑或操作,结果存在A中ORL A,Rn ;对A中的内容和寄存器Rn中的内容执行逻辑或操作,结果存到A中ORL direct,A ;对直接寻址单元中的内容和A中的内容执行逻辑或操作,结果存在直接寻址单元中ORL A,Ri ;对A中的内容和工作寄存器Ri所指的地址单元中的内容执行或操作,结果存在A中【例2.9】 将累加器A 的第1、2、4 位置位,但不能影响其他位。逻辑或的真值表如下:A B Y0 0 00 1 11 0 11 1 1可以看出,两者中只要有一个为1,那么运算结果就是1。因此,要将A 的某些位置位,就要构造一个立即数与其进行或运算。要

35、将A的哪个位置位,那么立即数中对应的位就应为1,且其他位为0。程序:ORL A,#00010110B4. 逻辑异或操作指令(6条)这组指令的作用是对两个单元中的内容执行逻辑异或操作。XRL A,direct ;对A中的内容和直接寻址单元中的内容执行异或操作,结果存在A中XRL direct,#data ;对直接寻址单元中的内容和立即数执行异或操作,结果存在直接寻址单元中XRL A,#data ;对A中的内容和立即数执行异或操作,结果存在A中XRL A,Rn ;对A中的内容和寄存器Rn中的内容执行异或操作,结果存在A中【例2.10】 将累加器A 的第1、5、7 位取反,但不能影响其他位。逻辑异或

36、的真值表如下:A B Y0 0 00 1 11 0 11 1 0可以看出,两者相等时结果为0,不等时结果为1。若用0 异或某个位,则该位原先是多少,结果就是多少,不会改变;而用1 去异或某个位,则该位原先是0,就变成1,原先是1,就变成0。因此,要将某些位置位,可以考虑构造一个立即数与其进行异或运算。要将A的哪个位取反,那么该立即数中对应的位就应为1,且其他位为0。程序:XRL A,#10100010B再看几个逻辑操作的应用程序。【例2.11】 拆字程序。把8000H 单元的内容拆开,高位送到30H 中,低位送到31H 中。ORG 0000HAJMP MAINORG 0030HMAIN:MOV

37、 DPTR,#8000H ;将8000H单元的地址送到DPTR中MOVX A,DPTR ;读出8000H单元的内容MOV B,A ;把读出的内容暂存在B中SWAP A ;交换A中高低位的内容ANL A,#0FH ;屏蔽高位MOV 30H,A ;结果送到30H(实际内容是8000H的高4位)中MOV A,B ;再读入8000H中的内容ANL A,#0FH ;屏蔽高位MOV 31H,A ;结果送到31H(实际内容是8000H的低4位)中SJMP $END【例2.12】 拼字程序。将30H、31H 单元的低位内容合并,分别送到8000H 的高低位中。ORG 0000HAJMP MAINORG 003

38、0HMAIN:MOV A,30H ;读30H单元的内容到A中ANL A,#0FH ;屏蔽A的高位SWAP A ;交换高低位MOV B,A ;暂存到B中MOV A,31H ;读31H单元的内容到A中ANL A,#0FH ;屏蔽A的高位ORL A,B ;对A和B进行或操作,效果等同于相加MOV DPTR,#8000HMOVX DPTR,A ;将结果送入8000H单元中SJMP $END2.3.5 控制转移类指令程序的执行过程中,有时候需要改变执行的流程,即不一定将指令一条接一条地顺序执行下去,而是要跳过一些指令行往下走,或者回跳到原来已执行的某些指令行重新执行。要实现这种程序的跳转,就用到控制转移

39、类指令。这类指令可通过修改PC 的值实现以上操作。只要使PC 的值有条件或无条件地改变,就能改变程序的执行流程。有条件和无条件的跳转是实现分支程序设计、循环程序设计以及子程序设计的必要基础。MCS-51单片机有丰富的控制转移指令,包括无条件转移指令、条件转移指令、子程序调用和返回指令。1. 无条件转移指令无条件跳转指令的含义是当程序执行到该指令时,立即无条件转移到指令所指的目的地址去执行后面的程序。该类指令包括短转移指令、长转移指令、相对转移指令和间接转移指令。1) 短转移指令(1 条)AJMP addr11该指令的功能将11 位地址addr11 送到PC 的低11 位中,PC 的高5 位不变

40、。因为211B=2KB,所以利用短转移指令可以实现最大2KB范围内的“短距离”转移。2) 长转移指令(1 条)LJMP addr16该指令的功能是将16 位地址addr16 送到PC中,因为216B=64KB,所以利用长转移指令可以实现最大64B 范围内的“长距离”转移。例如,LJMP NEXT_NEXT:MOV A,#20H如果LJMP NEXT指令与NEXTMOV A, #20H 指令之间隔开的行不是很多,即这两条指令之间的“距离”(目标代码量)没有超过2KB,那么用AJMP 替换LJMP 可以实现同样的跳转功能。但是如果两条指令的“距离”太远,那么用AJMP 可能跳不到NEXT处,这时就

41、必须用LJMP 来实现“长距离”的跳转。3) 相对转移指令(1条)SJMP relrel 是一个带符号的8 位二进制数,能表示的范围是-128+127,它决定了相对转移距离的范围。转移的目的地址的计算公式为:目的地址=转移指令所在地址+转移指令字节数+ rel在编程过程中,通常会用一个标号来代替偏移量,程序可自动根据该标号得到偏移量,而不需要人工计算相对地址的值。SJMP NEXT_NEXT:MOV A,#20H简单地说,生成目标代码后,在SJMP NEXT 指令与NEXT 之间的“距离”(目标代码量)不能超过-128+127B,也就是说,SJMP 能够实现的跳转要更短些。4) 间接转移指令(

42、1条)JMP A + DPTR该指令的功能是将累加器A 中的8 位无符号数与数据指针DPTR 中的16 位数相加,其结果作为下一条指令的地址送入PC中,以使程序转移。利用这条指令可以方便地实现多分支转移程序的设计。做法就是先把DPTR 的内容固定,然后给累加器A 赋不同的值,即可实现多分支转移。2. 条件转移指令条件转移指令是指只有满足某种条件后程序才可实现转移。当条件满足时,程序按照指令提供的转移偏移量,转移到由PC 当前值与偏移量相加得到的目的地址去执行;当条件不满足时,程序顺序执行下一条指令。条件转移指令可以分为以下几类。1) 判断A中的内容是否为0的转移指令(两条)JZ rel ;若A

43、中的内容是0则转移,否则顺序执行下一条指令JNZ rel ;若A中的内容不是0则转移,否则顺序执行下一条指令指令中的rel 是一个相对于当前指令所在地址的8 位偏移量,是一个具体的数值。在实际应用中,常用下面的形式。JZ NEXT ;NEXT为一个标号JNZ NEXT编译器会自动根据标号名计算偏移量的值,至于这个值具体是多少,在一般情况下用户不必关心。2) 比较转移指令(4条)CJNE A,#data,rel ;(A)与data比较。如果A=data,则顺序执行,否则转移CJNE A,direct,rel ;(A)与(direct)比较,若相等则顺序执行,否则转移CJNE Rn,#data,r

44、el ;(Rn)与data比较,若相等则顺序执行,否则转移CJNE Ri,#data,rel ;(Ri)与data比较,若相等则顺序执行,否则转移这类指令是将指令中的前面两个操作数的值进行比较,以决定是否转移。如果两个值不相等则转移,否则顺序执行。根据前面所讲,rel 是一个相对于当前指令所在地址的8 位偏移量,是一个具体的数值,在实际使用中,会用程序中出现的一个标号来代替,编译器可自动根据标号名计算偏移量的值,因此用户一般无须关心其具体值是多少。3) 循环转移指令(两条)DJNZ Rn,rel ;先将Rn的内容减1,然后判断是否为0,如果不为0则跳转,否则顺序执行DJNZ direct,re

45、l ;先将direct所指存储器单元中的内容减1,然后判断其是否为0,如果不为0则跳转,否则顺序执行这组指令将减1 操作与条件转移这两种功能结合在一起,可以方便地设计出循环程序。【例2.13】 将片内RAM 的30H7FH 单元清0。MOV R0,#30H ;从30H单元开始清0MOV R6,#4FH ;总共有4F个单元需要清0,这就是循环次数CLEAR: MOV A,#00HMOV R0,A ;清0INC R0 ;让R0指向下一个存储器单元DJNZ R6,CLEAR ;若不到4F个字节,则跳到CLEAR处再清下一个单元SJMP $END2.3.6 位操作类指令MCS-51 单片机的内部硬件结

46、构中有一个位处理器,称为布尔处理器,其操作的对象不是字节或字,而是单个的位,且进行位操作时,以进位标志位(CY)作为位累加器。位操作的范围包括片内RAM字节地址20H2FH单元中连续的128个位(位地址为00H7FH),以及特殊功能寄存器中字节地址能被8 整除的位。1. 位传送指令(两条)MOV C,bit ;(bit)(C)MOV bit,C ;(C)(bit)这两条指令主要用于进位位(CY)与其他可寻址位之间的数据传送。值得注意的是,两个可寻址位之间不能直接进行数据传送,若要进行这种传送,需要通过C来中转。【例2.14】 将位地址30H 中的内容传送到位地址20H 中。MOV C,30HMOV 20H,C【例2.15】 试编程将00H 位中的内容和7FH 位中的内容互换。分析:可以采用01H 位作为暂存位。程序如下。ORG 0000HAJMP MAINORG 0030HMAIN:MOV C,00HMOV 01H,C ;暂存于01H位MOV C,7FH ;(7FH) CYMOV 00H,C ;存入00H位MOV C,01H ;将00H位中原来的内容送到CY中MOV 7FH,CSJMP $END2. 位修改指令(6 条)CLR

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1