单片机51系列指令系统与程序设计方法

发布时间:2021-11-28 10:19:31

单片机原理与应用

第3章 51系列指令系统与程序设计方法
3.1 指令格式和伪指令 3.2 寻址方式

3.3 指令系统
3.4 程序设计方法

2014-1-21

1

3.1 指令格式和伪指令
一、汇编语言指令格式: [标号:]操作码助记符 操作数1,操作数2 [;注释] 换行表示一条指令结束。 例: LOOP: MOV A,#40H ;取参数
MOV—move 传送 1.标号:指令的符号地址。 XCH—exchange 交换 2.操作码:指明指令操作功能。 ANL—and logic 与逻辑运算 3.操作数:指令操作对象。 XRL—exclusive or 异或运算 数据、地址、寄存器名及约定符号。 MUL—multiply 乘法 4.注释行:说明指令在程序中的作用。 RR—rotate right 右循环 SJMP—short jump 短跳转 操作码和操作数是指令主体。 RET—return 子程序返回

标号:必须以字母和下划线开头,由字母或数字组成。

二、伪指令:
汇编的控制指令,仅提供汇编信息,不产生指令代码。 1. ORG—起始地址指令(定位伪指令): 格式: ORG 表达式 指明程序和数据块起始地址,表达式是一个绝对或地址偏移值。 指令地址 机器码 源程序 ORG 2000H 2000H 78 30 MAIN:MOV R0,#30H 2002H E6 MOV A,@R0 …
3

2014-1-21

2. 位地址赋值伪指令
格式:符号名 BIT 位地址 作用:将一个位地址赋给一个符号名。 Clock BIT 90H; 定义P1.0为时钟线clock

3. DB—定义字节型常数指令。
格式:[标号:] DB n1,n2,n3, ….nn 例: DB 12H,100,‘A’ 作用:定义一个字节常数表

4.

DW — 定义字型常数指令。 格式:[标号:] DW n1,n2,n3, ….nn 例: DW 1234H,5678H 作用:定义一个地址表或字常数表 注:3和4这两个都是在程序存储器中存放。
2014-1-21
4

5. 赋值伪指令 EQU

格式:符号名

EQU

表达式(寄存器名)

将表达式或一个寄存器名赋给一个符号名。

X1 X2

EQU EQU … MAIN: MOV ADD

2000H 0FH DPTR,#X1 A,#X2

6.

END — 结束汇编伪指令。 例:START: … … END START

2014-1-21

5

二、机器语言指令格式:
操作码 [操作数1] [,操作数2] 有单字节、双字节和三字节指令。 汇编语言指令中操作码和操作数是指令主体,称 为指令可执行部分,指令表中可查出对应指令代码。

举例: 汇编语言: MOV A,R0 MOV R6,#32H MOV 40H,#64H

机器语言: E8H 7E 32H 75 40 64H

11101000 01111110 01110101 00110010 01000000 01100100

2014-1-21

6

三、常用的主要缩写符号
? ? ? ? ? ? ? ? ? ? ? A 累加器Acc AB 寄存器对 direct 直接地址 00H~0FFH #data 立即数,表示一个常数 00H~0FFH @ 间接寻址标记 X 寄存器名 (X) X寄存器内容 ((X)) 由X寄存器寻址的存储器单元内容 $ 本条指令起始地址 rel 相对偏移量 -128~+127 rrr 其值由工作寄存器Rn确定, R0~ R7对应000~111

2014-1-21

7

3.2 指令寻址方式
寻址方式:寻找本条指令中操作数的有效地址方式。 主要的寻址方式有: ? 立即寻址; ? 直接寻址; ? 寄存器寻址; ? 寄存器间接寻址; ? 基寄存器加变址寄存器间接寻址; 还有相对寻址等。

一 、操作数类型:
位 (bit) ─ 位寻址区中的一位二进制数据 字节(Byte)─ 8位二进制数据 字 (Word) ─ 16位双字节数据

二、 寻址方式:
1.立即寻址方式:
指令中给出实际操作数据(立即数),一般用于为寄 存器或存储器赋常数初值。 举例: 8位立即数: MOV A,#40H ;A?40H 16位立即数: MOV DPTR,#2100H ;DPTR?2100H

2014-1-21

9

2.直接寻址方式:
指令操作数是存储器单元地址,数据放在存储器单元中。

MOV A,40H

;A?(40H)
78H 56H

例:设存储器两个单元的内容如图所示, 41H 执行指令 MOV A,40H 后 A = 56H ? 40H 直接寻址方式对数据操作时,地址是固定 值,而地址所指定的单元内容为变量形式。

思考题:
直接寻址方式指令和立即寻址方式指令的形式有什么不同?

2014-1-21

10

3.寄存器寻址方式:
指令操作数为寄存器名,数据在寄存器中。
例:
MOV A,R0 ;A?(R0) 0010 0000 A 设指令执行前 A=20H,R0=40H, 执行指令后,A= 40H ? ,R0 =40H ?
0100 0000
R0

4.寄存器间接寻址方式:
指令的操作数为寄存器名,寄存器中为数据地址。 存放地址的寄存器称为间址寄存器或数据指针。

例:

