64
§3.1 概概 7 概概概概概111 概概概 概概概 概概概概 概概概概概49 概 概概概概概45 概 概概概概概17 概 概概概概概64 概 概概概概概45 概 概概概概概2 概 第第第 MCS-51 第第第Instruct ion Set

§3.1 概述

Embed Size (px)

DESCRIPTION

第三章 MCS-51 指令系统 Instruction Set. §3.1 概述. 7 种寻址方式, 111 条指令. 单字节指令: 49 条 双字节指令: 45 条 三字节指令: 17 条. 字节数. 单周期指令: 64 条 双周期指令: 45 条 四周期指令: 2 条. 运算速度. 数据传送类: 29 条 算术运算类: 24 条 逻辑运算类: 24 条 控制转移类: 17 条 位操作类: 17 条. 功能. 常用符号. Rn :工作寄存器中的寄存器 R0 、 R1 … R7 之一,. Ri :工作寄存器中的寄存器 R0 或 R1. - PowerPoint PPT Presentation

Citation preview

§3.1 概述7 种寻址方式, 111 条指令

字节数

运算速度

单字节指令: 49 条双字节指令: 45 条三字节指令: 17 条

单周期指令: 64 条双周期指令: 45 条四周期指令: 2 条

第三章 MCS-51指令系统 Instruction Set

功能

数据传送类: 29 条算术运算类: 24 条逻辑运算类: 24 条控制转移类: 17 条位操作类: 17 条

常用符号Rn :工作寄存器中的寄存器 R0 、 R1…R7 之一,Ri :工作寄存器中的寄存器 R0 或 R1

#data : 8 位立即数

#data16 : 16 位立即数direct :片内 RAM 或 SFR 的地址( 8 位)

@ 间接寻址寄存器Bit :片内 RAM 或 SFR 的位地址addr11 : 11 位目的地址addr16 : 16 位目的地址

rel: 补码形式的 8 位地址偏移量。

偏移范围为 -128 ~ 127

/ :位操作指令中,该位求反后参与操作,不影响该位

X :片内 RAM 的直接地址或寄存器

(X) :相应地址单元中的内容

→ :箭头左边的内容送入箭头右边的单元内

§3.2 寻址方式

3.2.1 立即寻址Immediate Addressing

操作数就包含在指令代码中,在操作码之后,称为立即数,用“#”表示。

MCS-51

如: MOV P1, #80H MOV R7, #0F5H MOV DPTR , #1245H

操作数存在程序存储器中

3.2.2 直接寻址 Direct Addressing

直接使用数所在单元的地址找到了操作数,所以称这种方法为直接寻址。操作数在 SFR 、内部 RAM 、位地址空间。如: MOV A , 00H MOV C , 60H MOV A , 0F0H

3.2.3 寄存器寻址 Register Addressing

对选定的工作寄存器 R0 ~ R7 、累加器 A 、通用寄存器 B 、地址寄存器 DPTR 中的数进行操作。 例: MOV A , R0 ;将 R0 工作寄存器中的数据送到累加器A 中去。

提一个问题:我们知道,工作寄存器就是内存单元的一部分,如果我们选择工作寄存器组 0 ,则 R0就是 RAM 的 00H 单元,那么这样一来, MOV A ,00H 和 MOV A , R0 不就没什么区别了吗?

的确,这两条指令执行的结果是完全相同的,都是将 00H 单元中的内容送到 A 中去,但是执行的过程不同,执行第一条指令需要 2 个机器周期,而第二条则只需要 1 个机器周期,第一条指令变成最终的目标码要两个字节( E5H 00H ),而第二条则只要一个字节( E8H )就可以了。

3.2.4 寄存器间接寻址 Register Indirect Addressing

把地址放在另外一个寄存器中,根据这个寄存器中的数值决定该到哪个单元中取数据。

R0 , R1----8 位地址,片内低 128 字节或片外DPTR----16 位,片外 64KB

MCS-51

如: MOV A , @R0MOVX A , @R0MOVX A , @DPTR

操作数在片内 RAM

中操作数在

片外 RAM中

操作数在片外 RAM

以 DPTR 或 PC 为基址寄存器,累加器 A 为变址寄存器。把两者内容相加,结果作为操作数的地址。 常用于查表操作。

