1、主讲:潘静,第3章 单片机汇编程序设计,3.1 单片机指令系统概述3.2 80C51 单片机指令寻址方式3.3 80C51 单片机指令分类介绍3.4 常用伪指令3.5 汇编程序设计,3.1 单片机指令系统概述,指令: 规定计算机基本操作的语句或命令。指 令通常有两个组成部分:操作码和操作数。指令系统:一个单片机所能执行的指令集合即为它的指令系统。,一条汇编语言指令中最多包含 4 个区段, 如下所示: 标号: 操作码 操作数 ;注释4 个区段之间要用分隔符分开,标号与操作码之间用“:”隔开, 操作码与操作数之间用空格隔开, 操作数与注释之间用“;”隔开, 如果操作数有两个以上, 则在操作数之间要
2、用逗号“,”隔开 (乘法指令和除法指令除外 )。,5,1. 先通读指令,了解有哪些类型、基本操作情况、使用场合。个人可做些归纳和总结。2. 阅读书中或别人的有关程序,其中的应用技巧,必要时再回来查有关内容。3. 自己编写程序,上机实验,体会指令的作用和编程技巧。4. 参与实际项目,在实战过程中使用和提高。,掌握熟悉指令的一些方法,80C51指令中使用的符号的意义作简要说明:,Rn: 表示当前工作寄存器R0R7中的任一寄存器n=07。 Ri: 可用作间接寻址的寄存器,只能是R0, R1 两个 寄存器,i=0,1。 direct: 8位直接地址,在指令中表示直接寻址方 式,寻址范围256个单元。#
3、data: 8位立即数。#data16:16位立即数。,addr16:表示16位目的地址,主要用于LCALL和 LJMP指令中。 addr11:表示11位目的地址,主要用于ACALL和AJMP指令中。 rel: 相对转移指令中的偏移量,为8位带符号补码。 DPTR: 数据指针。 bit: 内部RAM(包括专用寄存器)中的直接寻址位。 A: 累加器。 ACC: 直接寻址方式的累加器。,B:寄存器B。C :进位标志位,也称为累加位。/ :加在位地址的前面,表示对该位状态取反。:间接寻址寄存器的前缀标志。(X):某寄存器或某单元中的内容。(X):由“X”间接寻址单元中的内容。:箭头左边的内容被箭头右
4、边的内容所取代。,所谓寻址方式, 就是寻找操作数地址的方式, 在用汇编语言编程时, 数据的存放、传送、 运算都要通过指令来完成。 编程者必须自始至终都要十分清楚操作数的位置, 以及如何将它们传送到适当的寄存器去参与运算。每一种计算机都具有多种寻址方式。寻址方式的多少是反映指令系统优劣的主要指标之一。,3.2 80C51 单片机指令寻址方式,在 MCS -51单片机指令系统中, 有以下7种寻址方式: (1) 立即寻址;(2) 直接寻址;(3) 寄存器寻址;(4) 寄存器间接寻址;(5) 基址寄存器加变址寄存器间接寻址;(6)位寻址(7)指令寻址,绝对寻址 相对寻址,1. 直接寻址方式,定义:指令
5、中操作数直接以存储单元地址的形式给出。 例如:MOV A , 3AH 特点:指令中含有操作数的地址。该地址指出了参与操作的数据所在的字节单元地址或位地址。计算机执行它们时便可根据直接地址找到所需要的操作数。 寻址范围:片内RAM(低128字节)、专用寄存器。,2. 立即寻址方式,定义:将立即参与操作的数据直接写在指令中,这种寻址方式称为立即寻址。 例如 MOV A , #3AHMOV DPTR, #data16 特点:指令中直接含有所需的操作数。该操作数可以是8位的,也可以是16位的,常常处在指令的第二字节和第三字节的位置上。立即数通常使用#data或#data16表示,在立即数前面加“#”标
6、志,用以和直接寻址中的直接地址(direct或bit)相区别。,定义:操作数在寄存器中,只要指定了寄存器就能得到操作数。 例如: MOV A,R0 特点:由指令指出某一个寄存器的内容作为操作数。存放操作数的寄存器在指令代码中不占据单独的一个字节,而是嵌入(隐含)到操作码字节中。寻址范围:四组通用寄存器Rn(R0R7)、部分专用寄存器( A, B, DPTR, CY)。,3. 寄存器寻址方式,4. 寄存器间接寻址方式,定义:指令给出的寄存器中存放的是操作数据的单元地址, 这种寻址方式称为寄存器间接寻址。 例如: MOV A, R0 特点:指令给出的寄存器中存放的是操作数地址。寄存器间接寻址是一种
7、二次寻找操作数地址的寻址方式,寄存器前边必须加前缀符号“”。不能用于寻址特殊功能寄存器SFR。,寻址范围: 1、对于内部RAM低128单元访问(只能使用R0或R1作间 址寄存器) 2、对于外部RAM访问(使用DPTR作间址寄存器)。 3、对于外部低256单元RAM的访问,除可以使用DPTR外,还可以使用R0或R1作间址寄存器(先确定高8位地址给P2)。,4. 寄存器间接寻址方式,为区分以上四种寻址方式,现在列出四种语句,1 . MOV A, #30H ;A30H;最后A中的数据为 30H如果30H单元存入的数据为 0FFH 2 . MOV A, 30H ;A(30H) ;最后A中的数据为 0F
8、FH3 . MOV R1, #30H ;R130HMOV A, R1 ;A(R1) ;A30H;最后A中的数据为 30H4 . MOV R1, #30H ;R130HMOV A, R1 ;A(R1) ;A(30H);最后A中的数据为 0FFH,5. 变址寻址方式,定义:操作数存放在变址寄存器(累加器A)和基址寄存器(DPTR或PC)相加形成的16位地址单元中。这种寻址方式称为基址加变址寄存器间接寻址,简称为变址寻址。例如:MOVC A, A+DPTR ;A(A)+(DPTR)MOVC A, A+PC ; A(A)+(PC)JMP A+DPTR ; PC(A)+(DPTR),特点:指令操作码中隐
9、含作为基址寄存器用的DPTR(或PC )和作为变址用的累加器A。在执行变址寻址指令时,80C51单片机先把基地址( DPTR或PC 的内容)和地址偏移量(A的内容)相加,以形成操作数地址,再由操作数地址找到操作数,并完成相应的操作。变址寻址方式是单字节指令。寻址范围:只能对程序存储器ROM进行寻址,主要用于查表性质的访问。,5. 变址寻址方式,6. 位寻址方式,定义:指令中给出的操作数是一个可单独寻址的位地址,这种寻址方式称为位寻址方式。 例如: MOV C,3AH 特点:位寻址是直接寻址方式的一种,其特点是对8位二进制数中的某一位的地址进行操作。 寻址范围: 位寻址区 20H2FH共16个单
10、元里128位地址(00H7FH) 21个特殊功能寄存器中的11个可位寻址的寄存器里共82位80H(P0) 、 88H(TCON)、90H(P1) 、 98H(SCON) 、 0A0H(P2) 、0A8H(IE少2位) 、0B0H(P3) 、 0B8H(IP少3位) 、0D0H (PSW少1位) 、0E0H (ACC)、0F0H(B)。,寻址形式: (1) 用直接位地址:MOV C,8CH (2) 用单元地址加位序 MOV C,88H.4 ;88H+4H=8CH (3) 用位名称:SET TR0 ;启动定时器0 (4) 用寄存器名加位序:MOV C,TCON.4 ;,6. 位寻址方式,一绝对寻址
11、,绝对寻址是在指令的操作数中直接提供目的位置的地址或地址的一部分。长转移和长调用提供目的位置的16位地址绝对转移和绝对调用提供目的位置的16位地址的低11位,7. 指令寻址,二 相对寻址方式,定义:将程序计数器PC的当前值(取出本条指令后的PC值)与指令第二个字节给出的偏移量(rel)相加,形成新的转移目标地址。称为相对寻址方式。 例如: SJMP rel ; PC(PC) + 2 + rel 特点:相对寻址方式是为实现程序的相对转移而设计的,为相对转移指令所使用,其指令码中含有相对地址偏移量,能生成浮动代码。目的地址=指令地址(PC)指令字节数偏移量(rel),寻址范围:只能对程序存储器RO
12、M进行寻址。相对地址偏移量(rel )是一个带符号的8位二进制补码,其取值范围为128127(以PC为中间的256个字节范围)。,相对寻址方式,总结: 7 种寻址方式及使用空间,3.3 80C51 单片机指令分类(共有111条),按指令的功能, 80C 51 指令系统可分为下列 5 类:数据传送类(29条)算术运算类(24条)逻辑运算及移位类(24条)位操作类(17条)控制转移类(17条),1. 单字节指令单字节指令格式由8位二进制编码表示, 例如: CLR AE4H2. 双字节指令双字节指令格式由两个字节组成, 操作码和操作数, 例如: MOV A, 10H74H 10H 3. 三字节指令三
13、字节指令格式中, 第一个字节为操作码, 后两个字节为操作数,例如: MOV 40H, 30H75H 40H 30H,3.3.1 数据传送类指令(29条),MCS -51传送指令示意图,一数据传送指令 以助记符MOV为基础,分成: 片内数据存储器传送指令 片外数据存储器传送指令 程序存储器传送指令,1片内数据存储器传送指令MOV 指令格式:MOV 目的操作数,源操作数 其中: 源操作数可以为A、Rn、Ri、direct、#data 目的操作数可以为A、Rn、Ri、direct,(1)以A为目的操作数MOV A,Rn ;A (Rn)MOV A,direct ;A(direct)MOV A,Ri ;
14、A(Ri)MOV A,#data ;A #data (2)以Rn为目的操作数MOV Rn,A ;Rn (A)MOV Rn,direct ;Rn (direct)MOV Rn,#data ;Rn #data,(3)以直接地址direct为目的操作数MOV direct,A ;direct ( A)MOV direct,Rn ;direct (Rn)MOV direct,direct ;direct (direct)MOV direct,Ri ;direct (Ri)MOV direct,#data ;direct #data (4)以间接地址Ri为目的操作数MOV Ri,A ;(Ri) ( A)
15、MOV Ri,direct ;(Ri) (direct)MOV Ri,#data ;(Ri) #data,(5)以DPTR为目的操作数MOV DPTR,#data16 ;DPTR #data16,注意,源操作数和目的操作数中的Rn和Ri不能相互配对。如不允许有“MOV Rn,Rn”,“MOV Ri,Rn”这样的指令,在MOV指令中,不允许在一条指令中同时出现工作寄存器,无论它是寄存器寻址还是寄存器间接寻址。,例3-1 设内部RAM中30H的内容为40H,40H单元的内容为10H,P1口作为输入口,其输入数据为0CAH,分析下面程序段的执行结果。,MOV R0, #30H ;单元地址以立即数形式
16、送入R0 MOV A, R0 ;以R0间接寻址将30H单元内容送A,所送内容为40H,MOV R1, A ;A的内容送R1 MOV B, R1 ;以R1间接寻址将40H单元内容送B,所送内容为10H,MOV R1, P1 ;将P1内容送入R1 MOV P2, R1 ;将R1内容送入P2,所送内容为0CAH,执行结果:(R0)=30H, (R1)=0CAH, (A)=40H, (B)=10H, (P1)=0CAH, (40H)=10H, (P2)=0CAH,例3-2 将片内RAM中的16H的内容0B9H送P1口。,解法1:MOV P1, 16H,解法2:MOV A, 16HMOV P1, A,解
17、法3:MOV R0, #16HMOV P1, R0,2. 外部数据存储器读/写指令,(1)DPTR作间址寄存器的外部RAM单元读/写指令 MOVX A, DPTR ( DPTR间接寻址的外部RAM单元读) MOVX DPTR , A( DPTR间接寻址的外部RAM单元写)(2)Ri作间址寄存器的外部RAM单元读/写指令MOVX A, Ri ( Ri间接寻址的外部RAM单元读)MOVX Ri , A ( Ri间接寻址的外部RAM单元写),例3-3 已知片外RAM中的70H的一个数X,送到片外RAM的1010H单元,编写程序。,解:程序如下:ORG 1000H ;指定程序地址MOV P2, #00
18、H ;高8位地址为00HMOV R0, #70H ;低8位地址为70HMOVX A, R0 ;取数据X到AMOV DPTR, #1010H ;设片外目的地址MOVX DPTR, A ;将数据X送目的地址SJMP $ ;程序执行到此停止END ;程序语句结束标志,MOVC A, A+PC (程序存储器读) MOVC A, A+DPTR(程序存储器读)第一条指令是以PC作为基址寄存器, 缺点:是表格只能放在该条查表指令后面的 256 个单元之中, 表格的大小受到限制, 而且表格只能被一段程序所利用。,3. 程序存储器读指令组,第二条指令是以DPTR作为基址寄存器, 特点:表格的大小和位置可以在 6
19、4 KB程序存储器中任意安排, 并且一个表格可以为各个程序块所共用。,例3-4 已知片内20H 单元中有一个09范围内的数,用以上查表指令获得该数的平方值,并将其送至21H单元。设平方表头地址为2000H,(20H)=02H。编写程序。,解:采用PC作为基址寄存器,程序如下:ORG 1FF7H 1FF7H MOV A, 20H ;A(20H), (A)=02H 1FF9H ADD A, #data ;加修正量 1FFBH MOVC A, A+PC ;查表 1FFCH MOV 21H, A ;21H(A) 1FFEH SJMP $ ;停止执行 2000H DB 0 2001H DB 1 2002
20、H DB 4: 2009H DB 81 END,采用DPTR作为基址寄存器,程序如下:ORG 1000H MOV A, 20H ;A(20H), (A)=02H MOV DPTR, #2000H ;地址指针定在2000H MOVC A, A+DPTR ;查表 MOV 21H, A ;21H(A) SJMP $ ;停止执行 ORG 2000H ;平方表从2000H开始 DB 0 DB 1 DB 4: DB 81 END,4. 堆栈操作指令组,PUSH direct(进栈)POP direct(出栈),例3-5 (40H)=01H,(30H)02H,分析下列程序执行后的结果。,堆栈区是片内RAM的
21、一个数据区,进出栈是“后进先出”MOV SP, 50H ;设栈顶PUSH 40H ;51H (40H) PUSH 30H ;52H (30H) POP 40H ;40H (52H)POP 30H ;30H (51H),执行结果: (SP)=50H,(40H)=02H,(30H)=01H,正确指令 错误指令 PUSH ACC PUSH A POP ACC POP A PUSH 00H PUSH R0 POP 00H POP R0,(1)整字节交换指令XCH A,Rn (寄存器寻址字节交换)XCH A, direct(直接寻址字节交换)XCH A, Ri ( Ri间接寻址字节交换),5. 数据交换
22、指令组,例3-6 已知外部RAM 2020H单元中有一个数X,内部RAM 20H单元中有一个数Y,编写使它们互换的程序。,解:程序如下: MOV P2, #20H ;设外部RAM高8位地址 MOV R1, #20H ;设RAM低8位地址 MOVX A, R1 ;取外部RAM2020H中数X到A XCH A, R1 ;内部RAM 20H中数Y和A中数X交换 MOVX R1, A ;交换后将Y送到外部RAM,(2)低半字节交换指令XCHD A, Ri (A和 Ri间接寻址低4位交换,高4位不变)(3)累加器高4位、低4位交换指令SWAP A (累加器内容高低半字节交换),例3-7 已知片内50H
23、单元中有一个09的数,编写使它们变为相应的ASCII码的程序。,解:09的ASCII码为30H39H。程序如下:MOV R0, #50HMOV A, #30HXCHD A, R0MOV R0, A 与下面程序相当:MOV R0, #50HMOV A, #30HADD A, R0MOV R0, A,数据传送指令使用方法和技巧,例3-8 将01H 单元内容送02H单元,有几种方法可以实现。,解: (1) MOV 02H, 01H ;直接寻址 3字节2周期 (2) MOV A, 01H ; 4字节2周期MOV 02H, A (3) MOV A, R1 ;寄存器寻址 2字节2周期MOV R2, A (
24、4) MOV R0, #01H ;间接寻址 4字节3周期MOV 02H, R0 (5) PUSH 01H ;栈操作 4字节4周期POP 02H,数据传送指令使用方法和技巧,例3-9 将片内40H 单元内容送至片外50H单元,将片外2350H单元内容送片内40H单元。,解: MOV P2, #00H ;设置外存地址高字节 MOV R0, #50H ;设置外存地址低字节 MOV A, 40H ;通过累加器读写外存储器 MOVX R0, A ;存入外存储器 MOV P2, #23H ;设置外存地址高字节 MOVX A, R0 ; 外存地址低字节仍是50H MOV 40H, A ; 外存2350H单元
25、内容 送内存40H单元R0内的地址50H既是内部单元地址,又是外部RAM低8位,判断指令的合法性:MOV A, R2MOV R0, R1MOV PC, #2222HPUSH R0,3.3.2 算术运算类指令(24条),1. 加法指令组ADD A,#data (立即数加法)ADD A, direct(直接寻址加法)ADD A, Ri ( 间接寻址加法)ADD A, Rn (寄存器寻址加法),例3-10 分析 执行如下指令后累加器A和PSW中各标志位的变化。MOV A, #9EH ;9EH=158ADD A, #71H ;71H=113解: 9EH (A) = 1 0 0 1 1 1 1 0+)
26、71 H data = 0 1 1 1 0 0 0 1 10FH 1 0 0 0 0 1 1 1 1CY AC,2. 带进位加法指令组ADDC A,#data (立即数带进位加法)ADDC A, direct(直接寻址带进位加法)ADDC A, Ri ( 间接寻址带进位加法)ADDC A, Rn (寄存器寻址带进位加法),例3-11 设(A)=0AAH,(R0)=55H,CY=1,执行如下指令ADDC A, R0 后, 求A、CY、AC、OV、P、PSW之值和PSW中各标志位的变化。 解: 0AAH (A) = 1 0 1 0 1 0 1 005 5H data = 0 1 0 1 0 1 0
27、 1+) 1 (CY) 110 0 H 1 0 0 0 0 0 0 0 0最后得 (A)=00H,(CY)=1,(AC)=1,(OV)=0,(P)=0,(PSW)=11000000B=0C0H,3. 加1指令组INC A (累加器加1)INC direct (直接寻址单元加1)INC Ri ( 间接寻址单元加1)INC Rn (寄存器寻址单元加1)INC DPTR(16位数据指针加1),若A0FFH,执行INC A 不同于执行ADD A, #1。执行INC A后, (A)=00H,不改变CY执行ADD A, #1后,( A)=00H,(CY)=1,4. 带借位减法指令组SUBB A,#data
28、(立即数带借位减法)SUBB A, direct(直接寻址带借位减法)SUBB A, Ri ( 间接寻址带借位减法)SUBB A, Rn(寄存器寻址带借位减法)没有不带借位的减法指令,例3-12 设(A)=0A9H,(R0)=20H,(20H)=98H ,执行如下程序,说明结果。CLR C ; CY清0SUBB A, R0 解:0A9H (A) = 1 0 1 0 1 0 0 198H (20H) = 1 0 0 1 1 0 0 0) (CY) 011H 0 0 0 1 0 0 0 1按无符号数运算0A9H98H=11H,(PSW)=00H按带符号数运算10101001为1010111 (57
29、H)的补码,10011000为1101000(68H)的补码。(57H) (68H)=11H,无借位,无溢出,例3-13 设(A)=76H,立即数为0C5H,(CY)=0 ,执行如下程序,说明结果。SUBB A, #0C5H 解:竖式 76H (A) = 0 1 1 1 0 1 1 00C5H data= 1 1 0 0 0 1 0 1) (CY)0B1H (CY) 1 0 1 1 0 0 0 1异符号数相减运算相当于得数超过范围, 产生溢出,(OV)=1,结果是错的。 76H(3BH)= 0B1H 超范围 0B1H7FH 177(+127),5. 减1指令组 DEC A (累加器减1) DE
30、C direct (直接寻址单元减1) DEC Ri ( 间接寻址单元减1) DEC Rn (寄存器减1),例3-14 分析执行以下程序结果 ,程序如下:MOV R1, 7FHMOV 7EH, #00HMOV 7FH, #40H DEC R1 ;间址R1 指向7FH单元减1,40H减1DEC R1 ; 7FH减1, (R1)=7EHDEC R1 ;间址R1 指向7EH单元减1,00H减1,解:结果 (7FH)=3FH, (R1)=7EH, (7EH)=0FFH,6. 乘除法指令组(1)乘法指令乘法指令完成单字节的乘法, 只有一条指令: MUL AB这条指令的功能是: 将累加器A的内容与寄存器B
31、的内容相乘, 乘积的低 8 位存放在累加器A中, 高 8 位存放于寄存器B中。如果乘积超过0FFH, 则溢出标志OV置“1”, 否则清“0”。 进位标志CY总是被清“0”。,例3-15 (A)=90H(144D),(B)=62H(98D),分析执行以下程序结果 ,程序如下:MUL AB,解:结果 为 乘积 3720H(14112D), (A)=20H, (B)=37H(OV)=1(B不为0),(CY)=0(总是0),( P)=1(A内为奇数个1),(2)除法指令除法指令完成单字节的除法, 只有一条指令: DIV AB这条指令的功能是: 将累加器 A中的内容除以寄存器 B中的8位无符号整数, 所
32、得商的整数部分存放在累加器A中, 余数部分存放在寄存器 B中。若原来 B中的内容为 0, 则执行该指令后,A与B中的内容不定, 并将溢出标志OV置“1”, 在任何情况下, 进位标志CY总是被清“0”。,例3-16 设 (A)=65H(101D),(B)=14H(20D),分析执行以下程序结果 ,程序如下:DIV AB,解:结果 为 乘积 (A)=05H (商), (B)=01H(余数)(OV)=0(除数为0则=1) ,(CY)=0(总是0),(P)=0 (A内为2个1),7. 十进制调整指令DA A若AC=1,即ACC.3在操作过程中有进位,或者A中低4位9, 则A中低4位+06H;若CY=1
33、,即ACC.7在操作过程中有进位,或者A中高4位9, 则A中高4位+60H。这条指令对累加器A参与的BCD码加法运算所获得的 8 位结果进行十进制调整, 使累加器A中的内容调整为二位压缩型 BCD码的数。使用时必须注意, 它只能跟在加法指令之后, 不能对减法指令的结果进行调整, 且其结果不影响溢出标志位。,例3-17 编写78+93的BCD加法 程序,并分析调整过程。 解:ORG 3000HMOV A, #78H ADD A, #93HDA ASJMP $END 结果得(A)=71, (CY)=1, (OV)=0,78H (A) = 0 1 1 1 1 0 0 0 +) 93H data= 1
34、 0 0 1 0 0 1 1171H 1 0 0 0 0 1 0 1 1 +) 0 1 1 01 0 0 0 1 0 0 0 1 +) 0 1 1 0 0 0 0 01 0 1 1 1 0 0 0 1 最后得数应为171H,3.3.3 逻辑运算及移位类指令(24条),1. 逻辑 “与”(“或” 、“异或”) 运算指令组 两个操作数都是8位,各个对应位进行运算。 ANL(ORL、XRL) A, Rn (寄存器与累加器逻辑 ) ANL(ORL、XRL) A, Ri ( 间接寻址单元与累加器) ANL(ORL、XRL) A,direct (直接寻址单元与累加器) ANL(ORL、XRL) A,#da
35、ta (立即数与累加器) ANL(ORL、XRL) direct,A (累加器与直接寻址) ANL(ORL、XRL) direct,#data(立即数与直接寻址),1、用和0“与”法屏蔽某些位 (和1“与”则不改变 ) ANL A, #0FH ;将A中的高4 位都清0 ,低4位不变,逻辑运算的常用功能算法,2、用和1“或”法置某些位为1 (和0“或”则不改变 ) ORL A, #0FH ;将A中的低4 位都置1 ,高4位不变,3、用和1“异或”法将某些位取反(和0“异或”则不改变 ) XRL A, #0FH ;将A中的低4 位都取反 ,高4位不变,例: 对累加器A中的1,3,5位清0,其余位不
36、变。ANL A, #11010101B 对累加器A中的2,4,6位置1,其余位不变。ORL A, #01010100B 对累加器A中的0,1位取反,其余位不变。XRL A, #00000011B,RRC A (通过CY循环右移),2. 移位指令组,RL A(累加器内容循环左移) Ring Left 相当于除以2,RR A(累加器内容循环右移) Ring Right 相当于乘以2,RLC A (通过CY循环左移),以下两个指令不影响标志位CLR A(累加器清0 )CPL A (累加器按位取反),3. 累加器清0和取反指令组,3.3.4 控制转移类指令(17条),无条件转移指令组(1)长转移指令L
37、JMP addr16 (无条件长转移,16位目的地址,范围64kB )(2)绝对转移指令AJMP addr11 (无条件绝对转移,目的地址低11位,高5位 地址取自PC的高5位,寻址范围2kB),(3)短转移指令SJMP rel (无条件短转移,目的地址低8位,高8位地址取自PC的高8位,寻址范围256B)(4)变址寻址转移指令JMP A+DPTR(无条件间接转移,范围64KB ),例3-18 根据R2中的数,查表法执行相应程序段。,解:程序如下:ORG 1000H STR: MOV DPTR, #TAB ;将TAB代表地址送入DPTR MOV A, R2 ;从R2中取数据到AADD A, R
38、2 ;数据乘以2,每条指令2字节JMP A+DPTR ;无条件间接变址跳转 TAB: AJMP PG0 ;跳转表格AJMP PG1AJMP PG2: PG0 : PG0程序段 PG0 : PG1程序段 PG0 : PG2程序段,例3-19 计算下段程序中SJMP START机器码中的rel 程序地址 机器码 标号 指令ORG 1000H 1000H 7401H START: MOV A, #01H 1002H 1002H MOV R0, A . . . . 1017H 80rel SJMP START . . . .END,解: 计算偏移量rel (用补码表示)PC内当前地址为1017H+2H
39、=1019H rel=1000H 1019H = 19H (本式要用补码运算) rel=100H 19H= 0E7H (求得19H的补码),2. 条件转移指令组(1)累加器判零转移指令JZ rel (累加器判零转移)JNZ rel (累加器判非零转移)(2)数值比较转移指令CJNE A,#data,rel(A内容与立即数比较,不等则转移)CJNE A, direct ,rel(A内容与直接寻址单元不等则转移)CJNE Rn , #data ,rel(寄存器内容与立即数不等则转移)CJNE Ri , #data ,rel(间接寻址单元与立即数不等则转移),(3)减1条件转移指令DJNZ Rn ,
40、 rel(寄存器减1条件转移)DJNZ direct ,rel(直接寻址单元减1条件转移)rel为根据程序中标号计算的 相对地址(补码),3. 子程序调用与返回指令组 (1)长调用指令LCALL addr16 (长调用) 执行过程:PC(PC)+3;SP (SP)+1;(SP) (PC)70;SP (SP)+1;(SP)(PC)158;PC addr16。(2)绝对调用指令ACALL addr11 (绝对调用) 执行过程:PC(PC)+2;SP(SP)+1;(SP)(PC)70;SP (SP)+1;(SP)(PC)158;PC100addr11。,(3)返回指令RET (子程序返回)RETI
41、(中断服务子程序返回) 执行过程: PC158 (SP); SP (SP)1;PC70 (SP); SP (SP)1 。,4. 空操作指令NOP (空操作),例3-20 根据R2中的数,利用NOP指令产生方波。 解:程序如下: LOOP : SETB P1.0 ;将P1.0置1(输出高电平)NOP ;空操作NOPNOPNOP NOPCLR P1.0 ;将P1.0置0(输出低电平)NOP ;空操作NOPNOPAJMP LOOP ;循环 只有AJMP LOOP指令2个机器周期,其余都是1个, NOP个数调整时间。,3.3.5 位操作类指令(17条),位操作概述以位(bit)为单位进行的运算和操作。
42、 位变量也称为布尔变量或开关变量。供用户使用的位处理硬件资源有:位累加器CY;内部RAM的128个可寻址位;专用寄存器中可寻址位(包括I/O口的可寻址位)。,2. 位传送指令组 MOV C,bit (指定位内容送CY) MOV bit , C (CY内容送指定位)3. 位置位复位指令组 SETB C( CY置1) SETB bit (指定位置1) CLR C( CY 清0) CLR bit (指定位清0),4. 位逻辑运算指令组 ANL C,bit(指定位与CY逻辑“与”) ANL C,/bit (指定位的反与CY 逻辑“与”) ORL C,bit(指定位与CY 逻辑“或”) ORL C, /
43、bit (指定位的反与CY 逻辑“或”) CPL C( CY 取反) CPL bit(指定位取反),5. 位控制转移指令组(1)以C状态为条件的转移指令JC rel ((CY)=1转移)JNC rel ((CY)=0转移)(2)以直接寻址位状态为条件的转移指令JB bit,rel (指定位状态为1转移)JNB bit,rel (指定位状态为0转移)JBC bit,rel (指定位状态为1转移,并使该位清0)rel为根据程序中标号计算的 相对地址(补码),3.4 伪指令,伪指令:是程序员发给汇编程序的命令,用来设置符号值、保留和初始化存储空间、控制用户程序代码的位置。 1. 汇编起始 地址命令O
44、RG(ORiGin)该命令总是出现在源程序的开头位置,用于规定目标程序的起始地址。ORG 例如:下列ORG命令规定标号START代表地址8000H,即目标程序的第一条指令从8000H开始:ORG 8000H START: MOV A,#00H,2. 汇编终止命令END(END of assembly)该命令用于终止源程序的汇编工作。命令格式为:END 是选择项,只有主程序模块才有。 也是选择项,当源程序为主程序时才具有,其值为主程序第一条指令的符号地址。3. 赋值命令EQU(EQUate)该命令用于给字符名称赋值。赋值后,其值在整个程序中有效。命令格式为:EQU 其中可以是常数、地址、标号或表
45、达式。,【例】 TAB1 EQU 1000HTAB2 EQU 2000H 汇编后TAB1、TAB2分别等于1000H、2000H。程序后面使用1000H、2000H的地方就可以用符号TAB1、TAB2替换。用EQU伪指令对某标号赋值后,该符号的值在整个程序中不能再改变。,4. 定义字节命令DB(Define Byte) 命令用于从指定的地址开始,在程序存储器的连续单元中定义字节数据。命令格式为:标号: DB8位数表 8位数表可以是一字节常数或字符,或用逗号分开的字节串,或用引号括起来的字符串。例如:,【例】 ORG 3000HTAB1: DB 12H,34HDB 5,A,abc 汇编后,各个数
46、据在存储单元中的存放情况如下:,5. 定义数据字命令DW(Define Word),该命令用于从指定地址开始,在程序存储器的连续单元中定义16位的数据字。命令格式为:标号:DW16位数表存放时,数据字的高8位在前(低地址),低8位在后(高地址)。 例如,DW“AA” ;存入41H,41HDW“A” ;存入00H,41HDW“ABC” ;不合法,因超过两字节,【例】 ORG 3000HTAB2:DW 1234H,5678H 汇编后,各个数据在存储单元中的存放情况如下:,6. 内部RAM赋值命令DATA(Assignment)该命令用于给符号名赋值,赋值在内部RAM 。DATA 其中赋值项是8位数
47、据或地址。 【例】 RESULT DATA 60HMOV RESULT,A 汇编后,RESULT就表示片内RAM的60H单元,程序后面用片内RAM的60H单元的地方就可以用RESULT。,7. 外部RAM赋值命令XDATA(Assignment)该命令用于给符号名赋值。赋值在外部RAM 。XDATA 其中赋值项是两字节(16位)数据或地址,包括I/O口地址。 【例】 PORT1 XDATA 2000HMOV DPTR,PORT1MOVX DPTR,A,8. 定义存储区命令DS(Define Storage),该命令用于从指定地址开始,在程序存储器中保留指定数目的单元作为预留存储区,供程序运行使用。源程序汇编时,对预留单元不赋值。命令格式为:标号:DS 16位数表,【例】 ORG 2000HTAB1: DB 12H,34HDS 4HDB 5 汇编后,存储单元中的分配情况如下:,9. 位定义命令BIT (Define Bit),给某一位地址取个名字,容易记忆。 命令格式为:字符名称 BIT位地址 其中:位地址可以是内存位地址,也可以是符号地址(即位符号名称)。 例:AQ BIT 90H AQ BIT P1.0 功能是把P1.0的位地址赋给变量AQ,在其后的编程中AQ就可以作为位地址使用,