MOV A,@R0 ;A?((R0)) 设指令执行前 A=20H,R0=40H,地址为40H

20H
A 41H
R0→40H

40H
R0

存储器单元内容如图所示。执行指令后, A= 34H ? ,R0 = 40H ? , (40H)= 34H ?

67H 34H

5.基寄存器加变址寄存器间接寻址方式:
数据在存储器中,指令给出的寄存器为数据的基
地 址(基寄存器PC和DPTR)和偏移量(变址寄存器A)。 数据地址 = 基地址 + 偏移量。 说明:1、只对程序存储器; 2、指令形式:MOVC A,@A+DPTR MOVC A,@A+PC @A+DPTR 例: MOVC A,@A+DPTRJMP ; A?((A+DPTR)) 设指令执行前 A=09H,DPTR=2000H,存储器 单元内容如图所示。执行指令后, A= 12H ? DPTR= 2000H ?
2008H 2009H 89H 12H

6.位寻址方式(可归属于直接寻址):
指令给出位地址。一位数据在存储器位寻址区。 (1)内部RAM中的位寻址区:字节地址为20H~2FH; (2)专用寄存器的可寻址位:11个(83位) 表示方法:1)直接使用位地址;如:PSW的位6可表示为0D6H
2)位名称表示; 3)字节地址加位数表示; 4)专用寄存器符号加位数表示。 或AC 或0D0H.6 或PSW.6

例: MOV C,40H ;CY(位地址40H) 设指令执行前 CY=1,位地址40H存储器单元如图, 执行指令后,CY= ? 0 位寻址区 29H 28H
2014-1-21

01100010 11010110
13

7. 相对寻址方式:
目的地址=转移指令地址+转移指令字节数+rel (rel为偏移量) 当前 PC 值加上指令中规定的偏移量 rel ,构 成实际的操作数地址 例: SJMP rel 操作:跳转到的目的地址 = 当前16位PC值 + rel 注意: 1 )“当前 PC 值”指程序中下一条指令所在的首地址, 是一个16位数; 2)符号“rel”表示“偏移量”,是一个带符号的单字节 数,范围是:-128~+127(80H~7FH)。

在实际编程中,“rel” 通常用标号代替。

3.3 指令系统
单片机所能执行的各种指令的集合称为它的指令系统 指令的分类: 每条指令在程序存储器ROM中占据一定的空间,以字节为 单位。51系列按指令所占字节数分类: 单字节(49条);双字节(46条);3字节(16条) 每条指令在执行时要花去一定的时间,以机器周期为单位。 51系列按指令执行时间分类: 单周期(64条);双周期(45条);4周期(2条) 按指令的功能分类,可分为5大类: 51系列有 数据传送类(29条);算术运算类(24条); 逻辑运算及移位类(24);控制转移类(17条); 位操作类(17条)
2014-1-21
15

3.3.1

数据传送指令

最基本和最重要的指令类,可实现寄存器、 存储器之间的数据传送。 一、内部传送指令: 二、外部传送指令: 三、交换指令: 四、堆栈操作指令: 五、查表指令: 片内数据存储器数据传送。 片外数据存储器数据传送。 片内数据存储器数据传送。 片内数据存储器数据传送。 程序存储器数据传送。

2014-1-21

16

(一)内部传送指令:
实现片内数据存储器中数据传送。 指令格式: MOV 目的操作数,源操作数 寻址方式:立即寻址、直接寻址、寄存器寻址、寄存器间址。 指令机器码: MOV A,Rn ;A←(Rn),Rn=R0~R7 11101rrr E8~EF MOV A,direct ;A←(direct) 11100101 n E5 n MOV A,@Ri ;A←((Ri)),Ri=R0、R1 1110011i E6、E7 MOV A,#data ;A←data 01110100 d 74 d MOV Rn, direct ;Rn←(direct) 10101rrr n MOV @Ri, direct ;(Ri)←(direct) 1010011i n MOV direct1,direct2 85 n1 n2 ;(direct1)←(direct2) MOV DPTR,#d1d2 ;DPTR←d1d2 90 d1 d2

*题:找出配对指令,实现反向传送。

例: 顺序执行下列指令序列,求每一步执行结果。
MOV MOV MOV MOV MOV A,#30H 4FH,A R0,#20H @R0,4FH 21H,20H ;A= 30H ;(4FH)= 30H ;R0= 20H ;(20H)= 30H ;(21H)= 30H
地址 内容 ? 60H 32H ? 32H 58H

*题:用两种寻址方式实现,将片内RAM 60H单元的数据传送给累加器A。

解: MOV

A,#60H(×) MOV R0,60H MOV A,@R0

(×)

解: MOV A,60H (√) MOV R0,#60H (√) 结果A=32H MOV A,@R0

说 明:
1. 一条指令中不能同时出现两个工作寄存器: 非法指令: MOV R1,R2 MOV R2,@R0 2. 间址寄存器只能使用 R0、R1。 非法指令: MOV A,@R2 3. SFR区只能直接寻址,不能用寄存器间接寻址。 非法指令: MOV R0,#80H MOV A,@R0