MCS-51 MOVC A , @A+DPTR ; (A+DPTR) →A MOVC A , @A+PC ; PC+1 →PC , (A+PC)→A

3.2.5 变址寻址 ( 基址 + 变址 )Base-Register-plus-Index-Register-Indirect Addressing

操作数在程序存储器中

E0

A程序存储区

2040H 93

20E0H 47

2041H …

… …

DPH 20DPL 00

ALU

如: MOVC A , @A+DPTR设 DPTR=2000H , A=E0H

20E0H

47

指令代码

3.2.6 相对寻址

将 PC 中的当前内容与指令第二字节给出的数相加,结 果作为跳转指令的转移地址(转移目的地址)。 PC 中的当前内容称为基地址(本指令后的字节地址) 指令第二字节给出的数据称为偏移量, 1 字节带符号数 . 常用于跳转指令。 如 : JC 23H 若 C=0 ,不跳转; C=1 ,跳转 .

Relative Addressing

改变 PC

程序存储区

ALU

如: JC 23

1025H

1000H 40

1025H 45

1001H 23

… …

1024H 47

1002H 30

23H

1002H

指令代码

当前 PC

对片内 RAM 的位寻址区和某些可位寻址的特殊功能寄存器进行位操作时的寻址方式。

如 : SETB 3DH; 将 27H.5 位置 1 CLR C ; Cy 位清 0

3.2.7 位寻址 Bit Addressing

操作数在片内 RAM 位地址区或SFR 某些位中

寻址方式涉及的存储器空间

寻址方式寻址方式 寻址空间(操作数存放空间)寻址空间(操作数存放空间)立即寻址立即寻址 程序存储器程序存储器直接寻址直接寻址 片内片内 RAMRAM 低低 128128 字节、字节、 SFRSFR

寄存器寻址寄存器寻址 工作寄存器工作寄存器 R0R0 ~~ R7,A,B,DPTRR7,A,B,DPTR

寄存器间接寻址寄存器间接寻址 片内片内 RAM:@R0,@R1,SPRAM:@R0,@R1,SP片外片外 RAM:@R0 ,@R1,@DPTRRAM:@R0 ,@R1,@DPTR

变址寻址变址寻址 程序存储器程序存储器 :@A+PC,@A+DPTR:@A+PC,@A+DPTR相对寻址相对寻址 程序存储器程序存储器 256256 字节范围内字节范围内 :PC+:PC+ 偏移量偏移量

位寻址位寻址片内片内 RAMRAM 的位寻址区的位寻址区 (20H(20H ~~ 2FH2FH 字节地字节地址址 ))某些可位寻址的某些可位寻址的 SFRSFR

§3.3 数据传送类指令( 29 条) Data Transfer Instruction

MCS-51 助记符: 助记符: MOV 、 MOVX 、 MOVC XCH 、 XCHD 、 SWAP PUSH 、 POP 源操作数寻址方式( 5 种): 立即寻址、直接寻址、寄存器寻址、 寄存器间接寻址、变址寻址。 目的操作数寻址方式( 3 种): 直接寻址、寄存器寻址、寄存器间接寻址 除了目的操作数为 ACC 的指令影响奇偶标志 P 外,一般不影响标志位。

3.3.1 十六位数的传递指令( 1 条)

MOV DPTR , #data168051 是一种 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 。

3.3.2 累加器 A 与片外 RAM 之间的数据传递类指令(4 条 )

MOVX A , @Ri MOVX @Ri , A MOVX A , @DPTR MOVX @DPTR , A

说明: 1. 在 51 中,与外部存储器 RAM 打交道的只可以是 A 累加器。所有需要送入外部 RAM 的数据必需要通过 A 送去,而所有要读入的外部RAM 中的数据也必需通过 A 读入。 在此我们可以看出内外部 RAM 的区别了,内部 RAM 间可以直接进行数据的传递,而外部则不行。 比如,要将外部 RAM 中某一单元(设为 0100H 单元的数据)送入另一个单元(设为 0200H 单元),也必须先将 0100H 单元中的内容读入 A ,然后再送到 0200H 单元中去。

