1.46k likes | 1.59k Views
第 3 章 微控制器的指令系统. 本章主要内容. 3 . 1 指令的表示与字节 3 . 2 指令的寻址方式 3 . 3 指令的功能 3 . 4 典型微控制器的指令系统. 3 . 1 指令的表示与字节. 3 . 1 . 1 指令表示形式 3 . 1 . 2 指令的字节. 3 . 1 指令的表示与字节. 指令 是指示微控制器执行操作的命令, 微控制器全部指令的集合称为 指令系统 。
E N D
本章主要内容 • 3.1 指令的表示与字节 • 3.2 指令的寻址方式 • 3.3 指令的功能 • 3.4 典型微控制器的指令系统
3.1 指令的表示与字节 • 3.1.1 指令表示形式 • 3.1.2 指令的字节
3.1 指令的表示与字节 • 指令是指示微控制器执行操作的命令, 微控制器全部指令的集合称为指令系统。 • 指令系统体现了微控制器的性能, 也是应用微控制器进行程序设计, 完成运算、控制等各种复杂的功能的基础。不同系列的微控制器通常指令系统也不同,指令和寻址方式较多的指令系统编写程序有其方便之处, 但熟练掌握的难度较大。
3.1.1 指令表示形式 • 微控制器指令通常分为操作码和操作数两部分, 其中操作码指示微控制器的操作。 • 指令的二进制形式称为指令的机器码, 可以直接被微控制器识别和执行。 • 指令的十进制、十六进制形式在某些场合用作输入程序的辅助手段。并采用规定的前后缀符号表示不同进制, 通常默认无前后缀符号表示十六进制。
微控制器能够直接识别和执行的都是指令的机器码, 但机器码对于开发人员而言难于记忆, 不便于程序设计、维护与移植。 • 指令的助记符形式又称为汇编语言指令, 用英文单词或缩写字母来表征指令功能, 以便于人们识别、读写、记忆和交流, 常用于程序设计。 • 通常用汇编语言或C 语言编写源程序, 再由人工或机器的汇编程序将源程序编译成指令的机器码。
3.1.2 指令的字节 • 在二进制形式的微控制器指令中, 单字节指令的操作码和操作数加起来只有一个字节; 多字节指令中, 操作码在前, 占一或二个字节; 操作数或操作数地址在后, 也占一或二个字节。 • MCS-51 的指令系统中, 按字节数分有一、二、三字节3 种。 • M68 HC08 系列的指令系统中, 按字节数分有一、二、三、四字节4 种。 • PIC 系列的指令系统中, 都是单字节指令。 • 程序设计中, 应尽可能选用字节少的指令。这样, 指令所占存储单元少, 执行速度通常也比较快。
3.2 指令的寻址方式 3.2.1 隐含寻址 3.2.2 立即寻址 3.2.3 直接寻址 3.2.4 寄存器间接寻址 3.2.5 变址寻址 3.2.6 相对寻址 3.2.7 位寻址
3.2 指令的寻址方式 • 指令给出操作数的方式称为寻址方式。透彻地理解寻址方式, 才能正确应用指令, 解决快捷和广域的矛盾, 方便地访问所有的存储空间, 选择最佳的寻址方式来优化程序。 • 微控制器常用的寻址方式有: 隐含寻址、立即寻址、直接寻址、寄存器间接寻址、变址寻址、相对寻址和位寻址七种方式。 • 各种微控制器的指令系统中, 每条指令都采用一种或多种寻址方式, 构成了不同功能。典型微控制器指令系统MCS-51 、M68 HC08 、PIC 采用寻址方式的情况如表3-1 所示。
3.2.1 隐含寻址 • 在隐含寻址方式(inherent addressing mode , INH) 的指令中, 执行指令的所有信息均在操作码中, 实际上, 此时操作数是某个寄存器的内容, 而寄存器名隐含在操作码中。具有隐含寻址方式的指令全为单字节指令, 汇编后生成的操作码在程序存储区只占用一个字节的空间。例如: • CLR A (MCS51 指令) • CLRA (M68HC08 指令) • 将累加器A 清0 。 • CLRW (PIC 系列指令) • 将W 工作寄存器(即累加器) 的内容清0 。
3.2.2 立即寻址 • 在立即寻址方式(immediate addressing mode , IMM) 的指令中, 可以立即获得要访问的常数值, 称为立即数; 指令的第一个字节为操作码, 后面字节为要操作的立即数, 通常以# 为标志的# data 或# data16 表示。例如: • MOV A , #70H (MCS51 指令) • LDA #$70 (M68HC08 指令) • 完成的都是把十六进制值70 送到累加器A 中。 • PIC 系列的指令则更为精简, 例如: • ADDLW 16H • 实现的功能是, 将立即数16 H 与W 内容相加, 结果送到W 。其指令码的二进制形式为: 11111100010110 ; 其中前6 位是指令码, 后8 位就是操作数。
3.2.3 直接寻址 • 在直接寻址方式(direct addressing mode , DIR) 的指令中, 操作码后的字节直接指出的是参与运算或传送的操作数所在单元或位的地址。例如: • MOV A , 70H ; 把片内RAM 中70H 单元的内容送到累加器A 中(MCS51指令) • LDA $70 ; 把$0070 单元的内容送到累加器A 中(M68HC08 指令) • IORWF 26H , 0 ; 将地址为26H 的RAM 单元的内容与W 的内容相“或” 后, 结果送入W 中(PIC 指令)
M68HC08 指令系统中, 还把操作数所在的单元地址为2 字节的直接寻址方式单独称为扩展寻址方式(extended addressing mode , EXT) , 扩展寻址方式的指令可以访问64KB 内的任何存储器空间。在寻址第0 页存储空间的存储单元时, 是采用直接寻址还是扩展寻址方式由编译软件自动优化, 通常是按照执行速度更快、所占用程序空间更小的直接寻址方式寻址; 也可以用> 符号将8 位的操作数扩展成为16 位操作数, 强迫为扩展寻址。例如, 将累加器A 的内容与存储单元$0040中的内容逻辑与, 结果存累加器A , 有三种方式: AND $40 ; 机器指令码为$B440 , 直接寻址方式 AND $0040 ; 机器指令码优化为$B440 , 直接寻址方式 AND >$40 ; 强迫为扩展寻址, 机器指令码为$C40040
3.2.4 寄存器间接寻址 • 寄存器间接寻址是一种二次寻找地址的方式, 指令中指出的寄存器, 其内容是存放操作数的地址; “地址指针” 是个重要的概念, 拓宽了微控制器的寻址范围。 • 计算机首先根据指令码给出的寄存器, 查出寄存器内容即操作数地址, 再由地址找到所需要的操作数, 并完成相应操作。 • MCS-51指令系统的寄存器间接寻址指令中, 采用R0 、R1 或DPTR 作为地址指针即存放地址的寄存器, 加@ 来表示。
例如: • M0V A , @ R0 • ; 寄存器内容(R0) 为操作数所在地址, 再找到所需要的操作数送到累加器A 中(MCS51 指令) • 将存放在3AH 存储单元的操作数65H 送入累加器A 的执行过程, 如图3-1所示。 • 应用了“地址指针” , 寄存器间接寻址指令简化了对大范围存储单元的操作。 • 其中@ Ri 用于片内RAM 寻址(地址范围为00 H~FFH)。
例如: • MOV @ R0 , A • @ Ri 也可以对片外RAM 寻址, 此时片外RAM 地址的低8 位由Ri 中内容决定, 高8 位由P2 口决定, 例如: • MOVX A , @ R0 • DPTR 是专用于外部RAM/ROM 数据传送的16位地址指针, 其寻址范围可以覆盖全部64K 区域, 例如: • MOVX A , @ DPTR
M68HC08 系列的指令系统中, 以变址寄存器H : X 为基地址寄存器的0 偏移量变址寻址(IX) 方式, 实际上就是间接寻址方式。16 位的变址寄存器, 允许用户访问64KB 的内存空间。H 寄存器中的值默认为$00 ,可以通过指令修改H 寄存器中的内容。0 偏移量变址寻址指令可以移动链表指针或锁定一个经常使用的RAM 地址或输入输出地址, 它们均为单字节指令。例如: • CLR , X • ; 把以H : X 内容为地址的单元清0
PIC 系列的指令系统, 在采用寄存器间接寻址方式的指令码中, 7 位寄存器地址必为全0 , 这个7 位0 的专用地址, 特指作为间接寻址寄存器时的FSR 寄存器, 其内容就是存放着参加运算或操作的数据的RAM 单元的地址。在使用间接寻址指令前, 要先用地址04 H 访问FSR , 存入该RAM 单元的地址。例如: • XORWF 0 , 1 • 参加“异或” 运算的一个数据可以根据指令码间接寻址得到。若事先在FSR 中存入26 H , 26 H 号RAM 单元中存入16 H , W 中存入99 H , 则执行该指令实现的功能是: 将26H 号RAM 单元的内容(16 H) 与W内容(99H) 相“异或” , 运算结果(8FH) 送回26H 号RAM 单元(因为d =1)。
3.2.5 变址寻址 • 变址寻址就是基地址寄存器的内容加上指令中给定的偏移量形成操作数的地址, 特别适用于对一块存储区的操作。 • MCS-51在执行变址寻址指令时, 用作基地址寄存器的DPTR 或PC 中应预先存放基地址; 累加器A 中存放操作数地址对基地址的偏移量(该地址偏移量是00H ~ FFH 范围内的一个无符号数) 。微控制器把基地址和地址偏移量相加,形成操作数地址, 可以形成覆盖全部64K 程序存储区域。
MCS-51有如下两条单字节、双周期的变址寻址指令: • MOVC A ,@ A + PC ; A ← ((A) +(PC)) • MOVC A ,@A+DPTR ; A ← ((A) +(DPTR)) • 例如,为了将程序存储区的0302 H 单元中的常数X 取到累加器A 。取基地址为0300 H , 地址偏移量为02H 。相应程序为: • MOV DPTR ,#0300H ; DPTR ← 0300H • MOV A ,#02H ; A ← 02H • MOVC A ,@A+DPTR ; A ← X • 指令执行过程如图3-3 所示。
M68HC08 系列的指令系统中, 以变址寄存器H : X 或堆栈指针作为基地址寄存器, 偏移量又可分为0 偏移量、8 位偏移量和16 位偏移量等三种。 • 堆栈(stack)是后进先出(LIFO) 的线性存储结构, 就像实际生活中的货物堆栈那样: 以a1 , a2 , …, an 的顺序存入栈顶(入栈) , 以相反的顺序an , …,a2 , a1 从栈顶取出(出栈) , 每个堆栈都有一个栈指针SP 指示栈顶位置。 • 微控制器广泛利用了堆栈进行变址寻址方式的数据保存和取出。操作在栈顶进行, 栈顶的地址由栈底(作为基址寄存器) 的内容加上栈指针SP 的内容(地址偏移量) 形成。
堆栈可分为地址增加型(每存放一个数据, 存储地址加1) 和地址减少型(每存放一个数据, 存储地址减1) 两种。如图3-4 所示。 • 80C51 内核的堆栈属于地址增加型, 其特点是栈指针SP 先加1 , 数据后入栈; 数据先出栈, 栈指针SP 后减1 。 • M68HC08 系列的堆栈属于地址减少型, 其特点是数据先入栈, 栈指针SP后减1 ; 栈指针SP 先加1 , 数据后出栈。
1. 使用变址寄存器的变址寻址方式 • 1) 0 偏移量变址寻址(IX) • 0 偏移量变址寻址方式实际上就是间接寻址方式。例如: • CLR , X ; 把以(H: X)为地址的单元的内容清0 • 2) 8 位偏移量变址寻址(IX1) • 在8 位偏移量变址寻址方式中, 有效地址是无符号的16 位H : X 的内容和操作码后的一个字节无符号整数之和。它可用于从一个有N 个元素的表中选择第K 个元素。这时, K 的值放在H : X 中, 而指令中8 位偏移量实质上是表格的首地址。例如: • CLR $10 , X ; 把以(H : X) 加上$10 为地址的单元的内容清0
3) 16 位偏移量变址寻址(IX2) • 16 位偏移量变址寻址指令为三字节指令, 有效地址为无符号的16 位H : X的内容和操作码后的两个字节16 位无符号整数之和。例如: • STA $0100 , X • 把累加器A 的内容送到以(H : X) 加上$100 为地址的单元
2. 使用堆栈指针的变址寻址方式 • 这是用堆栈指针代替变址寄存器, 分为用堆栈指针的8 位偏移量变址寻址和用堆栈指针的16 位偏移量变址寻址。由于与堆栈指针相关的指令要求预先访问一个字节, 因此所有与堆栈指针相关的指令要比同样的变址指令多用一个时钟周期。 • 1) 用堆栈指针的8 位偏移量变址寻址 • 2) 用堆栈指针的16 位偏移量变址寻址
1) 用堆栈指针的8 位偏移量变址寻址 • 用堆栈指针的8 位偏移量变址寻址指令为三字节指令, 功能与8 位偏移量变址寻址指令相似。用堆栈指针的8 位偏移量变址寻址可以方便地访问堆栈中的数据, 有效地址是无符号16 位堆栈寄存器的内容和操作码后无符号整数之和。当中断被屏蔽时, 这种寻址方式允许堆栈指针寄存器作为第二个变址寄存器使用 • 例如: • LDA $5 ,SP ; 把以SP 加上$5 为地址的单元内容取到累加器A 中
2) 用堆栈指针的16 位偏移量变址寻址 • 用堆栈指针的16 位偏移量变址寻址指令是四字节指令, 有效地址是16 位堆栈指针寄存器中的无符号内容与操作码后两个字节16 位无符号整数之和。例如: • LDA $100 ,SP ; 把以SP 加上$100 为地址的单元内容取到累加器A 中
3. 变址后加1 寻址方式 • 在M68 HC08 指令系统中, 还有2 条转移指令采用了变址后加1 寻址方式。 • 1) 无偏移量变址后加1 寻址方式(IX + ) • CBEQ X + , rel • 这条转移指令采用无偏移量变址后加1 寻址方式(indexed , no offset , post increment addressing mode , IX + ) 。若以16 位变址寄存器H : X 中的值为地址的存储单元中的值和累加器A 中的值相等则转移, 否则顺序执行下一条指令;然后H : X 中的值再自动加1 。这条指令的执行需要4 个周期, 为二字节指令,一个字节为操作码, 一个字节为相对转移量, 并由汇编程序自动计算并判断是否超出了合法的转移范围。由于指令码中的相对转移量只为一个字节, 所以这条指令转移范围为相对于存放机器指令码地址的- 126 ~ + 129B 。
例如: • CBEQ X + , Prol • 若H : X 中的值所指向的存储单元的内容与A 中的值相等, 则转移到标号Prol 处执行, 否则顺序执行下一条语句; 最后再将H : X 中的值自动加1 , 机器指令码为$71r r,r r 为相对偏移量, 具体数值由汇编程序计算。
2) 8 位偏移量变址后加1 寻址方式(IX1 + ) • CBEQ opr , X + , rel • 这条转移指令采用8 位偏移量变址后加1 寻址方式(indexed , 8bit offset ,post increment addressing mode , IX1 + ) 。首先将8 位偏移量opr 与16 位变址寄存器H : X 中的数值相加, 如果以所得的和为地址的存储单元中的值与累加器A中的值相等则转移, 否则顺序执行下一条指令; 然后H : X 中的值再自动加1 。这条指令执行需要5 个周期, 为三字节指令, 一字节为操作码, 一字节为8 位偏移量, 一字节为相对转移量, 并由汇编程序自动计算并判断是否超出了合法的转移范围。由于指令码中的相对转移量只为一个字节, 所以这条指令转移范围为相对于存放机器指令码地址的- 125 ~ + 130B 。
例如: • CBEQ $10 , X + , Prol • 若H : X 中的值和8 位偏移量$10 相加所得的和所指向的存储单元的内容与A 中的值相等, 则转移到标号Prol 处执行, 否则顺序执行下一条语句; 最后再将H : X 中的值自动加1 , 指令操作码为$6110rr,rr 为相对偏移量。
3.2.6 相对寻址 • 相对寻址方式(relative addressing mode , REL) 主要用于相对转移指令。在这种寻址方式中, CPU 首先测试给定的条件, 如果不满足条件, CPU 顺序执行下一条指令; 如果满足条件, 则发生相对转移, 即以取出相对转移指令后的PC 内容为基地址, 加上指令中给定的地址转移量, 可以用一个地址标号代替转移量, 由汇编程序自动计算并确定是否超出了有效转移范围, 得到下一条要执行指令的地址。地址转移量是一个8 位带符号数, 其取值范围为- 128 ~ + 127 。 • 例如: • JC add1 ; (MCS51 指令) • BCS add1 ; (M68HC08 指令) • 完成的都是若C = 1 则转移到add1 。
3.2.7 位寻址 • MCS-51 的操作数可以是二进制数的某一位, 此时操作数的地址就称为位地址, 处于位寻址空间中。 • 为了使程序设计方便可读, MCS-51提供了四种位地址的表示方法: • (1) 直接使用位寻址空间中的位地址。例如: • MOV C , 7FH ; CY ← (7FH) • (2) 采用第几字节单元第几位的表示法。例如, 上述位地址7FH 可以表示为2FH.7 , 相应指令为: • MOV C ,2FH.7 ; CY ← 2FH.7
(3) 可以位寻址的特殊功能寄存器允许采用寄存器名加位数的命名法。例如, 累加器A 中最高位可以表示为ACC.7 , 把ACC.7 位状态送到进位标志位CY 的指令是: • MOV C ,ACC.7 ; CY ← ACC.7 • (4) 经伪指令定义过的字符名称, 详见第4 章。
M68HC08 可以对微控制器第0 页地址空间($0000 ~ $00FF) 中的任一可读、写的RAM 存储单元和I/O 控制、状态寄存器的某一可读、写位执行清0 或置1 操作, 指令采取的是第几字节单元第几位的表示法。例如: • BCLR 0 , PORTA • ;把地址为PORTA 的寄存器单元内的bit0 清0 • BSET 7 , PTCPUE • ;把地址为PTCPUE 的寄存器单元内的bit7 置1
PIC 系列指令系统中, 位寻址指令采取的也是第几字节单元第几位的表示法, 可以对任一寄存器中的任一位直接寻址访问。例如: • BSF 26H , 4 • 实现的功能是, 把地址为26 H 的寄存器单元内的bit4 置为1 。
3.3 指令的功能 • 3.3.1 数据传送指令 • 3.3.2 算术运算指令 • 3.3.3 逻辑运算指令 • 3.3.4 移位指令 • 3.3.5 位操作指令 • 3.3.6 控制转移指令 • 3.3.7 其他指令
3.3.1 数据传送指令 • 绝大多数指令都要用到操作数, 因而数据传送的灵活快速对程序的编写和执行影响很大。数据传送指令中必须指定传送数据的源地址和目的地址, 执行传送指令时不破坏源地址中的操作数, 只是把源地址中操作数传送到目的地址。源操作数有8 位和16 位之分, 前者称为8 位数传送指令, 后者称为16 位数传送指令。 • 交换指令把两个地址单元中内容相互交换, 也属于数据传送指令, 也就是说, 指令中的操作数或操作数地址互为“源” 和“目的” 。
3.3.2 算术运算指令 • 算术运算包括加法、减法、十进制调整和乘除法四类, 加1 和减1 也属算术运算。大多数这类指令中, 累加器兼作源操作数寄存器和目的操作数寄存器, 另一个源操作数可以存放在任何一个工作寄存器Rn 或片内RAM 单元中, 也可以是立即数。MCS-51 、M68 HC08 指令执行后, 运算结果保留在累加器A 中; 而PIC 指令执行后, 可根据指令中d = 0 或d = 1 , 将运算结果存入工作寄存器W • (即累加器) 或寄存器F 。
3. 3. 3 逻辑运算指令 • 用于进行与、或、非和异或等逻辑运算, 以及清0 、取反和求补。 • 3. 3. 4 移位指令 • 包括带和不带C 标志位的算术左右移/左右环移指令、逻辑左右移/左右环移指令和循环左右移/左右环移指令。
3. 3. 5 位操作指令 • 位操作指令分为位传送、位置1 和位清0 、位运算、位控制转移指令等四类。位操作指令也称为布尔变量操作指令, 其操作对象不是字节而是片内RAM位寻址区中的各位; 位传送、位置值和位运算指令的操作以字节中某位为对象;位控制转移指令以检测字节中的某一位的状态为条件。
3. 3. 6 控制转移指令 • 控制转移指令通过改变程序计数器PC 中内容, 改变程序执行的流向, 可分为条件转移、无条件转移、调用和返回等。 • 3. 3. 7 其他指令 • 包括空操作指令、软中断指令SWI 、进入停止模式指令STOP 、进入等待模式指令WAIT 等特殊指令。