只有指令表中的指令才有对应指令代码,计算机才能 执行。编程时,不能随意创造发明指令。
2014-1-21
19

(二) 外部RAM传送指令:
指令格式:MOVX

(MOVX)

实现片外数据存储器和A累加器之间的数据传送。 目的操作数,源操作数 寻址方式:片外数据存储器用寄存器间址方式。 1. DPTR作16位数据指针,寻址64KB片外RAM空间: MOVX A,@DPTR ;A←((DPTR)) (读)

MOVX

@DPTR,A ;(DPTR)←A

(写)

2. Ri作8位数据指针,寻址256B片外RAM空间

(页内寻址):
MOVX A,@Ri MOVX @Ri,A
2014-1-21

;A←((P2Ri)) ;(P2Ri)←A

(读) (写)
20

例:实现片外数据存储器数据传送(2000H)?(2100H)。
MOV MOVX MOV MOVX DPTR,#2000H A,@DPTR DPTR,#2100H @DPTR,A
片外 RAM 地址 内容 2000H X ? 2100H X

; ; ; ;

DPTR= 2000H A= X DPTR= 2100H (2100H)= X

DPTR→
DPTR→

片外数据存储器不能直接寻址。 下列为非法指令: MOVX A,2000H MOVX 2100H,2000H

思考题:为什么对DPTR的数据传送使用内部传送指令? *题:将片外RAM 0000H单元的数据传送到片内RAM的60H单元。

(三) ROM传送指令(查表指令):(MOVC)
实现从程序存储器读取数据到A累加器,只能使 用变址间接寻址方式。 多用于查常数表程序,可直接求取常数表中的 函数值。 1.DPTR为基址寄存器: MOVC A,@A+DPTR ;A?((A+DPTR)) (读) 查表范围为 64KB 程序存储器任意空间, 称为远程查表指令。 2.PC为基址寄存器: MOVC A,@A+PC ;A?((A+PC)) (读) 常数表只能在查表指令后256B范围内, 称为*程查表指令。
2014-1-21
22

例1:以查表方法把累加器中的十六进制数转换
为ASCII码,并送回累加器中。 程序如下: 指令地址 2000 2001 2002 2003 2004 2005 …… 2011 2012 DB DB 45H 46H 源程序 ORG 2000H HBA:INC A MOVC A,@A+PC RET DB DB DB 30H 31H 32H
十六进制与ASCII码对应 十六进制 ASCII码 30H 0 1 31H ... ... E F 45H 46H

外部ROM

...
2012H 2005H 46H

...

32H 31H 2004H 30H 2003H 2002H RET 2001H MOVC 2000H INC A

PC

PC

例2 : 查表法求Y=X2。设X(0≤X≤15)在片内RAM的20H 单元中,要求查表求Y,存入片内RAM 21H单元。
内部RAM

... ...

方法1:

21H Y(结果) 20H X(变量)

Y A X A
外部ROM

程序: ORG 1000H SQU: MOV DPTR,#3000H ;确定表首地址(基地址) MOV A,20H ;取 X(变量:偏移量) MOVC A,@A+DPTR ;查表求Y=X2 3001H MOV 21H,A ;保存Y(结果) 3000H RET ;子程序结束 … ;其它程序段 ORG 3000H ;常数表格首地址 1000H TAB: DB 00,01,04,09,… ,225 ;*方表 END

...
225

...
01 00 DPTR

...
30H 00H 90H

PC

例2: 查表法求Y=X2。设X(0≤X≤15)在片内RAM的20H 单元中,要求查表求Y,存入片内RAM 21H单元。
内部RAM
外部ROM

方法2:

... ...

...

21H Y(结果) 20H X(变量)

Y A X A
1009H 1008H

225

... ...
01 00 PC

指令地址 1000H 1002H 1004H 1005H 1007H 1008H 100BH SQU:

TAB:

源程序 ORG 1000H MOV A,20H ADD A,#3 MOVC A,@A+PC MOV 21H,A RET DB 00,01,04 … DB 09,… ,225

;程序起始地址 20H ;取X 1000H E5H PC ;修正偏移量 ;查表求Y=X2 (PC=1005H) ;存结果 ;子程序结束 ;*方表

(四) 交换指令:
实现片内RAM区的数据双向传送。 1. 字节交换指令 XCH A,Rn ;A ?(Rn) XCH A,@Ri ;A ?((Ri)) XCH A,direct ;A ?(direct)
片内 RAM 地址 内容 2BH 35H 2AH 38H 29H ? 20H

例:设A=29H,执行指令 XCH A,2AH后, A= 38H ? , (2AH)= 29H ?
*题:将片内RAM60H单元与61H单元的数据交换。 XCH 60H,61H; ←对吗?

不对!!
2014-1-21
26

2. 半字节交换指令:
例:将片内RAM 2AH和2BH单元中的ASCII码转换成 压缩式BCD码存入20H单元。
单字节 BCD 0000 千位 0000 百位 0000 十位 0000 个位

XCHD A,@Ri ;A0~3 ?((Ri))0~3 SWAP A ;A4 ~7 ? A0 ~3

压缩式 BCD 码 千位 百位 十位 个位
A

片内 RAM 地址 内容 2BH 35H 2AH 38H ? 20H 58H