2. 要读或写外部的 RAM ,当然也必须要知道 RAM 的地址,在后两条指令中,地址是被直接放在 DPTR 中的。而前两条指令,由于 Ri (即 R0 或 R1 )只是 8 位的寄存器,所以只提供低 8 位地址。高 8 位地址由 P2口来提供。 3. 使用时应先将要读或写的地址送入 DPTR 或 Ri 中,然后再用读写命令。 例:将外部 RAM 中 100H 单元中的内容送入外部 RAM中 200H 单元中。

MOV DPTR , #0100HMOVX A , @DPTRMOV DPTR , #0200HMOVX @DPTR , A

3.3.3 读程序存储器指令( 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 0100HDB 0,1,4,9,16,25

如果 R0 中的值为 2 ,则最终地址为 100H+2 为 102H ,到 102H 单元中找到的是 4 。

3.3.4 堆栈操作( 2 条)PUSH direct ; SPSP+1 , (SP)(direct)POP direct ; (direct) (SP), SPSP-1

第一条为压入指令,就是将 direct 中的内容送入堆栈中,第二条为弹出指令,就是将堆栈中的内容送回到 direct 中。例: MOV SP , #5FH

MOV A , #100 MOV B , #20 PUSH ACC PUSH B

则执行第一条 PUSH ACC 指令是这样的:将 SP 中的值加 1 ,即变为 60H ,然后将 A 中的值送到 60H 单元中,因此执行完本条指令后,内存 60H 单元的值就是 100 ,同样,执行 PUSH B 时,是将 SP+1 ,即变为 61H ,然后将 B 中的值送入到 61H 单元中,即执行完本条指令后,61H 单元中的值变为 20 。

1. 给出每条指令执行后的结果 MOV 23H , #30HMOV 12H , #34HMOV R0 , #23H

MOV R7 , 12HMOV R1 , #12HMOV A , @R0MOV 34H , @R1MOV 45H , 34HMOV

DPTR , #6712HMOV 12H , DPHMOV R0 , DPLMOV A , @R0

; (23H)=30H; (12H)=34H; R0=23H

XXXX

XX

XX

XX

XX

XX

XXXX

DPH

DPL

45H

34H

23H

12H

R7

R1R0

XXXX

XX

XX

30

34

XX

XX23

XXXX

XX

XX

30

34

34

1223

6712

34

34

30

34

34

1223

6712

34

34

30

67

34

1212

; R7=34H; R1=12H; A=30H; (34H)=34H; (45H)=34H;DPTR=6712H; (12H)=67H; R0=12H; A=67H

内部 RAM

§3.4 算术运算类指令 (24 条 ) Arithmetic Operations

主要对 8 位无符号数;也可用于带符号数运算。 包括:加、减、乘、除、加 1 、减 1 运算指令 影响 PSW有关位。

3.4.1 加法指令

ADD A , #data ; A + data→AADD A , direct ; A + (direct )→AADD A , Rn ; A + Rn→AADD A , @Ri ; A + (Ri)→A

用途:将 A 中的值与源操作数所指内容相加,最终结果 存在 A 中。

1. 不带进位位的加法指令( 4 条)

2. 带进位位的加法指令( 4 条)ADDC A , Rn ; A+ Rn+ CY→AADDC A , direct ; A+ (direct )+ CY→AADDC A , @Ri ; A+ (Ri)+ CY→AADDC A , #data ; A+ data+ CY→A

用途:将 A 中的值和其后面的值以及进位位 C 中的值相加, 最终结果存在 A ,常用于多字节数运算中。说明:由于 51 单片机是一种 8 位机,所以只能做 8 位的数学运算,但 8 位运算的范围只有 0~255 ,这在实际工作中是不够的,因此就要进行扩展,一般是将 2 个 8 位( 两字节 ) 的数学运算合起来,成为一个 16 位的运算,这样,可以表达的数的范围就可以达到 0~65535 。

例:

先做 67H+A0H=107H ,而 107H显然超过了 0FFH ,因此最终保存在 A 中的是 07H ,而 1 则到了 PSW中的 CY位了。换言之, CY就相当于是 100H 。

然后再做 10H + 30H + CY,结果是 41H ,所以最终的结果是 4107H 。

1067H+30A0H

0001 0000 0110 0111

0011 0000 1010 0000

0100 0001 0000 0111

1067H30A0H

4107H

设: 1067H 存在 R1R0 中, 30A0H 存在 R3R2中 , 计算 R1R0+R3R2 ,结果存在 R5R4 中。

MOV A,R0ADD A,R2 ; R0+R2→A 和 CYMOV R4,AMOV A,R1ADDC A,R3 ; R1+R3+CY→A 和CYMOV R5,A

又例:

先做 67H+20H=87H ,没有超过 0FFH ,因此最终保存在 A 中的是 87H ,而 PSW中的 CY=0 。

然后再做 10H + 30H + CY,结果是 40H ,所以最终的结果是 4087H 。

1067H+3020H

0001 0000 0110 0111

0011 0000 0010 0000

0100 0000 1000 0111

1067H3020H

4087H

DA A在进行 BCD 码加法运算时,跟在 ADD 和 ADD

C 指令之后,用于对累加器 A 中刚进行的两个 BCD码的加法的结果进行十进制调整。

例: A=0001 0101BCD (代表十进制数 15 ) ADD A , #8

3. 十进制调整指令( 1 条)

; A=1DH ,按二进制规律加; A=23H ,按十进制规律加

DA A

调整要完成的任务是:调整要完成的任务是:(( 11 )当累加器)当累加器 AA 中的中的低低 44 位数出现了非位数出现了非BCDBCD 码(码( 1010~11111010~1111 )或低)或低 44 位产生进位产生进位(位( AC=1AC=1 ),则应在低),则应在低 44 位加位加 66调整,调整,以产生低以产生低 44 位正确的位正确的 BCDBCD 结果。结果。

(( 22 )当累加器)当累加器 AA 中的中的高高 44 位位数出现了非数出现了非 BBCDCD 码(码( 1010~11111010~1111 )或高)或高 44 位产生进位位产生进位(( CY=1CY=1 ),则应在高),则应在高 44 位加位加 66调整,以产调整,以产生高生高 44 位正确的位正确的 BCDBCD 结果。结果。 十进制调整指令执行后,十进制调整指令执行后, PSWPSW 中的中的 CYCY表示结果的百位值表示结果的百位值。。

例 若(例 若( AA )=)= 0101 0110B0101 0110B ,表示的,表示的 BCDBCD 码为码为 5656 ,,(( R3R3 )=)= 0110 0111B0110 0111B ,表示的,表示的 BCDBCD 码为码为 6767 ,(,( CYCY ))== 00 。执行以下指令:。执行以下指令:

ADD AADD A ,, R2R2DA ADA A由于(由于( AA )=)= 0010 0011B0010 0011B ,即,且(,即,且( CYCY )=)= 11 ,即,即

结果为结果为 BCDBCD 数数 123123 。。应该注意,应该注意, DADA 指令不能对减法进行十进制调整。指令不能对减法进行十进制调整。

3.4.2 减法指令( 8 条)

SUBB A , Rn ; A- Rn- CY→ASUBB A , direct ; A- (direct )- CY→ASUBB A , @Ri ; A- (Ri)- CY→ASUBB A , #data ; A- data- CY→A将 A 中的值减去源操作数所指内容以及进位位 C 中的值,最终结果存在 A 中。如: SUBB A , R2设: A=C9H , R2=55H , CY=1 ,执行指令之后, A 中的值为 73H 。

1. 带借位的减法指令( 4 条)

说明:没有不带借位的减法指令,如果需要做不带位的减法指令(在做第一次相减时),只要将 CY清零即可。

对带符号数,要注意 OV 标志。 OV=1 ,出错。

§3.5 逻辑运算类指令( 24 条)

主要用于对 2 个操作数按位进行逻辑操作,结果送到A 或直接寻址单元。 主要操作 与、或、异或、移位、取反、清零等。 对标志位的影响 除了目的操作数为 ACC 的指令影响奇偶标志 P 外,一般不影响标志位。

Logic Operations

3.5.1 逻辑或指令( 6 条)

ORL A , Rn ; A∨Rn→AORL A , direct ; A∨(direct)→AORL A , @Ri ; A∨(Ri)→AORL A , #data ; A∨data→AORL direct , A ; (direct)∨A→(direct)ORL direct , #data ; (direct)∨data→(direct)

影响 P 标志

例: 71H 和 56H 相或:01110001 ( 71H )

∨) 01010110 ( 56H ) 01110111 即 77H

