位操作指令

Download Report

Transcript 位操作指令

凌阳8位通用单片机原理及基础
SPMC65指令系统
2
主要内容
 SPMC65的寻址方式和指令分类
 数据传送类指令
 算术运算类指令
 逻辑运算类指令
 控制转移类指令
 位操作和处理器控制指令
 常用伪指令
3
SPMC65的寻址方式和指令分类
4
寻址方式
 立即数寻址
 绝对寻址
 零页寻址
 绝对变址寻址
 零页变址寻址
 间接跳转寻址
 变址间接寻址
5
例:LDA $34
例:LDA $E030
例:LDA $80

例:LDA $75,X
例:JMP ($F600)

寻址方式
 间接变址寻址
 隐含寻址
 累加器寻址
 相对寻址
6

例:TAX
CLC
例:ROL A
例:BCC Label
绝对变址寻址
 使用一个基址和一个指针(寄存器X/Y)
来指明目标操作数地址。
格式: 操作码 8位/16位地址, X/Y
例: LDA F010h, X
7
F010h
12h
A
78h
??
F011h
34h
X
03h
F012h
56h
F013h
78h
F014h
9Ah
F010h
变址间接寻址
 8位地址+偏移指针(寄存器X)作为目标
操作数的地址指针。
格式:操作码 (8位地址, X)
例: LDA (63h, X)
8
63h
12h
A
??
78h
64h
34h
X
02h
65h
13h
66h
F0h
……
F012h
……
56h
F013h
78h
F014h
.
9Ah
F013h
63h
间接变址寻址
 采用8位地址作为目标操作数的基址指
针,基址加上偏移指针(寄存器Y)作
为目标数的地址。
格式:操作码 (8位地址), Y
例: LDA (63h), Y
9
63h
10h
64h
F0h
65h
34h
……
F010h
……
12h
F011h
34h
F012h
56h
F013h
78h
F010h
A
??
X
02h
指令分类
 数据传送类
在寄存器、存储器之间进行数据传送
 算术运算类
加、减、比较等运算
 逻辑运算类
与、或、异或、移位等逻辑操作
 控制转移类
条件转移、无条件转移、子程序调用等
 位操作类
对操作数的某一位进行置位、清零、取反等
 处理器控制类
开关中断、对各标志位进行设置等
10
数据传送指令
11
数据传送指令(1)
 向寄存器传送(Load)
LDA、LDX、LDY
A  数据
LDA
LDA
LDA
LDA
LDA
LDA
12
#立即数
地址
地址, X
地址, Y
(8位地址, X)
(8位地址), Y
X  数据
Y  数据
LDX #立即数
LDX 地址
LDX 地址, Y
LDY #立即数
LDY 地址
LDY 地址, X
数据传送指令(2)
 寄存器  存储器(Store)
STA、STX、STY
A  存储器
STA
STA
STA
STA
STA
13
地址
地址, X
地址, Y
(8位地址, X)
(8位地址), Y
Y  存储器
Y  存储器
STX 地址
STX 8位地址, Y
STY 地址
STY 8位地址, X
数据传送指令(3)
 寄存器  寄存器(Transfer)
TAX、TXA、TAY、TYA、TXS、TSX
AX
TAX
AX
TXA
14
AY
TAY
AY
TYA
X  SP
TXS
X  SP
TSX
数据传送指令(4)
 寄存器   堆栈(Push&Pull)
PHA、PHP、PLA、PLP
A  堆栈
P  堆栈
A  堆栈
P  堆栈
PHA
PHP
PLA
PLP
Stack
A
15
78h
1FCh
??
1FDh
??
1FEh
??
SP
1FEh
1FFh
??
78h
SP
1FFh
数据传送指令(4)
 寄存器   堆栈(Push&Pull)
PHA、PHP、PLA、PLP
A  堆栈
P  堆栈
A  堆栈
P  堆栈
PHA
PHP
PLA
PLP
Stack
A
16
??
78h
1FCh
??
1FDh
??
1FEh
??
SP
1FEh
1FFh
78h
SP
1FFh
算术运算指令
17
算术运算指令(1)
 带进位加减法(Add/Sub with Carry)
ADC、SBC
A  A + 数据 + C
ADC
ADC
ADC
ADC
ADC
ADC
#立即数
地址
地址, X
地址, Y
(8位地址, X)
(8位地址), Y
发生进位:C  1
未发生进位:C  0
18
_
A  A - 数据 - C
SBC
SBC
SBC
SBC
SBC
SBC
#立即数
地址
地址, X
地址, Y
(8位地址, X)
(8位地址), Y
发生借位:C  0
未发生借位:C  1
算术运算指令(2)
 自增自减运算(Increase、Decrease)