MOV A,#0
MOV R0,#2AH MOV R1,#2BH XCHD A,@R1 SWAP A XCHD A,@R0 XCH A,20H

00000000

00H

R0 R1 R1

00111000 00110101

38H 35H 30H 30H

A
A A 20H

00000101 01010000 01011000 01011000

05H 50H 58H 58H

00110000
00110000

R0

*题:交换片内RAM 40H单元和 41H单元的低半字节。

(五)堆栈操作指令:
入栈指令:PUSH direct ;SP←SP+1,(SP)←(direct) 出栈指令:POP direct ;(direct)←(SP),SP←SP-1 “先加后压” “先弹后减”

例:设 A=02H,B=56H,执行下列指令后, SP= 30H ? ,A= 02H ? ,B= 56H ?
SBR: MOV SP,#30H ;设栈底 PUSH A PUSH B MOV A,#00H MOV B,#01H … POP B POP A

A 00H A 02H A 00H

01H B 56H 56H B

片内 RAM × 34H × × 33H × SP→ 32H 56H 56H SP→ × × 02H SP→ 31H 02H × × SP→ 30H ×
28

2014-1-21

练*:
说明程序执行过程中,SP的内容及堆栈中内 容的改变过程。
程序如下:
MOV SP,#30H MOV A,#20H ;SP=30H ;A=20H

MOV B,#30H
PUSH A PUSH B …… POP A POP B

;B=30H
;SP=31H (31H)=20H ;SP=32H (32H)=30H ……

;A=30H
;B=20H

SP=31H
SP=30H

2014-1-21

29

*题:找出指令错误并改正:
1.MOV
2.MOVX

A,#1000H ;A←1000H(A装1个字节数)
A,1000H ;A←(1000H) 片外 RAM(DPTR、Ri)

3 . MOVC
4.MOVX 5.MOV

A,1000H
60H,A R0,60H

;A←(1000H) 片外 ROM(DPTR、PC)
;片外RAM(60H)←A(应为MOV) ;片内RAM:(61H)←(60H)

MOV
6. XCH

61H,@R0
R1,R2

(片内RAM可直接寻址)
;R1?R2(必须有A参加)

7. MOVX
8. MOVX

DPTR,#2000H
60H,@DPTR

;DPTR←2000H(应为MOV)
;片内RAM←片外RAM (必须有A参加)

3.3.2 算术运算指令
与数据传送指令不同,多数算术运算指令会
影响标志位的状态,即CPU执行算术运算指令后,

根据数据操作情况自动设置标志位的状态。
MCS-51 的程序状态字寄存器 PSW 为标志寄存器。

其格式如下:字节地址为D0H
位序 B7 B6 B5 B4 B3 B2 B1 B0 P

位符号 CY

AC F0

RS1 RS0 OV F1

2014-1-21

31

1.标志位(自动设置状态):
1)CY:进位标志位(B7)

保存运算后最高位的进位/借位状态,当有进位/借 位,CY=1,否则Cy=0。
2)AC:辅助进位标志位(B6)

保存低半字节的进位/借位状态,当D3产生进位/借 位,AC=1,否则AC=0。用于十进制调整。
3)OV:溢出标志位(B2)

OV=Cy7?Cy6,补码运算产生溢出OV=1,否则OV=0。
4)P:奇偶标志位(B0) 反映累加器A中数据的奇偶性。当1的个数为奇数, P=1,否则P=0。
2014-1-21
32

2.用户选择位(编程设置状态)
1)F0、F1 :用户自定义标志位。
2)RS1、RS0 :
RS1 0 RS0 0 工作寄存器 0区

工作寄存器区选择位。
复位时,PSW=00H

0
1 1

1
0 1

1区
2区 3区

例:复位后,设置使用工作寄存器3区, 其余标志位不变。

解: MOV
位序

PSW,# 18H
B7 B6 B5 B4 B3 B2 B1 B0 P
33

位符号 CY
2014-1-21

AC F0

RS1 RS0 OV F1

算术运算指令:
完成片内RAM和A中数据的加减乘除运算。

加减指令(读-修改-写): 1. 加法指令:

1)不带进位加法:ADD A,源操作数 如:ADD A,R2 ;A←A+R2,影响CY、OV、AC、P 例1:已知A=3BH,PSW=0,执行指令 ADD A,#3BH 后 求:A= 76H ?Cy= 0 ?OV= 0 ?AC= 1 ?P= 1 ? PSW= 01000001= 41H ?
位序 B7 B6 B5 B4 B3 B2 B1 B0 P

0011 1011=3BH + 0011 1011=3BH 0111 0110

位符号 CY
2014-1-21

AC F0

RS1 RS0 OV F1

34

2)带进位加法:

ADDC

A,源操作数

如:ADDC A,R2 ;A←A+R2+Cy,影响Cy、OV、AC、P

例:A= 9AH,R2= E3H,PSW= 0,执行指令 ADDC A,R2 后求: A= 7DH ?Cy= 1 ?OV= 1 ?AC= 0 ?P= 0 ? PSW= 10000100 = 84H ?

10011010=9AH 11100011=E3H + 0 1 0111 1101=7DH
B3 B2 B1 B0
P
35