后两条指令,若直接地址为 I/O端口,则为“读-改写”操作。

OR Logic Instruction

3.5.2 逻辑与指令 ( 6 条)

ANL A , Rn ; A∧Rn→AANL A , direct ; A∧(direct)→AANL A , @Ri ; A∧(Ri)→AANL A , #data ; A∧data→AANL direct , A ; (direct)∧A→(direct)ANL direct , #data ; (direct)∧data→(direct)

影响 P 标志

例: 71H 和 56H 相与:01110001 ( 71

H ) ∧) 01010110 ( 56

H ) 01010000 即 50H

后两条指令,若直接地址为 I/O端口,则为“读-改写”操作。

ANd Logic Instruction

例: 71H 和 56H 相异或: 01110001 ( 71H )

⊕) 01010110 ( 56H )

3.5.2 逻辑异或指令( 6 条)

XRL A , Rn ; A ⊕Rn→AXRL A , direct ; A ⊕(direct)→AXRL A , @Ri ; A ⊕(Ri)→AXRL A , #data ; A ⊕ data→AXRL direct , A ; (direct) ⊕A→(direct)XRL direct , #data ; (direct) ⊕data→(direct)

影响 P标志

00100111 即 27H

后两条指令,若直接地址为 I/O端口,则为“读-改写”操作。

