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 AX TAX AX TXA 14 AY TAY AY 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 XX+1 YY+1 XX-1 YY-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 C1 进位标志C置1 SEC D1 SED I1 SEI 33 十进制运算标志 D置1 中断禁止标志I置 1 处理器控制指令(2) 标志位“清除”指令(Clear) CLC、CLD、CLI、CLV C0 清除进位 标志C CLC 清除十进 制运算标 志D D0 CLD I0 CLI V0 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