位序

B7

B6

B5

B4

位符号 CY
2014-1-21

AC F0

RS1 RS0 OV F1

带进位加法指令ADDC用于多字节运算:
例:设双字节数 X 存在片内RAM 41H、40H单元,Y 存在42H、43H单元,编程求 Z=X+Y,并存入片内 RAM单元44H、45H、46H。 MOV A,40H ;取被加数低字节 片内 RAM ADD A,42H ;加上加数低字节 地址 内容 MOV 44H,A ;保存和的低字节 ;低字节相加 46H ZH MOV A,41H ;取被加数高字节 45H ZM ADDC A,43H ;加上加数高字节 ;高字节相加 44H ZL 43H YH MOV 45H,A ;保存和的高字节 YL MOV A,#00H ;求高字节进位 ;计算高字节进位 42H 41H XH ADDC A,#00H 40H XL MOV 46H,A
RET
;子程序结束 ;子程序结束

BCD调整指令:BCD:Binary-Coded-Decimal (二进制编码的十进制) DA A ;把A中按二进制相加后的结果 调整成按BCD数相加的结果 调整原因:1、相加结果大于9,进入无效编码区; 2、相加结果有进位,跳过无效编码区。 调整方法:进行加“6”修正。 十进制加法指令:仅对加法结果进行调整 ADD A,源操作数 DA A 带进位十进制加1法指令: ADDC A,源操作数 DA A 作业:BCD码加法编程。 设X、Y为4位压缩BCD码,求 Z=X+Y。
2014-1-21
37

2.减法指令:
SUBB A,源操作数 ;带借位减法指令
A ,R 2 ;A←A-R2-Cy, ;影响Cy、OV、AC、P 如:SUBB

例:A= 5AH,R2= 5AH,Cy= 0,执行下列指令 SUBB A,R2 求: A= 00 ?Cy= 0 ?OV= 0 ?P= 0 ?AC= 0 ?
*题:编程求双字节减法。设X、Y存在片内 0101 1010=5AH 0101 1010=5AH RAM60H起始单元,计算 Z=X-Y。

-

0 0000 0000=00H

思考:有不带借位的减法指令吗?
2014-1-21
38

3. 增量、减量指令:
INC 如: INC DEC 如: DEC 单操作数 R2 ;R2←R2+1 单操作数 R2 ;R2←R2-1

INC DPTR ;DPTR←DPTR+1 不影响标志位状态。

注意:没有指令
可用指令
2014-1-21

DEC DPTR DEC DPL 代替
39

4.乘除指令:
MUL AB ;BA←A×B,Cy←0,
;当积高字节B=0,OV←0;B≠0,则OV←1

DIV

AB ;A÷B,A←商,B←余数,Cy←0,
;当除数B=0,OV←1;B≠0,则OV←0

例:A= 96(60H), B= 192(C0H),执行指令 MUL AB 后, 求:A= 00H ?B= 48H ?Cy= 0 ?OV= 1 ?P= 0 ? 解: 96 ×192 = 18432(4800H) 例:A= 156(F6H),B= 13(0DH),执行指令 DIV AB 后 求:A= 12H ?B= 0CH ?Cy= 0 ?OV= 0 ?P= 0 ? 解: 156 ÷ 13 = 18(12H),余数= 12(0CH)。

思考题:如何实现多字节数据的乘除运算。
2014-1-21
40

3.3.3

逻辑运算指令

一、单操作数指令(A累加器为操作数): 1. A清0指令: CLR A ;A←0 2. A取反指令: CPL A ;A←A
3、循环移位指令:
1)8位循环指令: RL A ;A循环左移一位 rotate RR A ;A循环右移一位

2)9位循环指令: RLC A ;带Cy循环左移一位 RRC
2014-1-21

A

;带Cy循环右移一位
41

例:设 A= 11000101 B,Cy= 0,分别执行下列单条指令: CPL A 求:A= 00111010 ?Cy= 0 ? RL A 求:A= 10001011 ?Cy= 0 ? RLC A 求:A= 10001010 ?Cy= 1 ?

用9位循环指令实现多字节移位: 例:编程将寄存器 R6R5中的双字节数X左移一位。
CLR MOV RLC MOV MOV RLC MOV C A,R5 A R5 ,A A,R6 A R6 ,A
;Cy=0, 设 R6= 55H ,R5= AAH ;R6=01010101B,R5=10101010B,Cy=0 ;R6=01010101B,R5=01010100B,Cy=1
Cy R6 R5 Cy 0

;R6=10101011B,R5=01010100B,Cy=0

思考题:如何将寄存器R6R5中的双字节数X右移一位。

二、双操作数逻辑运算指令(对位逻辑运算): ANL、ORL、XRL
例:A=01××××××B,×表示随机状态,为1或0,

下述一组指令执行后,A的值如何?
XRL A,#0C0H ORL A,#03H ANL A,#0E7H ;将累加器A的内容D7、D6取反 ;将累加器A的内容D1、D0置1 ;将累加器A的内容D4、D3清0

解 :执行上述指令后,A=10×00×11B。