eXclusive-oR Logic Instruction

3.5.3 清 0 与取反指令( 2条)

取反: CPL A ; /A→A例:若 A=5CH ,执行 CPL A 结果: A=A3H

清 0 : CLR A ; 0→A

ComPlement Logic Operation

3.5.4 循环移位指令( 4 条)

RL A

RR A

RLC A

RRC

A

A.7 A.0A.7 A.0

A.7 A.0

CY

CY A.7 A.0

后两条指令,影响 P 标志和 CY。

Rotate Logic instruction

例:

若 A=5CH , CY=1 ,执行 RLC A 后,

对 RLC 、 RRC 指令,在 CY=0时

RLC 相当于乘以 2 RRC 相当于除以 2

结果: A=B9H , CY=0 , P=1

0101 1100

1 1011 1001

0

§3.6 控制转移类指令控制转移类指令( ( 17 条)) Branching InstructionBranching Instruction

共有控制程序转移类指令 ( 不包括位操作类的转移指令 ) 。此类指令一般不影响 PSW。

包括以下类型: 无条件转移和条件转移 相对转移和绝对转移 长转移和短转移 调用与返回指令

3.6.13.6.1 无条件转移类指令无条件转移类指令(( 44 条)条)

短转移类指令: AJMP addr11 长转移类指令: LJMP addr16 相对转移指令: SJMP rel 间接转移指令: JMP @A+DPTR

( 1 )上面的前三条指令,统统理解成: PC 值改变,即跳转到一个标号处。 那么他们的区别何在呢?

跳转的范围不同。 短转移类指令: AJMP addr11 长转移类指令: LJMP addr16 相对转移指令: SJMP rel

转移范围:2KB64KB-128~+127

指令构成不同。 AJMP 、 LJMP 后跟的是绝对地址, 而 SJMP 后跟的是相对地址。 指令长度不同 原则上,所有用 SJMP 或 AJMP 的地方都可以用 LJMP 来替代。

间接转移指令: JMP @A+DPTR

这条指令的用途也是跳转,转到什么地方去呢?这可不能由标号简单地决定了。 转移地址由 A+DPTR形成,并直接送入 PC 。指令对 A 、 DPTR 和标志位均无影响。 本指令可代替众多的判别跳转指令,又称为散转指令,多用于多分支程序结构中。

( 2 )第四条指令与前三条指令相比有所不同

例: MOV DPTR , #TAB ;将 TAB 代表的地址送入 DPTR JMP @A+DPTR ;跳转TAB: AJMP ROUT0 ;跳转 ROUT0开始的程序段TAB+2: AJMP ROUT1 ;跳转 ROUT1开始的程序段TAB+4: AJMP ROUT2 ;跳转 ROUT2开始的程序段TAB+6: AJMP ROUT3 ;跳转 ROUT3开始的程序段 ...ROUT0 : ...ROUT1 : ...ROUT2 : ...ROUT3 :