INX、INY、 INC、DEX、DEY、DEC
19
XX+1
YY+1
XX-1
YY-1
INX
INY
DEX
DEY
存储器内容
自增1
存储器内容
自减1
INC 地址
INC 地址, X
DEC 地址
DEC 地址, X
算术运算指令(3)
 比较运算(Compare)
CMP、CPX、CPY
A – 数据
CMP
CMP
CMP
CMP
CMP
CMP
20
#立即数
地址
地址, X
地址, Y
(8位地址, X)
(8位地址), Y
X – 数据
Y – 数据
CMX #立即数
CMX 地址
CMY #立即数
CMY 地址
结果为零:Z  1, C  0
结果为负:Z  0, C  0
结果非负:Z  0, C  1
逻辑运算指令
21
逻辑运算指令(1)
 与、或、异或(And、Or、Exclusive Or)
AND、ORA、EOR
A  A & 数据
AND
AND
AND
AND
AND
AND
#立即数
地址
地址, X
地址, Y
(8位地址, X)
(8位地址), Y
(0 & 0) = 0; (1 & 1) = 1
(0 & 1) = 0; (1 & 0) = 0
22
A  A | 数据
ORA
ORA
ORA
ORA
ORA
ORA
#立即数
地址
地址, X
地址, Y
(8位地址, X)
(8位地址), Y
(0 | 0) = 0; (1 | 1) = 1
(0 | 1) = 1; (1 | 0) = 1
A  A ^ 数据
EOR
EOR
EOR
EOR
EOR
EOR
#立即数
地址
地址, X
地址, Y
(8位地址, X)
(8位地址), Y
(0 ^ 0) = 0; (1 ^ 1) = 0
(0 ^ 1) = 1; (1 ^ 0) = 1
逻辑运算指令(2)
 左移、右移(Shift Left/Right)
ASL、LSR
数据左移1位
ASL A
ASL 地址
ASL 地址, X
数据右移1位
LSR A
LSR 地址
LSR 地址, X
23
最高位移入C,最低位填充0
7
6
5
4
3
2
1
0
C
0
最低位移入C,最高位填充0
7
0
6
5
4
3
2
1
0
C
逻辑运算指令(3)
 循环左移、右移(Rotate Left/Right)
ROL、ROR
数据循环左移1位
ROL A
ROL 地址
ROL 地址, X
数据循环右移1位
ROR A
ROR 地址
ROR 地址, X
24
C移入最低位,最高位移入C
7
6
5
4
3
2
1
0
C
C移入最高位,最低位移入C
7
6
5
4
3
2
1
0
C
逻辑运算指令(4)
 累加器位测试指令(Bit Test)
BIT
A & 数据
BIT 地址
“与”结果等于0:Z 
1
“与”结果不为0:Z
1
25
控制转移指令
26
控制转移指令(1)
 条件转移指令(Conditional Branch)
指令格式
跳转条件
BCS 8位相对地址
C=1
BCC 8位相对地址
C=0
BEQ 8位相对地址
Z=1
BNE 8位相对地址
Z=0
BMI 8位相对地址
N=1
BPL 8位相对地址
N=0
BVS 8位相对地址
V=1
BVC 8位相对地址
V=0
27
IF C=0 THEN
PC  PC + 8位相对地址
控制转移指令(2)
 无条件跳转指令(Jump)
JMP
PC  地址
JMP 地址
JMP (地址)
 子程序调用/返回(Jump to/Return from
Subroutine)
PC  堆栈
PC  堆栈
JSR、RTS
PC  地址
RTS
JSR 地址
 中断返回(Return from Interrupt)
RTI
28
P  堆栈
PC  堆栈
RTI
位操作指令
(仅能对Page0的地址内的数据位操作)
29
位操作指令(1)
 位“置位”(Bit Set)
SET 8位地址, 0
SET 8位地址, 1
…… ……
SET 8位地址, 7
 位“清除”(Bit Clear)
CLR 8位地址, 0
CLR 8位地址, 1
…… ……
CLR 8位地址, 7
30
位操作指令(2)
 位“取反”(Bit Invert)
INV 8位地址, 0
INV 8位地址, 1
…… ……
INV 8位地址, 7
 位“测试”(Bit Test)