*题1:如何将累加器A中的数据高4位清0,低位不变? *题2:如何将寄存器R2中的数据奇数位取反,偶数位不变?
43

2014-1-21

3.3.4

布尔变量操作指令

对片内RAM中位寻址区操作。位累加器Cy和位地址bit。 一.位传送: MOV C,bit MOV bit,C ;Cy?(bit) ;(bit)?Cy

例:将位地址20H的一位数传送到位地址30H中: MOV C,20H 26H 1 0 1 1 0 1 0 1 MOV 30H,C 25H 1 0 0 0 0 1 1 0
24H 0 1 1 1 0 0 0 0

二.位清0、置1、取反(CLR、SETB、CPL): CLR C ;Cy?0 CLR 40H ;(位地址40H)?0
2014-1-21
44

三.逻辑运算(ANL、ORL):
ANL ANL C,40H C,40H ;C←C∧(40H) ;C←C∧(40H)

例:设 Cy=1,(位地址40H)=1,执行指令 ANL C,40H 后, Cy= ? 1 0 ,(位地址40H)= ?

位地址表示法: 位地址 40H,位寄存器 F0 ,字节加位 ACC.0

*题:设累加器A中数据为 29H=00101001B,Cy=0, 执行指令 ORL C,0E3H 后, Cy= ? 1
2014-1-21
45

3.3.5 转移指令
转移指令通过改写PC的当前值,从而改变CPU 执行程序的顺序,使程序发生跳转。 按转移条件分类: 1)无条件转移:(LJMP、AJMP、SJMP、JMP) 执行无条件转移指令,程序无条件转移到 指定处。 2)条件转移: 指令中给出转移条件,执行指令时,先测 试条件:若满足条件,则程序发生转移;否则, 仍顺序执行程序。
2014-1-21
46

按转移方式分类:
1)绝对转移:指令给出转移目的的绝对地址 d2d1, 执行指令后,PC?d2d1。 例: 地址 1000H 1003H 2000H 源程序 LJMP 2000H(长转移) … … … ;转移目的指令

2)相对转移:指令给出转移目的与转移指令的相对 偏移量rel,执行指令后,PC?PC + rel 。 目的地址=PC+字节数+rel 1000H SJMP 02 例: 地址 源程序 1000H SJMP 02(短转移)(2字节) … 1004H 1004H … ;转移目的指令
2014-1-21
47

一、无条件转移指令:
无条件转移: LJMP,AJMP,SJMP,JMP——4条

addr16 长跳转指令 ——可在64KB范围内跳转 AJMP addr11 短跳转指令 ——可在指令所在的2KB范围内跳转 SJMP rel 相对跳转指令 ——可在当前PC-128与+127范围内跳转 JMP @A+DPTR 散转指令 ——可在以DPTR为基址 + A为偏移量

LJMP

之和所指向的64KB程序范围内跳转
2014-1-21
48

1. 长转移指令: LJMP addr16(d2d1)
指令机器码: 02 d2 d1 指令转移范围:64KB

;PC?d2d1

2. 短跳转指令: AJMP addr11 (2个字节)

;PC?PC+2 ;PC10~0?addr11 PC15~11不变

指令机器码: addr11~9 00001 addr8~1 指令转移范围:2KB 转移时要求转移前后保持 PC15~11不变。
例: 1030H AJMP 100H 指令机器码:21 00H 目的地址为:1100H
49

2014-1-21

3. 相对跳转指令:
SJMP rel ;PC?PC+2,PC?PC+rel 指令机器码: 80H rel 相对偏移量 rel为带符号的8位补码数。 rel=[目的地址-(源地址+2)]补 rel为正数:向前转移; rel=地址差-2 rel为负数:向后转移。 rel=FEH+地址差 指令转移范围:前128~后127字节
相对偏移量 rel 的计算通式: rel = [目的地址 -(转移指令地址+指令字节数)]补 = [目的地址 - PC当前值]补 (1)由偏移量rel计算目的地址; (2)由目的地址计算偏移量rel。 编程时,用标号代替转移目的地址,转移指令的操作数交给汇编程序计算。 LJMP NEXT(AJMP NEXT/SJMP NEXT) … NEXT:

例1:计算转移指令的目的地址。

(1 )

835AH

SJMP

35H

解: rel= 35H = 0011 0101B 为正数,因此程序向前转移。 目的地址 =(PC)+ 2 + rel

= 835AH + 02H + 35H = 8391H
(2 ) 835AH SJMP 0E7H 解: rel=0E7H = 1110 0111B 为负数,因此程序向后转移。

目的地址 = 835AH + 02H + 0E7H
= 8343H

例2:计算转移指令的相对偏移量 rel,并判断是否超出转移范围?
源程序 SJMP NEXT … 2150H NEXT:MOV A ,R 2 相对偏移量rel = 2150H -(2130H+2) = 001EH= +30D(未超出转移范围), rel = 1EH 求出指令机器码:80 1EH 指令地址 2130H

例3:求原地踏步指令的指令代码:
HERE:SJMP HERE(或SJMP $)
相对偏移量 = [2000H-(2000H+2)]补= FEH, rel = FEH 求出指令代码为:80 FEH