执行该段程序后,程序将根据 A 中的内容转移到不同的程序段去执行 ----散转。A=0, 转 ROUT0A=2, 转 ROUT1A=4, 转 ROUT2A=6, 转 ROUT3

3.6.2 3.6.2 条件转移指令条件转移指令(( 88 条)条)条件转移指令是指在满足一定条件时进行相对转

移,否则程序继续执行本指令的下一条指令。一、判 A 内容是否为 0 转移指令( 2 条)

JZ rel ;如果 A=0 ,则转移,否则顺序执行。 JNZ rel ;如果 A≠0 ,就转移。

转移到相对于当前 PC 值的 8 位移量的地址去。即:

新的 PC 值 = 当前 PC+ 偏移量 rel我们在编写汇编语言源程序时,可以直接写成: JZ 标号 ;即转移到标号处。

例:例:

如果 R0=0 ,结果 R1=00H 。如果 R0 0 ,结果是 R1中的值为 0FFH 。

MOV A , R0 JZ L1 MOV R1 , #00H AJMP L2 L1: MOV R1 , #0FFH L2: SJMP L2 END

在执行上面这段程序前:如果 R0=0 ,结果 R1=0FFH 。而如果 R00 ,则结果是 R1=00H 。 把上面的那个例子中的 JZ改成 JNZ,看看程序执行的结果是什么 ?

二、比较不等转移指令二、比较不等转移指令(( 44 条)条)CJNE A , #data , rel CJNE A , direct , relCJNE Rn , #data , relCJNE @Ri , #data , rel

此类指令的功能是将两个操作数比较,如果两者相等,就顺序执行,如果不相等,就转移。同样地,使用时,我们可以将 rel 理解成标号,即:

CJNE A , #data ,标号CJNE A , direct ,标号CJNE Rn , #data ,标号CJNE @Ri , #data ,标号

利用这些指令,可以判断两数是否相等。但有时还想得知两数比较之后哪个大,哪个小,

本条指令也具有这样的功能:如果两数不相等,则 CPU还会用 CY(进位

位)来反映哪个数大,哪个数小。如果前面的数大,则 CY=0 ,否则 CY=1 。因此在程序转移后再次利用 CY就可判断出哪

个数大,哪个数小了。

举例:举例: MOV A , R0

CJNE A , #10H , L1 MOV R1 , #0 ;如 R0=10H, 则不转移 R1=00H ;

AJMP L3L1:JC L2 ;如 CY=1 即 R0<10H, 则转移

MOV R1 , #0AAH ;否则 CY=0 即 R0>10H, 则转移

AJMP L3L2:MOV R1 , #0FFHL3:SJMP L3

因此最终结果是:本程序执行前,如果 R0=10H ,则 R1=00H ;如果 R0>10H ,则 R1=0AAH ;如果 R0<10H ,则 R1=0FFH 。

三、减三、减 11 不为不为 00 转移指令转移指令(( 22 条)条)DJNZ Rn , relDJNZ direct , relDJNZ指令的执行过程是这样的 :它将第一个参数中的值减 1 ,然后看这个值是否等于 0 ,如果等于 0 ,就往下执行,如果不等于 0 ,就转移到第二个参数所指定的地方去。例: DJNZ 10H , LOOP ...LOOP: ...

例: MOV 23H,#0AH CLR ALOOP: ADD A,23H DJNZ 23H,LOOP SJMP $上述程序段的执行过程是:将 23H 单元中的数连续相加,存至 A 中,每加一次, 23H 单元中的数值减 1 ,直至减到 0 ,共加( 23H )次。

3.6.3 3.6.3 调用与返回指令调用与返回指令(( 44 条)条)一、调用指令( 2 条)

LCALL addr16 ;长调用指令 (3 字节 ) ACALL addr11 ;短调用指令 (2 字节 )上面两条指令都是在主程序中调用子程序,两者的区别 :对短调用指令,被调用子程序入口地址必须与调用指令的下一条指令的第一字节在相同的 2KB 存储区之内。使用时可以用: LCALL 标号 ;标号表示子程序首地址 ACALL 标号 来调用子程序。