TST 8位地址, 0
TST 8位地址, 1
…… ……
TST 8位地址, 7
31
该位为0:Z  0
该位为1:Z  1
处理器控制指令
32
处理器控制指令(1)
 标志位“置位”指令(Set)
SEC、SED、SEI
C1
进位标志C置1
SEC
D1
SED
I1
SEI
33
十进制运算标志
D置1
中断禁止标志I置
1
处理器控制指令(2)
 标志位“清除”指令(Clear)
CLC、CLD、CLI、CLV
C0
清除进位
标志C
CLC
清除十进
制运算标
志D
D0
CLD
I0
CLI
V0
CLV
 空操作(No Operation)
NOP
34
清除中断
禁止标志I
清除溢出
标志V
常用伪指令
35
常用伪指令(1)
 伪指令的作用:
本身不会被单片机执行,主要用来对汇编过
程进行控制。
 伪指令书写格式:
标号:
.伪指令名称 参数
有些伪指令无需
标号。标号区分
大小写,后面要
有冒号。
36
伪指令不区分大
小写,前面可以
加句点“.”与汇
编指令区分
不同的伪指令有各
自的参数格式,有
些伪指令不具有参
数。
常用伪指令(2)
 常量定义伪指令
指令名称
指令用途
DB
定义单字节整型常量
DW
定义双字节整型常量
DD
定义四字节长整型常量
FLOAT
定义单精度浮点型常量
DOUBLE
定义双精度浮点型常量
格式:
标号: .DB [数量]数值, [数量]数值, ……
37
• 标号可省略。
• 参数为常量值
• [数量]可省略。
• 可连续定义一个或
多个数值,数值之间
用逗号隔开。
• 例:
• Lb1: .DB 17h
• .DB 3, [2]’d’
• Lb2: .DB “abc”
常用伪指令(3)
 变量定义伪指令
指令名称
指令用途
DS
定义单字节整型变量
格式:
标号: .DS 字节数
38
• 标号可省略。
• 参数代表为该变量分
配的RAM空间大小。
•例:
• Lb1: .DS 5
常用伪指令(4)
 标号定义伪指令
指令名称
指令用途
EQU
为标号赋值
VAR
为标号赋值
格式:
标号: .EQU 数值
标号: .VAR 数值
39
• 与常量/变量定义伪指令的区别是
,标号定义伪指令不会使汇编器
为标号分配ROM或RAM空间。
• 参数代表为该标号赋的值。
• .EQU与.VAR的区别是,.VAR赋
值过的标号可以用.VAR重新赋值
;而.EQU不能。
• 例:
Lb1: .VAR 5
常用伪指令(5)
 段定义伪指令
指令名称
指令用途
CODE
定位到“代码段”
(ROM)
DATA
定位到“数据段”
(RAM)
定位到“零页RAM段”
PAGE0
40
• 段定义伪指令下面的数据
及指令将被定位到相应的
段中。
• 不同文件中定位在同名段
下的程序或数据会被连接
在一起。
• 例:
.PAGE0
Lb1: .DS 1
.CODE
Lb2: .DB 5,6
LDA #35h
常用伪指令(6)
 条件汇编类伪指令
指令名称
指令用途
IF
当条件为真时进行汇编
IFZ
当条件为假时进行汇编
IFDEF
标号存在则进行汇编
IFNDEF
标号不存在则进行汇编
ELSE
IF*不成立时进行汇编
ENDIF
结束条件汇编
41
• 条件汇编的结构为:
.IF* 条件
……
.ELSE
……
.ENDIF
• 上述结构中,.ELSE
不是必需的。
常用伪指令(7)
 汇编链接类伪指令
指令名称
指令用途
PUBLIC
将标号声明为公有标号
EXTERN
引用其他文件中定义的
公有标号
将其他文件包含到当前
位置
INCLUDE
格式:
.PUBLIC 标号1, 标号2,……
.EXTERN 标号1, 标号2,……
.INCLUDE 文件名
42
• .PUBLIC和.EXTERN可
一次声明多个标号,用
逗号隔开。
• .VAR定义的标号不能声
明为公有标号。
• .INCLUDE后面的文件
名可以是相对路径,也
可以是绝对路径。
 凌阳单片机网站:
http://www.sunplusMCU.com
 凌阳单片机咨询邮箱:
E_mail: [email protected]
 凌阳单片机咨询电话:
Tel: 010-62981668-2930
凌阳单片机推广中心竭诚为您服务
43