*题:计算程序中转移指令的相对偏移量rel,并判断是否 超出转移范围。 地址 源程序 2130H LOOP: … … 21B0H SJMP LOOP 相对偏移量 = [2130H –(21B0H+2)]补= (-130)补 rel已超出转移范围(-126D~+129D)

2014-1-21

52

4.间接转移指令(多分支转移指令): JMP @A+DPTR ;PC←((A+DPTR)) 指令机器码 73H,指令转移范围64KB。 应用:处理功能键。
要求不同功能键执行不同 程序段。设每个功能键对应一 个键值 X(0≤X≤FH)。 设X已存入片内RAM的40H 单元中。 若X=0,则执行程序段FUNC0; 若X=1,则执行程序段FUNC1;

KEY:

… 。

MOV DPTR,#KTAB MOV A,40H ADD A,A JMP @A+DPTR KTAB: AJMP FUNC0 AJMP FUNC1 … FUNC0: … FUNC1: …

二、条件转移指令:
条件转移指令形成程序的分支,赋予计算机判断决策能力。 转移条件:1)标志位的状态; 2)位地址中的状态。

1. A判零转移指令:

JZ
JNZ

rel ;PC←PC+2,
;若A=00H,PC←PC+rel(转移), 若A≠00H,PC不变(不转移)

rel

;PC←PC+2, ;若A≠00H PC←PC+ rel(转移) 若A=00H,PC不变(不转移)

2. 判Cy转移指令: JC rel ;Cy=1则转移,Cy=0不转移 JNC rel ;Cy=0则转移,Cy=1不转移
2014-1-21
54

3.判位转移指令:
JB bit,rel ;(bit)=1转移,否则不转移

JNB bit,rel

;(bit)=0转移,否则不转移 ;(bit)=1转移,且(bit)=0, 否则不转移

4. 判位清0转移指令:
JBC bit,rel

5. 比较不相等转移指令:
CJNE
CJNE

操作数1,操作数2,rel
A,direct,rel ;PC←PC+3 ;若A= (direct),顺序执行,且Cy=0。 若A≠(direct),则PC←PC+rel+3 且当A>(direct),Cy=0, 当A<(direct),Cy=1。

相当于两个操作数相减,仅影响标志状态,不保存结果。

6.循环转移指令:
DJNZ DJNZ 操作数,rel R2,rel ;PC←PC+2,R2←R2-1 ;若R2≠0,PC←(PC)+2+rel, ;若R2=0, PC←(PC)+2。

例:用于循环结构程序。设要求程序循环执行100次。 MOV R2,#100 ;设循环计数器初值 LOOP: … ;多次循环程序段 初始化 循环体 DJNZ R2,LOOP ;循环控制 包括 控制变量的修改 … 循环次数的控制 ;循环结束 例:设单片机的晶振频率为6MHz,编写一段延时程序约100ms的子程序。 Delay: MOV R7,#64H ;设循环计数器初值(100次) LOOP: MOV R6,#0FAH ;循环250次(250×4=1ms) DJNZ R6,$ ;循环控制 DJNZ R7,LOOP RET T=12/6 MHz=2μ s t=2μ s+100×(2μ s+1ms+2×2μ s)+2 ×2μ s =100.606 ms *题:当循环计数器初值为0,循环次数有多少?

3.3.6 子程序调用和返回指令
子程序调用和返回指令也使程序发生转移。 子程序调用过程: 主程序 ? 与转移指令不同:转移时, CALL S 先用堆栈保存当前地址。 ?
子程序 S ? ? ? RET

一、长调用指令: LCALL addr16

CALL ?

S

;PC?PC+3, ;SP?SP+1,(SP)?PC0~7; SP?SP+1,(SP)?PC8~15; PC?addr16 addr16为子程序起始地址,编程时可用标号代替。 指令机器码:12 addr8~15 addr0~7 指令调用范围:64KB
57

2014-1-21

二、绝对调用指令: ACALL addr11

;PC?PC+2 ;SP?SP+1,(SP)? PC0~7 , SP?SP+1,(SP)? PC8~15 ;PC10~0?addr11 PC15~11不变 addr11为子程序首地址 指令机器码:addr11~9 10001 addr8~1 指令调用范围 2KB。 ;PC15~8?(SP),SP?SP-1, PC7~0 ?(SP),SP?SP-1

三、子程序返回指令: RET

指令机器码:22H RET指令从堆栈弹出保存的PC地址,实现子程序返回。

2014-1-21

58

例:子程序嵌套:
MAIN:MOV SP,#30H … LCALL SUB … SUB: … … RET ;设置栈底 ;调用子程序 ;子程序段 ;返回主程序

程序存储器 2000H MOV SP, #30H 208FH 2100H 2150H 21FFH 2200H 2250H ? LCALL 2100H ? ? ? LCALL 2200H ? RET ? ? RET

片内 RAM 35H SP→ 34H 21H 53H SP→ 33H SP→ 32H 20H 92H SP→ 31H × SP→ 30H

PC 2251H 2092H 2200H 2250H 208FH 2100H 2153H 21FFH 2000H 2150H

