890 likes | 966 Views
指令系统与汇编语言程序设计. 指令和助记符. 指令本身是一组二进制数代码,为了便于 记忆,将这些代码用具有一定含义的指令助记 符来表示,助记符一般采用英文单词的缩写 。 例: 指令代码 助记符 功能 740A MOV A , #0AH 将十六进制数 0AH 放 入累加器 A 中. 指令的字节数.
E N D
指令和助记符 指令本身是一组二进制数代码,为了便于 记忆,将这些代码用具有一定含义的指令助记 符来表示,助记符一般采用英文单词的缩写 。 例: 指令代码 助记符 功能 740A MOV A,#0AH 将十六进制数0AH放 入累加器A中
指令的字节数 一条指令由操作码和操作数组成。操作码 指明执行什么操作,例如数的传送、加法、减 法等。操作数则表示这条指令所完成的操作对 象,即是对谁进行操作。操作数可以是一个数, 或者是一个数所在的内存地址。指令由指令字 节组成,不同的指令,指令的字节数不相同。 有单字节指令、双字节指令和三字节指令。
寻址方式 1 寄存器寻址 2 直接寻址 3 立即寻址 4 寄存器间接寻址 5 变址寻址 6 相对寻址 7 位寻址
寄存器寻址 以通用寄存器的内容为操作数的寻址方式。 通用寄存器为A、B 、DPTR以及R0~R7。 例: CLR A ;A←0 INC DPTR ;DPTR←DPTR+1 ADD R5,# 20H ;R5←#20H+R5
直接寻址 指令中直接给出操作数地址的寻址方式, 能进行直接寻址的存储空间有SFR寄存器和内 部数据RAM。 例: MOV PSW,# 20H ;PSW←#20H MOV A,30H ;A←(30H)
立即寻址 指令中直接给出操作数的寻址方式。立即操 作数用前面加有#号的8位或16位数来表示。 例: MOV A,# 60H ;A←#60H MOV DPTR,# 3400H ;DPTR←#3400H MOV 30H,# 40H ;30H单元←#40H
寄存器间接寻址 以寄存器中内容为地址,以该地址中内容为操 作数的寻址方式。间接寻址的存储器空间包括内 部数据RAM和外部数据RAM。能用于寄存器间接 寻址的寄存器有R0,R1和DPTR。在寄存器名称 前面加一个符号@来表示寄存器间接寻址。 例: MOV A , @R0 ;A ← ((R0)) MOVX @DPTR,A ;外部RAM(DPTR)←A
片内RAM R0 30H 30H 34H A 34H MOV A ,@R0 操作示意图
MOVX @DPTR,A 操作示意图 片外RAM DPTR 2000H 2000H 30H A 30H
5 变址寻址 变址寻址是以某个寄存器的内容为基本地 址,然后在这个基址上加以地址的偏移量,才是 真正的操作数地址。 例: MOVC A,@ A+DPTR ;A←(A+DPTR) MOVC A,@ A+PC ;A←(A+PC)
程序存储器 02F1H DPTR A 0302H 1EH + 11H A执行前 1EH A执行后 MOVC A, @A+DPTR操作示意图
相对寻址 以当前程序计数器PC的内容为基础,加上 指令给出的一字节补码数(偏移量)形成新的 PC值的寻址方式。相对寻址用于修改PC值, 主要用于实现程序的分支转移。 例: SJMP 08H ;PC←PC+2+08H
程序存储器 执行前PC 2000H SJMP 2000H+2 08H 08H 执行后PC 200AH SJMP 08H操作示意图
7 位寻址 位寻址只能对有位地址的单元作位寻址操 作。位寻址其实是一种直接寻址方式,不过其 地址是位地址。 例: SETB 10H ;将10H位置1 MOV 32H,C ;32H←进位位C CLR PSW.4 ;将RS1位清0
指令分类说明 1算术运算类指令 2逻辑运算与循环类指令 3数据传送类指令 4 程序转移类指令 5 子程序调用及返回指令 6 位操作指令
算术运算类指令 主要用于8位无符号数运算;也可用于带符号数运算。包括:加、减、乘、除、加1、减1运算指令, 指令操作将影响PSW中有关状态位。
1加法指令 (1)不带进位位的加法指令(4条) ADD A,#data ADD A,direct ADD A,Rn ADD A,@Ri 用途:将A中的值与源操作数所指内容相加,最终结果 存在A中。
例1:ADD A,#47H ADD A,34H ADD A,R7 ADD A,@R0 例2:MOV A,#0AEH ;-82 ADD A,#81H ;-127 则执行完本条指令后,A中的值为2FH PSW中状态位 C=1,AC=0,OV=1,P=1 对无符号数:结果为12FH; 对带符号数:OV=1,有错。
(2)带进位位的加法指令(4条) ADDC A,Rn ; A+Rn+CY→A ADDC A,direct; A+(direct )+CY→A ADDC A,@Ri; A+(Ri)+CY→A ADDC A,#data; A+data+CY→A 用途:将A中的值和其后面的值以及进位位C中的值相加, 最终结果存在A,常用于多字节数运算中。
例: 1067H+30A0H 1067H 0001 0000 0110 0111 30A0H 0011 0000 1010 0000 4107H 0100 0001 0000 0111 先做67H+A0H=107H,而107H显然超过了0FFH,因此最终保存在A中的是07H,而1则到了PSW中的CY位了。换言之,CY就相当于是100H。 然后再做10H + 30H + CY,结果是41H,所以最终的结果是4107H。
又例: 1067H+3020H 1067H 0001 0000 0110 0111 3020H 0011 0000 0010 0000 4087H 0100 0000 1000 0111 先做67H+20H=87H,没有超过0FFH,因此最终保存在A中的是87H,而PSW中的CY=0。 然后再做10H + 30H + CY,结果是40H,所以最终的结果是4087H。
(3) 加1指令(5条) INC A ;A+1→A,影响P标志 INC Rn;Rn+1→Rn INC direct;(direct)+1→(direct) INC @Ri;(Rn)+1→(Rn) INC DPTR;DPTR+1→DPTR 功能很简单,就是将后面目标中的值加1。 例:A=12H,R0=33H,(21H)=32H, (34H)=22H,DPTR=1234H。 连续执行下面的指令: INC A INC R0 INC 21H INC @R0 INC DPTR ; A=13H ; R0=34H ;(21H)=33H ;(34H)=23H ; DPTR=1235H
(4) 十进制调整指令(1条) DA A 在进行BCD码加法运算时,跟在ADD和ADDC指令之后,用来对BCD码加法运算结果进行自动修正。 例:A=00010101(代表十进制数15) ADD A,#8 ; A=1DH,按二进制规律加 DA A ; A=23H,按十进制规律加
2 减法指令(8条) (1) 带借位的减法指令(4条) SUBB A,Rn; A-Rn-CY→A SUBB A,direct ; A-(direct )-CY→A SUBB A,@Ri ; A-(Ri)-CY→A SUBB A,#data ; A-data-CY→A 将A中的值减去源操作数所指内容以及进位位C中的 值,最终结果存在A中。 说明:没有不带借位的减法指令,如果需要做不带位的减法指令(在做第一次相减时),只要将CY清零即可。
(2) 减1指令(4条) DEC A;A-1→A, DEC Rn;Rn-1→Rn DEC direct;(direct)-1→(direct) DEC @Ri;(Rn)-1→(Rn) 与加1指令类似。
3 乘法指令(1条) MUL AB;A×B→BA 此指令的功能是将A和B中的两个8位无符号数相乘,结果将为16无符号数。其中高8位放在B中,低8位放在A中。在乘积大于FFH时,0V置1,否则OV为0;而CY总是0。 例: A=4EH,B=5DH, 执行MUL AB指令后,乘积是1C56H,所以在B中放的是1CH,而A中放的则是56H。
4 除法指令(1条) DIV AB;A÷B的商→A,余数→B 此指令的功能是将A中的8位无符号数除B中的8位 无符号数,商放在A中,余数放在B中。 如果在做除法前B中的值是00H,也就是除数为0,那么0V=1。 例: A=11H,B=04H, 执行DIV AB指令后,结果为:A=04H,B=1。
逻辑运算与循环类指令 • 主要用于对2个操作数按位进行逻辑操作,结果送到 • A或直接寻址单元。 • 主要操作 与、或、异或、移位、取反、清零等。 • 对标志位的影响 除了目的操作数为ACC的指令影响奇偶标志P外,一般不影响标志位。
影响P标志 1 逻辑或指令(6条) 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) 后两条指令,若直接地址为I/O端口,则为“读-改写”操作。 例:71H和56H相或: 01110001 (71H) ∨) 01010110 (56H) 01110111 即77H
影响P标志 2 逻辑与指令 (6条) 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) 后两条指令,若直接地址为I/O端口,则为“读-改写”操作。 例:71H和56H相与: 01110001 (71H) ∧)01010110 (56H) 01010000 即50H
影响P标志 3 逻辑异或指令(6条) 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) 后两条指令,若直接地址为I/O端口,则为“读-改写”操作。 例:71H和56H相异或: 01110001 (71H) ⊕) 01010110 (56H) 00100111 即27H
4 取反与清0指令(2条) 取反:CPL A ;/A→A 例:若A=5CH, 执行CPL A 结果:A=A3H 清0:CLR A ;0→A
A.7 A.0 A.7 A.0 A.7 A.0 CY CY A.7 A.0 5 循环移位指令(4条) RL A RR A RLC A RRC A 后两条指令,影响P和CY标志。
0101 1100 1011 1001 1 0 例: 若A=5CH,CY=1,执行RLC A后, 结果:A=B9H,CY=0,P=1 • 对RLC、RRC指令,在CY=0时 • RLC相当于乘以2 • RRC相当于除以2
综合举例: 把累加器A中的低4位状态,通过P1口的高4位输出, P1口的低4位状态不变。 ANL A,#0FH ;屏蔽A的高4位 SWAP A ANL P1,#0FH ;清P1口高4位 ORL P1,A ;P1口高4位输出A的低4位;
数据传送类指令 • 助记符 说明 • MOV、MOVX、MOVC 传送操作 • XCH、XCHD、SWAP 交换操作 • PUSH、POP 堆栈操作 • 源操作数寻址方式: 立即寻址、直接寻址、寄存器寻址、 寄存器间接寻址、变址寻址。 • 目的操作数寻址方式: 直接寻址、寄存器寻址、寄存器间接寻址 • 除了目的操作数为ACC的指令影响奇偶标志P外,一般不影 • 响标志位。
直接地址 direct 累加器 A 直接地址 direct 间接地址 @Ri 寄存器 Rn 立即数 #data 寄存器 DPTR 8051单片机片内数据传送图
1 以累加器为目的操作数的指令(4条) MOV A,Rn MOV A,direct MOV A,@Ri MOV A,#data 这组指令功能将源操作数指定内容送到A中。 2 以寄存器Rn为目的操作数的指令(3条) MOV Rn,A MOV Rn,direct MOV Rn,#data 这组指令功能是把源操作数指定的内容送入当前工作寄存 器,源操作数不变。
3 以直接地址为目的操作数的指令(5条) MOV direct,A MOV direct,Rn MOV direct1,direct2 MOV direct,@Ri MOV direct,#data 这组指令功能是把源操作数指定的内容送入由直接地址指出的片内存储单元。 例:MOV 20H,A MOV 20H,R1 MOV 20H,30H MOV 20H,@R1 MOV 0A0H,#34H MOV P2,#34H
4 以间接地址为目的操作数的指令(3条) MOV @Ri,A MOV @Ri,direct MOV @Ri,#data 功能:把源操作数指定的内容送入以R0或R1中内容为 地址的片内存储单元。 例:MOV @R0,A MOV @R1,20H MOV @R0,#34H
5 十六位数的传递指令(1条) MOV DPTR,#data16 8051是8位机,这是唯一的一条16位立即数传递指令。 功能:将一个16位的立即数送入DPTR中去。其中高8位 送入DPH,低8位送入DPL。 例:MOV DPTR,#1234H 执行完了之后DPH中的值为12H,DPL中的值为34H。 如果我们分别向DPH,DPL送数,则结果也一样。 如下面两条指令: MOV DPH,#35H MOV DPL,#12H。 相当于执行了 MOV DPTR,#3512H。
6 累加器A与片外RAM之间的数据传递类指令(4条) MOVX A,@DPTR MOVX @DPTR,A MOVX A,@Ri MOVX @Ri,A 说明: (1).在8051中,与外部RAM存储器打交道的只可以是累加器A 。所有需要送入外部RAM的数据必需要通过A送去,而所有要读入的外部RAM中的数据也必需通过A读入。 在此我们可以看出内外部RAM的区别了,内部RAM间可以直接进行数据的传递,而外部则不行。 比如,要将外部RAM中某一单元(设为0100H单元的数据)送入另一个单元(设为0200H单元),也必须先将0100H单元中的内容读入A,然后再送到0200H单元中去。
(2).要读或写外部RAM,必须要知道RAM的地址,采用DPTR时,地址被直接放在DPTR中的。采用Ri(R0或R1)时,由于Ri只是8位的寄存器,所以只提供低8位地址。高8位地址由P2口来提供。 (3).使用时应先将要读或写的地址送入DPTR或Ri中,然后再用读写命令。 例:将外部RAM中100H单元中的内容送入外部RAM中200H单元中。 MOV DPTR,#0100H MOVX A,@DPTR MOV DPTR,#0200H MOVX @DPTR,A
7 读程序存储器指令(2条) MOVC A,@A+DPTR MOVC A,@A+PC 本组指令是将ROM中的数送入A中。本组指令也被称为查表指 令,常用此指令来查一个已做好在ROM中的表格 说明:查找到的结果被放在A中,因此,本条指令执行前后,A 中的值不一定相同。 例:有一个数在R0中,要求用查表的方法确定它的平方值(此 数的取值范围是0-5) MOV DPTR,#100H MOV A,R0 MOVC A,@A+DPTR …… ORG 0100H DB 0,1,4,9,16,25
8 堆栈操作(2条) PUSH direct POP direct 第一条为压入指令,将direct中的内容送入堆栈中,第二条为 弹出指令,将堆栈中的内容送回到direct中。 例:MOV SP,#10H MOV 40H,#50H PUSH 40H POP 30H 执行第一条PUSH 40H指令是这样的:将SP中的值加1,变为11H,然后将40H中的值送到11H单元中,因此执行完本条指令后,内存11H单元的值是50H,同样,执行POP 30H时,是将11H中的值送入到30H单元中,即执行完本条指令后,30H单元中的值变为50H。
9 交换指令(5条) XCH A,Rn XCH A, direct XCH A, @Ri XCHD A, @Ri SWAP A 例: 已知A中的内容为34H MOV R6, #29H XCH A, R6 SWAP A XCH A, R6 XCHD A, @R0
程序转移类指令 • 此类指令一般不影响PSW。 • 包括以下类型: • 无条件转移和条件转移 • 相对转移和绝对转移 • 长转移和短转移 • 调用与返回指令
无条件转移类指令(4条) • 短转移类指令:AJMP addr11 • 长转移类指令:LJMP addr16 • 相对转移指令:SJMP rel • 间接转移指令:JMP @A+DPTR (1)上面的前三条指令,统统理解成:PC值改变,即跳转到一个标号处。 那么他们的区别何在呢?
跳转的范围不同。 转移范围: 2KB 64KB -128~+127 • 短转移类指令:AJMP addr11 • 长转移类指令:LJMP addr16 • 相对转移指令:SJMP rel • 指令构成不同。 AJMP、LJMP后跟的是绝对地址, 而SJMP后跟的是相对地址。 • 指令长度不同 • 原则上,所有用SJMP或AJMP的地方都可以用 LJMP来替代。