指令的执行过程是:当前 PC 压栈,子程序首地址送 PC ,实现转移。

二、返回指令二、返回指令 (( 22 条)条)

子程序执行完后必须回到主程序,如何返回呢?只要执行一条返回指令就可以了。

RET ;子程序返回指令RETI ;中断子程序返回指令两者不能互换使用。

3.6.4 空操作指令( 1 条) NOP空操作,就是什么事也不干,停一个周期,一般用

作短时间的延时。

RET 指令的执行过程是:堆栈栈顶内容( 2字节,调用时保存的当前 PC 值)弹出给 PC ,实现返回。RETI 指令除了具有 RET 指令的功能实现程序返回外,还有对中断优先级状态触发器的清零。

§3.7 位操作指令( 17 条)Boolean OperationsMCS-51 单片机的硬件结构中,有一个位处理器

(又称布尔处理器),它有一套位变量处理的指令集,包括位变量传送、逻辑运算、控制程序转移等。

在 MCS-51 中,有一部份 RAM 和一部份 SFR 是具有位寻址功能的。

位操作区:内部 RAM 的 20H-2FH 这 16 个字节单元,即 128 个位单元 ( 位地址空间位00 ~ 7FH) ;

可以位寻址的特殊功能寄存器: 8031 中有一

些 SFR 是可以进行位寻址的,这些 SFR 的特点是其字节地址均可被 8整除, 如 A 累加器,B 寄存器、 PSW、 IP (中断优先级控制寄存器)、 IE (中断允许控制寄存器)、 SCON(串行口控制寄存器)、 TCON(定时器 / 计数器控制寄存器)、 P0-P3 ( I/O端口锁存器)。 在进行位处理时, CY用作“位累加器” 。

以 PSW中位 4 ( RS1 )为例。 直接 ( 位 ) 地址方式:如 D4H ; 点操作符号方式:如 PSW.4 , D0H.4 ; 位名称方式:如 RS1 ; 用户定义名方式:如用伪指令 bit

SUB.REG bit RS1定义后,可用 SUB.REG代替 RS1 。

位地址表达方式

3.7.1 位传送指令( 2 条)

MOV C , bit ; bit →CMOV bit , C ; C →bit这组指令的功能是实现位累加器( CY)和其它位地址之间的数据传递。例: MOV C , P1.0 ;将 P1.0 的状态送给 C 。 MOV P1.0 , C ;将 C 中的状态送到 P1.0 ;引脚上去。

3.7.2 3.7.2 位清位清 00 和置位和置位(( 44条)条) 位清 0 指令

CLR C ;使 CY=0 CLR bit ;使指令的位地址等于 0 。 例: CLR P1.0 ;即使 P1.0 变为 0 位置 1 指令 SETB C ;使 CY=1 SETB bit ;使指定的位地址等于 1 。 例: SETB P1.0 ;使 P.0 变为 1

3.7.3 位逻辑运算指令 ( 6条)

位与指令

ANL C , bit ; Cy与指定位的值相与,结果送CyANL C , /bit ;先将指定的位地址中的值取出后取反,再和 Cy相与,结果送回 Cy。但注意 :指定的位地址中的值本身并不发生变化。

例: ANL C , /P1.0

位取反指令 CPL C ;使 Cy 值取反。CPL bit ;使指定的位的值取反。例: CPL P1.0

位或指令

ORL C , bitORL C , /bit

3.7.4 位条件转移指令( 5 条) 判 Cy 转移指令

JC relJNC rel

第一条指令的功能是如果 Cy=1 就转移,否则就顺序执行。 第二条指令则和第一条指令相反,即如果 Cy=0 就转移,否则就顺序执行。 同样理解: JNC 标号

判位变量转移指令 JB bit , relJNB bit , rel JBC bit , rel第一条指令 : 如果指定的( bit ) =1 ,则转移,否则顺序执行,第二条指令功能相反。 同样理解: JB bit ,标号第三条指令是如果指定的( bit ) =1 ,则转移,并把该位清 0 ,否则顺序执行。