注意:
1、子程序起始指令要使用标号,用作子程序名。 2、执行返回指令RET之前,保证栈顶内容为主程序返回地 址,以便正确返回主程序。

常用格式: MAIN: … ;主程序

LCALL
… … SUBR: … …

SUBR

;调用SUBR

;子程序首地址

RET
2014-1-21

;子程序返回
60

3.3.7 I/O口访问、空操作 和中断返回指令
1、可以按口寻址,进行字节操作; 如:MOV Pm,A 可以按口线寻址,进行位操作。 如:MOV Pm.n,C 2、没有专门的输入/输出指令,均使用MOV传送指令 来完成: 输入:用MOV指令把各口线的引脚状态读入; 输出:用MOV指令把输出数据写入各口线电路 的锁存器。
2014-1-21
61

3、在进行引脚数据输入操作之前,必须先向电路中 的锁存器写入“1”,使FET截止,以避免锁存器 为“0”状态时对引脚读入的干扰。 4、空操作指令 NOP 该指令在延迟等程序程序中用于调整CPU的执行 时间,不执行任何操作。 5、中断返回指令 RETI 中断服务程序必须以RETI为结束指令。CPU执行 RETI后至少再执行一条指令,才能相应新中断请求。
2014-1-21
62

3.4 程序设计方法

2014-1-21

63





1、指令的寻址方式、格式、功能和使用方法。 7种寻址方式:寄存器寻址; 寄存器间接寻址; 直接寻址; 立即寻址; 变址寻址; 相对寻址; 位寻址。 2、指令分类介绍:
2014-1-21
64

3、寻址方式:

(1)对程序存储器(内、外):只能变址寻址 MOVC (2)对内部数据存储器:MOV
寻址方式 低128单元 高128单元 (SFR) 用户RAM区 位寻址区 寄存器区

(0FFH~80H) (7FH~30H) (2FH~20H) (1FH~00H) 寄存器寻址方式 位寻址方式 部分 直接寻址方式 间接寻址方式

(3)对外部数据存储器:只能寄存器间址

MOVX

高地址单元(65280个) 低地址单元(256个) 寄存器间接寻址方式 (0FFFFH ~0100H) (00FFH ~0000H) 以R0 或R1 作间址寄存器 以DPTR作 间址寄存器

2014-1-21

66


相关文档

  • 第10章80C51单片机指令系统与程序设计
  • 第3章MCS51系列单片机的指令系统及汇编语言程序设计续
  • 】MCS-51单片机指令系统与汇编语言程序设计
  • MCS-51系列单片机的指令系统及汇编语言程序设计
  • 第3章MCS-51单片机指令系统与程序设计
  • MCS-51单片机指令系统与编程
  • 猜你喜欢

  • 【新】2019-2020学年度高三数学上学期第二次质量调研考试试题文(2)
  • 新疆兵团二中2018-2018学年高二地理下学期期中考试试题
  • 幼儿园大班音乐活动说课稿《迷路的小花鸭》
  • 高考考点2地图的有关知识
  • 反射应用--IOC和AOP
  • 百度频繁更新,SEO路在何方?
  • 黑色地膜
  • 辽宁省人民政府办公厅关于印发《辽宁省深入实施知识产权战略行动
  • 高三数学上学期第五次月考(期末)试题理(扫描版,无答案)
  • 2013年高中化学教学论文 如何打造化学高效课堂
  • 支持软件演化的第2代SDDM软件过程模型
  • 10MRPⅡERP原理:财务成本管理
  • 北京市丰台区花乡农工商联合总公司(企业信用报告)- 天眼查
  • 关于工作梦想励志的话语
  • 年产20万吨超临界萃取油浆综合利用(融资投资立项项目可行性研究报告(非常详细)
  • 战略计划管理岗位说明书
  • 数学人教版五年级下册“探索图形”评测练*
  • 2019版高中物理 第1章 电磁感应与现代生活章末检测试卷 沪科版选修3-2
  • 报告显示我国*三成资产超1亿元企业主已经移民
  • 电脑显示未连接网络怎么办啊
  • 华为手机助手备份慢
  • 苏教版膳食指南与食品安全PPT优质课件1
  • 炒股技巧与实战经验、指标运用
  • 陆游家风家训
  • 新型墙体材料项目投资简介
  • “后国民时代”的重新布阵
  • 人教版数学六年级下册圆柱体的表面积教学设计
  • 利用AC自动机进行关键字的提取和过滤
  • 【2018最新】会计岗位实*报告-范文模板 (2页)
  • 交通安全知识教育顺口溜有哪些
  • 嘉荫县森林资源的景观分析研究
  • 小学音乐国培总结
  • 20XX年农业局农民培训工作总结
  • 致国家助学贷款毕业生的一封信
  • 2012黑龙江省教师资格证考试《综合素质》理论考试试题及答案
  • 五年级作文:看中国好声音有感_450字
  • 新形势下如何做好高校政府采购工作
  • Java8 Lambda语法之双冒号
  • 开具红字普通发票报备单 - 浙江省淳安县国家税务局
  • 史志档案局“一准则一条例一规则”集中学*教育活动方案
  • 中秋主题班会活动设计方案
  • 节日庆典-新郎致辞 精品
  • 电脑版