有关单片机的指令系统,专业的来

数据传送指令有哪些... 数据传送指令有哪些 展开
 我来答
匿名用户
2013-11-16
展开全部
不让发那么多 所有分两次 这里接上面的4.循环移位指令(4条)
循环移位指令的功能是将累加器A中内容循环位移或者和进位位一起移位。
例 A=01H, Cy=1
若执行一次 RRC A后,结果为:A=10000000B Cy=1
若执行一次 RLC A后,结果为:A=00000011B Cy=0
5.取反、清0指令
CPL A ;累加器内容按位取反。如果1就变0,如果0就变1
CLR A ;累加器A清0 控制转移类指令计算机运行过程中,有时因为操作的需要,程序不能按顺序逐条执行指令,需要改变程序运行方向,即将程序跳转到某个指定的地址再顺序执行下去。
控制转移类指令的功能就是根据要求修改程序计数器PC的内容,以改变程序运行方向,实现转移。
控制转移类指令可分为:无条件转移、条件转移、绝对转移、相对转移和调用、返回指令。下面我们将分类介绍。
1.无条件转移指令(4条)
LJMP add16 ;add16→PC,无条件跳转到add16地址,可在64KB范围内
转移,称为长转移指令
AJMP add11 ;add11→PC,无条件转向add11地址,在2KB范围内转移
SJMP rel ;PC+2+rel→PC,相对转移,rel是偏移量,8 位有符号
数,范围-128~127,即可向后跳转128,向前可跳转127
JMP @A+DPTR ;A+DPTR→PC ,属散转指令,无条件转向A与DPTR内容相
加后形成的新地址
例1 执行指令
LJMP 9100H
不管这条指令存放在哪里,执行时将使程序转移到9100H,和AJMP,SJMP指令是有差别的。
例2 程序
2000H MOV R0 , #10H ;10H→PC
2002H SJMP 03H ;PC+2+rel=2002H+2+03H=2007H→PC
┇ ┇
2006H ┇
2007H ┇
从说明中可见,执行SJMP 03H 指令后,马上跳转到2007H地址执行程序。
2.条件转移指令(8条)
条件转移指令是根据某种特定条件转移的指令。条件满足时转移,条件不满足时则顺序
执行下面的指令。
JZ rel ;A=0转向PC+2+rel→PC,A≠0顺序执行
JNZ rel ;A≠转向PC+2+rel→PC ,A=0顺序执行
CJNE A, direct, rel ;A≠ (direct)转向PC+3+rel→PC且当A>(direct),Cy=0
;当A<(direct),Cy=1
;否则A=(direct),PC+3→PC即顺序执行
CJNE A, #data, rel ;A data P转向PC+3+rel→PC且当A >data,Cy=0
;当A <data,Cy=1,
;A=data,PC+3→PC顺序执行
CJNZ Rn, #data, rel ;Rn≠data转向PC+3+rel→PC
;且当Rn>data,Cy=0,当Rn<data,Cy=1
;Rn=data,PC+3→PC顺序执行
CJNE @Ri,#data, rel ;(Ri) ≠data ,PC+3+rel→PC
;且当(Ri)>data ,Cy=0,当(Ri)<data,Cy=1
;(Ri)=data, PC+3→PC顺序执行
DJNZ Rn, rel ;Rn-1→Rn ,Rn ≠0转向PC+2+rel→PC
;Rn=0,PC+2→PC顺序执行
DJNZ direct, rel ;(direct)-1→(direct),(direct) ≠0转向 PC+2+rel
→PC
;(direct)=0 ,PC+2→PC顺序执行
注意:
1)CJNE类指令借用进位标志Cy作为比较结果的标志位。从指令中可知,目的操作数内容小于原操作数内容Cy置1,反之Cy清0,该类指令多用于分支程序。
2) DJNZ指令执行时Rn或direct先减1,然后再判断Rn或direct内容是否等于0。不为0则转,为0顺序执行。DJNZ用在循环程序中,控制循环次数很方便。
3) JZ和JNZ的操作数只有一个,是对A的内容的进行判断的指令。
例1 以下程序的循环次数是多少,最后(R0)=?
MOV R0 , #0
LL: ┇
DJNZ R0 , LL
分析:由于DJNZ是减1再判断大小的,因为R0=0,所以第一次执行DJNZ R0 , LL后R0=FFH=255,则程序要执行的次数为256次,R0最后的值为0。
解:程序要循环的次数为256次,最后R0=0
3.调用、返回、控操作指令
在程序设计中,常常要把具有一定功能的公用程序编制成子程序。当主程序转至子
程序时用调用指令,而在子程序的最后安排一条返回指令,使执行完子程序后再返回到主程序。
(1) LCALL addr16 ;调用入口地址为addr16的子程序
这是一条长调指令,可调用64KB范围内的子程序,因此,可放在程序的任何位置。
指令的执行过程分两步:第一步把断点(当前执行指令的下一条指令地址)压入堆栈。第二步将调用的子程序的入口地址装入PC。即addr16(16位地址)→PC,转向执行子程序。
(2) ACALL addr11 ;子程序入口地址为addr11的子程序
这是一条短调指令,只能实现2KB范围内的子程序的调用。其指令执行过程与LCALL
指令一样。但是需要注意的是:ACALL中addr11只占用PC的PC.0~PC.10位。
(3) RET ;放在子程序最后,使程序准确返回到主程序断点处
执行过程为:(SP)→PC.8~PC.15断点地址高字节送入PC
SP-1→SP,(SP) →PC.0~PC.7断点低字节送入PC,
这时PC中为主程序断点地址,程序准确返回到调用指令的下一条。
例 设SP=62H,(62H)=07H,(61H)=30H,执行指令RET
结果:SP=60H,(PC)=0730H,CPU从0730H开始执行程序。
(4) RETI ;中断返回指令
该指令用于中断服务程序,使中断程序结束后准确返回到主程序断点处,执行过程同RET,它还能清除优先级状态。
(5) NOP ;空操作
执行该指令时,CPU只进行取指令、译码,而不进行任何操作,故称为控操作。常用于产生一个机器周期延时。位操作指令MCS-51单片机的特色之一是具有很强的位处理功能。位操作指令又称为布尔指令,其功能是对内部RAM中可进行位操作的区域进行位操作。
在进行位操作时,位累加器C即进位标志Cy,位地址是片内RAM字节地址20H~2FH单元中连续的128个位(位地址00H~7FH)和部分功能寄存器。凡SFR中字符等地址能被8整除的特殊功能寄存器都具有可寻址的位地址,其中ACC(位地址E0H~E7H),B(位地址F0H~F7H)和片内RAM中128个位都可作软件标志或存储位变量。
1. 位数据传送类指令(2条)
MOV C , bit ;(bit) →C,寻址位的状态送入C
MOV bit , C ;C→(bit),C的状态送入位地址中
2. 位修正指令(6条)
CLR C ;0→C, 清0累加器
CLR bit ;0→(bit);清0寻址位
CPL C ;/C→C,取反
CPL bit ;(/bit) →(bit),寻址位取反
SETB C ;1→C,C置1
SETB bit ;1→ (bit),寻址位置1
3. 位逻辑运算指令(4条)
ANL C , bit ;C∩(bit) →C,寻址位和C“与”,结果放在C
ANL C , /bit ;C∩(/bit) →C,寻址位的非和C“与”,结果放在C
ORL C , bit ;C∪(bit) →C,寻址位和C“或”,结果放在C
ORL C , /bit ;C∪(bit) →C,寻址位和C的非“或”,结果放在C
4. 位条件转移指令(5条)
JC rel ;C=1转向PC+2+rel→PC
C=0顺序执行PC+2→PC
JNC rel ;C=0转向PC+2+rel→PC
C=1顺序执行PC+2→PC
JB bit , rel ;(bit) =1转向PC+3+rel→PC
(bit) =0顺序执行PC+3→PC
JNB bit , rel ;(bit) =0转向PC+3+rel→PC
(bit) =1顺序执行PC+3→PC
JBC bit , rel ;(bit) =1转向PC+3+rel→PC;同时0→(bit)
(bit) =0顺序执行PC+3→PC
注意:JBC与JB指令区别,前者转移后并把寻址位清0,后者只转移不清0寻址位。
例1 设P1为输入口,P3.0作输出线,执行下列指令:
MOV C , P1.0 ;(P1.0) →C
ANL C , P1.1 ;(C)∩(P1.1) →C
ANL C , /P1.32 ;(C)∩(/P1.2) →C
MOV P3.0 , C ;C→P3.0
结果是:P3.0=(P1.0) ∩(P1.1) ∩(/P1.2)
例2 用位操作指令编程计算逻辑方程
P1.5=ACC.0 ∩ (B.0∪P1.2) ∪P1.3
解: MOV C , B.0 ;B.0→C
ORL C , P1.2 ;C∪P1.2→C 即B.0+P1.2→C
ANL C , ACC.0 ;C∩ACC.0→C 即ACC.0∩(B.0∪P1.2)→C
ORL C , P1.3 ;C∪P1.3→C 即 ACC.0∩(B.0∪P1.2)∪P1.3→C
MOV P1.5 , C ;C→P1.5
匿名用户
2013-11-16
展开全部
数据传送指令 数据传送指令包括数据的传送、交换、堆栈数据的压入与弹出,是最基本、使用率最高的一类指令。助记符有MOV、MOVX、MOVC、XCH、XCHD、SWAP、PUSH、POP共八种。
1.MOV类指令及功能(16条)
这类指令的功能是从源操作数到目的操作数的数据传送。
MOV A, Rn ;Rn→A,寄存器Rn的内容送到累加器A
MOV A, direct ;(direct)→A,直接地址中的内容送A
MOV A, @Ri ;(Ri)→A,Ri间址的内容送A
MOV A, #data ;data→A,立即数送A
MOV Rn,, A ;A→Rn,累加器A中的内容送寄存器Rn
MOV Rn, direct ;(direct)→Rn;直接地址中的内容送Rn
MOV Rn, #data ;data→Rn;立即数送Rn
MOV direct, A ;A→(direct),A中的内容送入直接地址中
MOV direct, Rn ;Rn→(direct),寄存器内容送入直接地址中
MOV direct, direct ;(direct) →(direct),源操作数直接地址的内容送入
;目的操作数的直接地址中
MOV direct, @Ri ;(Ri)→(direct),Ri间址内容送入直接地址中
MOV direct, #data ;data→(direct),立即数送入直接地址中
MOV @Ri, A ;A→(Ri),A中内容送到Ri间址单元中
MOV @Ri, direct ;(direct)→(Ri),直接地址中内容送入Ri间址单元中
MOV @Ri, #data ;data→(Ri),立即数送入Ri间址单元中
MOV DPTR, #data16 ;data16→DPTR,16位常数送入数据指针DPTR中,高8
;位送入DPH,低8位送入DPH,低8位送入DPL中
从上述指令可以看出目的操作数有A累加器、Rn寄存器、直接地址direct及间接地址@Ri,源操作数除此之外还多一种立即数data。
例1 R0中有常数30H,而30H地址中有常数50H
执行MOV A, R0后,A=30H,R0不变。
执行MOV A, @R0后A=50H,而不是30H,这条指令的功能是把R0中内容为地址的单元的书送入A,R0中是30H也就是把30H地址中内容50H送入A。
例2 若(40H)=20H,(50H)=30H
执行MOV 40H, 50H; (50H) →(40H)
结果:(40H)=30H,50H地址中内容仍为30H。
例3 若A=40H,R0=30H,
执行MOV @R0, A ;A→(R0)
结果:(30H)=40H,A与R0皆不变,即A=40H,R0=30H。
该指令功能是把A中内容送入R0间址单元即R0中内容为地址的单元。
例4 执行MOV DPTR, #2040H ;2040H→DPTR
结果:DPH=20H, DPL=40H
DPTR是片外RAM地址指针,只有这一条指令是传送16位数据。
2.MOVC类指令及功能(2条)
MOVC A, @A+PC ;PC+1→PC, (A+PC) →A
MOVC A, @A+DPTR ;(A+DPTR) →A
功能:该类属于查表指令,利用这两条指令很方便地查找放在程序存储器中数据表格的内容。
例1 程序
1000H MOV A, #10H ;10H→A
1002H MOVC A, @A+PC ;PC+1→PC,PC=1003H,(A+PC)=(10H+1003H)→A
...
1010H 02H
1011H 04H
1012H 06H
1013H 08H
程序执行结果:A=08H
用MOVC A, @A+PC指令需注意两点:
1)指令中的PC是执行完本条指令后的PC值,即PC等于本条指令地址加1。
2)A是修正值,它等于查表指令和欲查数据相间隔字节数。A的范围是0~255,一次该指令只能查找本指令后的256B范围内的表格,故称为近程查表。
例2 程序
1000H MOV A, #01H ;01H→A
1002H MOV DPTR, #6000H ;6000H→DPTR
1005H MOVC A,@A+DPTR ;(A+DPTR)=(01H+6000H)=(6001H) →A
...
6001H 0AH
6002H 0BH
6003H 0CH
6004H 0DH
程序执行结果:A=0AH,查到了地址为6001H单元中的数据。
用MOVC A, @A+DPTR指令查表特点:A, DPTR都可以改变,因此可在64KB范围内查表,故称为远程查表。这条指令更方便。
3.MOVX类指令(4条)
MOVX A, @DPTR ;(DPTR) →A,DPTR间址单元内容送A
MOVX @DPTR, A ;A→(DPTR), A 中内容送入DPTR间址单元
MOVX A, @Ri ;(Ri) →A,Ri间址单元内容送A
MOVX @Ri, A ;A→(Ri), A中内容送Ri间址单元
MOVX类指令功能:这四条指令专门用来与外部数据存储区传送数据。CPU与外部RAM传送数据时只能用间接寻址方式。
例1 把外部数据存储单元2000H中的数据送到4000H单元中,设2000H中有数据30H。
程序 各条指令执行结果
MOV DPTR, #2000H ;2000H DPTR, DPTR=2000H
MOVX A, @DPTR ;(DPTR) A即(2000) A,A=30H
MOV DPTR, #4000H ;4000H→DPTR, DPTR=4000H
MOVX @DPTR, A ;A→(DPTR)即A→(4000H), (4000H)=30H
例2 把内部RAM50H单元数据送到片外20H单元,设50H中单元存有数据10H。
程序 各条指令执行结果
MOV A,50H ;(50H) 各条指令执行结果A, A=10H
MOV R0,#20H ;20H→R0, R0=20H
MOVX @R0, A ;A→(R0)即A→(20H)则20H=10H
注意:与外部RAM传送数据时,地址小于256B用Ri间址,大于256B时用DPTR间址。
4.交换指令
XCH A, Rn ;Rn A, Rn与A内容交换
XCH A,direct ;(direct) A, 直接地址内容与A内容交换
XCH A, @Ri ;(Ri) A,Ri间址内容与A内容交换
XCHD A, @Ri ;(Ri.3~Ri.0) A.3~A.0, Ri间址内容低4
位与A中低4 位内容交换
SWAP A ;A.3~A.0 A.7~A.4, A中高4位与低4位
交换
例 若R0=30H, A=F0H, (30H)=46H
执行 XCH A, R0 ;结果:A=30H,R0=F0H, R0与A 内容交换
执行 XCH A, @R0 ;结果:A=46H, (30H)=F0H, R0中不变,
;实际上是(R0) A即(30H) A
若执行 XCHD A, @R0 ;结果:A=F6H,(30)H=40H
;A与(30H)中低4位交换,高4位不变
执行 SWAP A ;结果:A=0FH, 高低4位互换
5.堆栈操作指令(2条)
PUSH、POP属堆栈操作指令,其功能是把直接地址中的内容压入堆栈保存,或从堆栈中取出(弹出)数据到直接地址中。
PUSH direct ;SP+1→SP, (direct) →(SP)
;直接地址内容压入堆栈顶
POP direct ;(SP)→(direct), SP-1→SP
;堆栈栈顶内容弹出到直接地址
注意:堆栈是用户自己设定的内部RAM中的一块专用存储区,使用堆栈时一定先设堆栈指针。堆栈遵循后进先出的原则安排数据。压入数据时SP先加1,再压入;弹出时,先弹出数据,SP再减1。
例 设堆栈指针为30H,为保护现场把A和B中的内容压入堆栈保护,然后根据需要再把两者弹出。设A中为30H,B中为01H。
程序 执行结果
MOV SP, #30H ;30H→SP, SP=30H设堆栈指针为30H
PUSH ACC ;SP+1→SP=31H, A→(SP)即A→(31H),(31H)=30H
PUSH B ;SP+1→SP=32H, B→(SP)即B→(32H),(32H)=01H
POP B ;SP→B即(32H)→B, B=01H, SP-1→SP=31H
POP ACC ;SP→A即(31H)→A, A=30H, SP-1→SP=30H
从此例可以看出压入、弹出过程SP的变化规律算术运算指令算术运算指令的主要功能是实现算术加、减、乘、除等运算。
1.ADD类指令是不带进位的加法运算指令(4条)。
ADD A,Rn ;A+Rn→A, A与Rn寄存器内容相加,结果送到A中
ADD A,direct ;(direct)+A→A, A与直接地址内容相加,和送A
ADD A, @Ri ;(Ri)+A→A, A与Ri间址内容相加,和送A
ADD A, #data ;data+A→A, A与立即数相加,和送A
注意:ADD类指令相加结果均在A中,相加后源操作数不变。若A中最高位有进位,Cy置1;若半加位有进位,AC置1。A的结果还影响奇偶标志位P。
例 A=30H, R0=10H
执行 ADD A,R0 结果:A=40H, R0=10H,标志位 P=1, Cy=0, OV=0, AC=0
2.ADDC类指令(带进位加法4条)
ADDC A, Rn ;A+Rn+Cy→A, A与R n内容、进位状态相加,和送
到A中
ADDC A, direct ;(direct)+Cy+A→A, A与直接地址中内容、进位状态
相加,和送A
ADDC A, @Ri ;(Ri)+Cy+A→A, A与Ri间址单元中内容、进位状态
相加,和送A
ADDC A, #data ;data+Cy+A→A, A与 立即数、进位状态相加,和送A
与ADD类指令的区别是,ADDC指令相加时连同进位标志Cy内容一起相加,主要用于多字节加法中的高位字节的相加,而最低位字节相加用ADD指令。进位位Cy加到字节的最低位。
例 编写计算1234H+0FE7H的程序,将结果存入内部RAM的41H和40H单元,40H存低8位,41H存高8位。
程序
MOV A, #34H ;被加数低8位数34H送A
ADD A, #0E7H ;加数低8位数E7H与之相加,A=1BH,Cy=1
MOV 40H, A ;A→40H即34H+E7H结果存入40H中(40H=1BH)
MOV A, #12H ;被加数高8位数12H送A
ADDC A, #0FH ;加数高8位0FH和Cy与A相加,A=22H
MOV 41H, A ;高8位与进位位之和存入41H中(41H)=22H
;总和为221BH,总结果在41H,40H单元中
3.SUBB类指令(4条)
SUBB类指令是带借位减法指令,其功能是将A中被减数减去源操作数指出的内容,再减去借位标志Cy(原进位标志)状态,差值在A中。
SUBB A, Rn ;A-Rn-Cy→A ,A减寄存器Rn内容及进位标志
SUBB A, direct ;A-(direct)-Cy→A,A减直接地址内容和进位标志
SUBB A, Ri ;A-(Ri)-Cy→A, A减Ri间址单元内容和进位位标志
SUBB A, #data ;A-data-Cy→A, A减立即数和进位标志
说明:
1) 多字节减法时,低位相减有借位则把Cy置1,否则Cy为0。
2) MCS-51系列指令中没有不带借位的减法指令,所以在单字节或低位字节减法时用SUBB类指令前要先将Cy清0。
3)减去一个数实际上是加上这个数的相反数(负数),减法运算常常用补码相加方式。
4.MUL(乘)和DIV(除)指令
乘法指令只有一条:
MUL AB ;A×B→B和A,结果16位,高8位存入B,低8位在A中
若乘积大于FFH则将溢出标志OV置1。
除法指令也只有一条:
DIV AB ; A÷B商→A,余数→B
注意:当除数为0时结果不确定,则溢出将OV置1。
5.INC(加1)和DEC(减1)类指令
加1类指令共5条,其功能是将操作数内容加1。
INC A ;A+1→A, A加1
INC Rn ;Rn+1→Rn, Rn中内容加1
INC direct ;(direct)+1→(direct), 直接地址中内容加1
INC @Ri ;(Ri)+1→(Ri), Ri间址中的内容加1
INC DPTR ;DPTR+1→DPTR, 数据指针加1
例 判断INC R0和INC @R0两条指令结果,比较两者的区别。设R0=30H,(30H)=00H。
执行 INC R0 ;R0+1=30H+1→R0, 结果R0=31H
执行 INC @R0 ;(R0)+1=(30H)+1→(R0),结果(30H)=01H,R0中内
容不变,仍为30H
减1类指令共4条,其功能是将操作数指定单元内容减1。
DEC A ;A-1→A, A中内容减1
DEC Rn ;Rn-1→Rn, Rn中内容减1
DEC direct ;(direct)-1→(direct), 直接地址中内容减1
DEC @Ri ;(Ri)-1→(Ri), Ri间址中的内容减1
操作过程与加1指令类似,这里不再举例。
6.十进制加法调整指令(1条)
DA A
功能:在加法指令后,把A中二进制码自动调整成BCD码。
例 MOV A, #05H ;05H→A
ADD A, #08H ;05H+08H→A=0DH
DA A ;结果调整A=13H,即是13的BCD码
注意:DA A指令只能跟在ADD或ADDC加法指令后,不适用于减法。逻辑运算指令1.ANL类指令(6条)
ANL类是逻辑与指令,其功能是将源操作数作数内容和目的操作数内容按位相“与”,结果存入目的操作数指定单元中,源操作数不变。
ANL A, Rn ;A∩Rn→A
ANL A, direct ;A∩(direct) →A
ANL A, @Ri ;A∩(Ri) →A
ANL A, #data ;A∩data→A
ANL direct, A ;(direct)∩A→(direct)
ANL direct, #data ;(direct)∩data→(direct)
例 设A=F6H,(30H)=0FH
执行 ANL A, 30H ;A∩ (30H) →A
操作如下:
11110110 (F6H)
∩ 00001111 (0FH) 注意:按位相“与”
00000110 (06H)
结果:A=06H, 30H地址内容不变,即(30H)=0FH
若执行ANL 30H, A ;(30H)∩ A→(30H)
操作同上,结果放在30H地址中,A中内容不变,即(30H)=06H, A=F6H。
2.ORL类指令(6条)
ORL类指令是逻辑或指令,其功能是将源操作数作数内容和目的操作数内容按位逻辑“或”,结果存入目的操作数指定单元中,源操作数不变。
ORL A, Rn ;A∪Rn→A
ORL A,direct ;A∪(direct) →A
ORL A, @Ri ;A∪(Ri) →A
ORL A, #data ;A∪data→A
ORL direct, A ;(direct)∪A→(direct)
ORL direct, #data ;(direct)∪data→(direct)
“或”运算和“与”运算过程类似,这里不再举例。
3.XRL类指令(6条)
XRL类是异或指令,其功能是将两个操作数指定内容按位“异或”,结果存于目的操作数指定单元中。“异或”原则是相同为“0”,相异为“1”。
XRL A, Rn ;A⊕Rn→A
XRL A, direct ;A⊕(direct) →A
XRL A, @Ri ;A⊕(Ri) →A
XRL A, #data ;A⊕data→A
XRL direct, A ;(direct)⊕A →(direct)
XRL direct, #data ;(direct)⊕data→(direct)
例 (50H)=05H
执行 XRL 50H, #06H ;(50H)⊕06H→(50H)
操作如下:
00000101 (05H)
⊕ 00000110 (06H)
00000011 (03H)
结果:(50H)=03H
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式