第 3 章 微控制器的指令系统

146
第3第 第第第第第第第第

description

第 3 章 微控制器的指令系统. 本章主要内容.  3 . 1  指令的表示与字节  3 . 2  指令的寻址方式  3 . 3  指令的功能  3 . 4  典型微控制器的指令系统. 3 . 1 指令的表示与字节.    3 . 1 . 1 指令表示形式    3 . 1 . 2 指令的字节. 3 . 1 指令的表示与字节. 指令 是指示微控制器执行操作的命令, 微控制器全部指令的集合称为 指令系统 。 - PowerPoint PPT Presentation

Transcript of 第 3 章 微控制器的指令系统

第 3 章

微控制器的指令系统

本章主要内容

•  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 种。

• M 68 HC 08 系列的指令系统中, 按字节数分有一、二、三、四字节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 、 M 68 HC 08 、 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 或# data 16 表示。例如:

•    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 指令 )

• M 68 HC 08 指令系统中, 还把操作数所在的单元地址为2 字节的直接寻址方式单独称为扩展寻址方式 (extended addressing mode , EXT) , 扩展寻址方式的指令可以访问64 KB 内的任何存储器空间。在寻址第0 页存储空间的存储单元时, 是采用直接寻址还是扩展寻址方式由编译软件自动优化, 通常是按照执行速度更快、所占用程序空间更小的直接寻址方式寻址; 也可以用> 符号将8 位的操作数扩展成为16 位操作数, 强迫为扩展寻址。例如, 将累加器 A 的内容与存储单元 $0040 中的内容逻辑与, 结果存累加器 A , 有三种方式:

•    AND   $40  ; 机器指令码为 $B440 , 直接寻址方式•    AND   $0040 ; 机器指令码优化为 $B440 , 直接寻址

方式

•      AND AND >> $40 $40 ; 强迫为扩展寻址; 强迫为扩展寻址 , , 机器指令码机器指令码为为 $C40040$C40040

3.2.4  寄存器间接寻址

• 寄存器间接寻址是一种二次寻找地址的方式, 指令中指出的寄存器, 其内容是存放操作数的地址; “地址指针” 是个重要的概念, 拓宽了微控制器的寻址范围。

• 计算机首先根据指令码给出的寄存器, 查出寄存器内容即操作数地址, 再由地址找到所需要的操作数, 并完成相应操作。

• MCS-51 指令系统的寄存器间接寻址指令中, 采用 R 0 、 R 1 或 DPTR 作为地址指针即存放地址的寄存器, 加@ 来表示。

•  例如:• M0V   A , @ R0  • ; 寄存器内容 (R0) 为操作数所在地址, 再找到所需要的

操作数送到累加器 A 中 (MCS51 指令 )

• 将存放在3 AH 存储单元的操作数65 H 送入累加器 A 的执行过程, 如图3 - 1所示。

• 应用了“地址指针” , 寄存器间接寻址指令简化了对大范围存储单元的操作。

• 其中@ Ri 用于片内 RAM 寻址 ( 地址范围为 00 H~FFH) 。

• 图3 -1 MOV A , @ R 0 指令执行过程

• 例如:•    MOV @ R0 , A

• @ Ri 也可以对片外 RAM 寻址, 此时片外 RAM 地址的低8 位由 Ri 中内容决定, 高8 位由 P 2 口决定, 例如:

•    MOVX A , @ R0

• DPTR 是专用于外部 RAM/ ROM 数据传送的 16 位地址指针, 其寻址范围可以覆盖全部64 K 区域, 例如:

•    MOVX A , @ DPTR

• M 68 HC 08 系列的指令系统中, 以变址寄存器 H : X 为基地址寄存器的0 偏移量变址寻址 (IX) 方式, 实际上就是间接寻址方式。16 位的变址寄存器, 允许用户访问64 KB 的内存空间。 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 , 则执行该指令实现的功能是: 将26 H 号 RAM 单元的内容 ( 16 H) 与 W 内容 (99 H) 相“异或” , 运算结果 ( 8 FH) 送回26 H 号 RAM 单元 (因为 d =1 ) 。

• 图3 - 2   PIC 间接寻址示意图

3.2.5  变址寻址

• 变址寻址就是基地址寄存器的内容加上指令中给定的偏移量形成操作数的地址, 特别适用于对一块存储区的操作。

• MCS-51 在执行变址寻址指令时, 用作基地址寄存器的 DPTR 或 PC 中应预先存放基地址; 累加器A 中存放操作数地址对基地址的偏移量 (该地址偏移量是00 H ~ FFH 范围内的一个无符号数 ) 。微控制器把基地址和地址偏移量相加,形成操作数地址, 可以形成覆盖全部64 K 程序存储区域。

• MCS-51 有如下两条单字节、双周期的变址寻址指令:

•   MOVC A ,@ A + PC  ; A ← ((A) + (PC))

•   MOVC A ,@ A+ DPTR ; A ← ((A) + (DPTR))

• 例如,为了将程序存储区的0302 H 单元中的常数X 取到累加器 A 。取基地址为0300 H , 地址偏移量为02 H 。相应程序为:

•    MOV   DPTR ,# 0300H  ; DPTR ← 0300H

•    MOV A ,# 02H ; A ← 02H

•    MOVC A ,@ A+ DPTR ; A ← X

• 指令执行过程如图3 - 3 所示。

• M 68 HC 08 系列的指令系统中, 以变址寄存器H : X 或堆栈指针作为基地址寄存器, 偏移量又可分为0 偏移量、8 位偏移量和16 位偏移量等三种。

• 堆栈 (stack) 是后进先出 (LIFO) 的线性存储结构, 就像实际生活中的货物堆栈那样: 以 a 1 , a 2 , … , an 的顺序存入栈顶 ( 入栈 ) , 以相反的顺序 an , … ,a 2 , a 1 从栈顶取出 ( 出栈 ) , 每个堆栈都有一个栈指针 SP 指示栈顶位置。

• 微控制器广泛利用了堆栈进行变址寻址方式的数据保存和取出。操作在栈顶进行, 栈顶的地址由栈底 ( 作为基址寄存器 ) 的内容加上栈指针 SP 的内容 ( 地址偏移量 ) 形成。

• 堆栈可分为地址增加型 ( 每存放一个数据, 存储地址加1 ) 和地址减少型 ( 每存放一个数据, 存储地址减1 ) 两种。如图3 - 4 所示。

• 80 C 51 内核的堆栈属于地址增加型, 其特点是栈指针 SP 先加1 , 数据后入栈; 数据先出栈, 栈指针 SP 后减1 。

• M 68 HC 08 系列的堆栈属于地址减少型, 其特点是数据先入栈, 栈指针 SP 后减1 ; 栈指针 SP 先加1 , 数据后出栈。

1 . 使用变址寄存器的变址寻址方式

• 1 ) 0 偏移量变址寻址 (IX)

• 0 偏移量变址寻址方式实际上就是间接寻址方式。例如:

•    CLR , X  ; 把以 (H: X) 为地址的单元的内容清 0

• 2 ) 8 位偏移量变址寻址 (IX 1 )

• 在8 位偏移量变址寻址方式中, 有效地址是无符号的16 位 H : X 的内容和操作码后的一个字节无符号整数之和。它可用于从一个有 N 个元素的表中选择第K 个元素。这时, K 的值放在 H : X 中, 而指令中8 位偏移量实质上是表格的首地址。例如:

•    CLR $10 , X  ; 把以 (H : X) 加上 $10 为地址的单元的内容清 0

• 3 ) 1 6 位偏移量变址寻址 (IX 2 )

• 1 6 位偏移量变址寻址指令为三字节指令, 有效地址为无符号的 1 6 位 H : X 的内容和操作码后的两个字节 1 6 位无符号整数之和。例如:

•    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 寻址方式

• 在 M 68 HC 08 指令系统中, 还有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 ~ + 129 B 。

• 例如:•    CBEQ X + , Prol

• 若 H : X 中的值所指向的存储单元的内容与 A 中的值相等, 则转移到标号 Prol 处执行, 否则顺序执行下一条语句; 最后再将 H : X 中的值自动加1 , 机器指令码为 $71r r , r r 为相对偏移量, 具体数值由汇编程序计算。

• 2 ) 8 位偏移量变址后加1 寻址方式 (IX 1 + )

•    CBEQ opr , X + , rel

• 这条转移指令采用8 位偏移量变址后加1 寻址方式 (indexed , 8 bit offset , post increment addressing mode , IX 1 + ) 。首先将8 位偏移量 opr 与16 位变址寄存器 H : X 中的数值相加, 如果以所得的和为地址的存储单元中的值与累加器 A 中的值相等则转移, 否则顺序执行下一条指令; 然后 H : X 中的值再自动加1 。这条指令执行需要5 个周期, 为三字节指令, 一字节为操作码, 一字节为8 位偏移量, 一字节为相对转移量, 并由汇编程序自动计算并判断是否超出了合法的转移范围。由于指令码中的相对转移量只为一个字节, 所以这条指令转移范围为相对于存放机器指令码地址的- 125 ~ + 130 B 。

• 例如:•    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 则转移到 add 1 。

3.2.7 位寻址

• MCS- 51 的操作数可以是二进制数的某一位, 此时操作数的地址就称为位地址, 处于位寻址空间中。

• 为了使程序设计方便可读, MCS-51提供了四种位地址的表示方法:

• ( 1 ) 直接使用位寻址空间中的位地址。例如:•    MOV C , 7FH    ; CY ← (7FH)

• ( 2 ) 采用第几字节单元第几位的表示法。例如, 上述位地址7 FH 可以表示为2 FH. 7 , 相应指令为:

•    MOV C , 2FH.7   ; CY ← 2FH.7

• ( 3 ) 可以位寻址的特殊功能寄存器允许采用寄存器名加位数的命名法。例如, 累加器 A 中最高位可以表示为 ACC. 7 , 把 ACC. 7 位状态送到进位标志位 CY 的指令是:

•    MOV C , ACC.7   ; CY ← ACC.7

• ( 4 ) 经伪指令定义过的字符名称, 详见第4 章。

• M 68 HC 08 可以对微控制器第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 的寄存器单元内的 bit 4 置为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 - 5 ( a) MCS-51 的数据传送操作

• 图3 - 5 ( b) M68HC08 的数据传送操作

• 图3 - 5 ( c) PIC 的数据传送操作

3.3.2  算术运算指令

• 算术运算包括加法、减法、十进制调整和乘除法四类, 加1 和减1 也属算术运算。大多数这类指令中, 累加器兼作源操作数寄存器和目的操作数寄存器, 另一个源操作数可以存放在任何一个工作寄存器 Rn 或片内 RAM 单元中, 也可以是立即数。 MCS- 51 、M 68 HC 08 指令执行后, 运算结果保留在累加器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 等特殊指令。

3 . 4 典型微控制器的指令系统

•    3 . 4 . 1   MCS-51 指令系统•    3 . 4 . 2   M68HC08 指令系统•    3 . 4 . 3   PIC 指令系统

3. 4. 1 MCS-51 指令系统

• MCS-51 及其派生系列微控制器的指令系统共有 111 条指令, 可以实现 51 种基本操作。按照指令的机器周期数来分类有: 64 条单周期指令、 45 条双周期指令和2 条四周期指令等。

程序状态字( program status word , PSW)

• (1) 进位标志位 CY ( carry)• 加法运算时, 若累加器最高位 A 7 有进位, 则 C

Y = 1 , 否则 CY = 0 ; 减法运算时, 若 A 7 有借位, 则 CY = 1 , 否则 CY = 0 ; CPU 进行移位操作也会影响 CY 。

• (2) 辅助进位位 AC ( auxiliary carry)• 加减运算时, 低4 位若向高4 位有进位或借位,

则 AC = 1 ; 若 AC = 0 , 则表示加减过程中 A 3 没有向 A 4 进位或借位。

• (3) 标志位 F 0 、 F 1 ( Flag 0 、1)• 标志位的状态通常由用户根据需要通过传送指令

确定。用户程序可以检测该标志位状态, 决定程序流向。

• (4) 寄存器选择位 RS 1 和 RS 0• 内部 RAM 的00 H ~ 1 FH 设置的4 组寄存

器 R 0 ~ R 7 是 MCS 51 程序设计中使用最方便的8 个组的八位工作寄存器。通过 RS 1 和 RS 0 来选定工作寄存器 R 0 ~ R 7 的实际物理地址, 有利于提高现场数据保护和恢复的速度。 R 0 ~ R 7 的物理地址和RS 1 、 RS 0 之间的关系, 如表3 - 2 所示。

• (5) 溢出标志位 OV ( overflow)• 在指令执行过程中自动形成, 指示运算过程中是否发生了溢出。若累加器 A 中运算结果超出了八位二进制数可以表示的范围, 即- 128 ~ + 127 , 则 OV 标志自动置“1” ; 否则 OV = 0 。据此可以判断累加器 A 中的结果是否正确。

• (6) 奇偶标志位 P ( parity)• 若 P = 1 , 则累加器 A 中1 的个数为奇数; 若 P = 0 , 则累加器 A 中的1 的个数为偶数。

3. 4. 2   M68HC08 指令系统• 140条基本指令, 270条具体指令

• 可分为七大类• 数据传送类• 算术类• 逻辑运算类• 位操作类• 移位类• 程序控制类• 其他• 每一条指令又各自具有多种不同的寻址方式。

条件码寄存器 CCR :

• MC 68 微控制器的条件码寄存器 CCR (condition code register) 类似于标志寄存器, 但除了表征指令执行后结果状态的5 个标志位外, 还有一个由用户写入的控制位——— 中断屏蔽位。8 位寄存器的第5 、6 位未使用而始终置为1 。

• ( 1 ) 溢出标志 V

• 执行指令的结果发生了二进制补码溢出时, V = 1 ; 影响该标志位的指令有:

• 加减法指令 ADC 、 ADD 、 SBC , 左右移指令 ASL 、 ASR 、 LSL 、 LSR 、 ROL 和 ROR 。

• 执行有符号跳转指令 BGT 、 BGE 、 BLE 和 BLT 时将检测这个溢出标志, 从而决定程序下一步的去向。

• ( 2 ) 半进位标志 H

• 累加器的 bit 3 向 bit 4 有进位时, H = 1 ; 影响该标志位的指令有: 执行带进位加法指令 ADC 和不带进位加法指令 ADD 。

• 该标志主要用于二进制编码的十进制 (BCD 码 ) 算术运算, 累加器十进制调整指令 DAA 就是使用该位与进位标志 C 来确定相应的修正系数。

• ( 3 ) 中断屏蔽 I

• CCR 中唯一的一个控制位, 复位时 I = 1 , 使用指令 SEI 可以置1 , 所有可屏蔽中断都被禁止; 指令CLI 使之置0 , 允许 CPU 的全部中断。

• 中断响应时, CPU 将除 H 以外的寄存器推入堆栈, 以保护断点和现场, 然后执行中断服务子程序; 直到中断服务结束时的 RTI 指令, 从栈中恢复包括 CCR 在内的各寄存器, 以恢复断点和恢复现场。且自动恢复中断屏蔽 I = 0 以允许中断。如果在中断服务子程序中用到 H 寄存器, 则必须使用 PUSH 指令保存 H 的内容和使用 PULH 指令恢复 H 的内容。

• ( 4 ) 负数标志 N

• 对于带符号的数据操作, 最高位 (bit 7 ) 为1 表示负数, N = 1 ; bit 7 为0 表示正数, N = 0 。

• ( 5 ) 零标志 Z

• 数据或运算结果为0 , Z = 1 ; 反之 Z = 0 。• ( 6 ) 进位/借位标志 C

• 最高位有进位或借位时 C = 1 。部分逻辑操作与数据操作也会使这一位置1或清0 。

1 . 数据传送类指令

• 数据传送类指令主要用于 CPU 寄存器 ( A 、 H : X 、 SP 、 CCR) 、立即数、内部 RAM 之间的数据传送。

• 1 ) 立即数到 CPU 寄存器•    CLRA  ; 0 → A

•    CLRX ; 0 → X

•    CLRH ; 0 → H

•    LDA  # opr ; A ← opr (8 位立即数 )

•    LDHX # opr16 ; H: X ← opr(16 位立即数 )

•    LDX  # opr ; X ← opr (8 位立即数 )

•    RSP ; $00FF → SP

• 例如:•    LDA # $FF ; 8 位立即数 $FF 送累加器

A

•    LDHX # $01FF

• ; 16 位立即数送 H: X ($FF → X , $01 → H)

•    LDX # $00 ; 将 X 的内容清 0

2 ) 8 位立即数到内部 RAM

•    CLR opr  ; 0 → opr  存储单元地址为 opr

•    CLR opr , X ; 0 → opr + ( H : X)

• 存储单元地址为 opr + (H : X)

•    CLR , X ; 0 → (H : X)

• 存储单元地址为 (H : X)

•    CLR opr , SP ; 0 → opr + (SP)

• 存储单元地址为 opr + (SP)

•    MOV # opr1 , opr2 ; opr 1 → opr2

• 存储单元地址为 opr2

• 例如:•    CLR $40      • ; 将地址为 $40 的存储单元中的内容清 0

•    CLR $10 , X

• ; 把以 8 位偏移量 $10 与 H : X 中的值之和为地址的存储单元中的内容清 0

•    MOV # $40 , $30

• ; 将 8 位立即数 $40 送至 $30 地址单元

3 ) 内部 RAM 内容到 CPU 寄存器

•    LDA opr      ; A ← (opr)

•    LDA opr , X ; A ← (opr + (H : X))

•    LDA , X ; A ← ((H : X))

•    LDA opr , SP ; A ← (opr + (SP))

•    LDHX opr ; H ←(opr) , X ← (opr + 1)

•    LDX opr ; X ← (opr)

•    LDX opr , X ; X ← (opr + (H : X))

•    LDX , X ; X ← ((H : X))

•    LDX opr , SP ; X ← (opr + (SP))

• 例如:•    LDA $30     • ; 将地址为 $30 的存储单元内容送累加器 A

•    LDA $0130

• ; 将地址为 $0130 的存储单元内容送累加器 A

•    LDX $30 , X

• ; 将从 8 位偏移量 $30 + H : X 之和为地址的存储单元内容送 X

•    LDX $0130 , SP

• ; 16 位偏移量 $0130 + SP 之和为地址的存储单元内容送 X

•    LDHX $40

• ; 将 $40 存储单元内容送 H , $41 存储单元内容送 X

4 ) CPU 寄存器内容到内部 RAM

•    STA opr     ; (A) → opr

•    STA opr , X ; (A) → opr + (H : X)

•    STA , X ; (A) → (H : X)

•    STA opr , SP ; (A) → opr + (SP)

•    STHX opr ; (H) → opr , (X) → opr + 1

•    STX opr ; (X) → opr

•    STX opr , X ; (X) → opr + (H : X)

•    STX , X ; (X) → (H : X)

•    STX opr , SP ; (X) → opr + (SP)

• 例如:•    STA , X     ; 将累加器 A 中的值送到以 H :

X 中的值为地址的存储单元•    STA $0130 , SP ; 将累加器 A 中的值送到以 16

位偏移量 $0130 与 SP 中的值之和为地址的存储单元•    STX $0130 ; 将 X 中的值送至 $0130 为地址的存

储单元•    STX $30 , X ; 将 X 中的值送至以 8 位偏移量 $

30 + (X) 之和为地址的存储单元•    STHX $40 ; 将 H 中的值送至 $40 为地址的存储

单元, 将 X 中的值送至 $41 为地址的存储单元

5 ) 内部 RAM 内容到内部 RAM

•    MOV opr1 , opr2    ; (opr1) → opr2

•    MOV opr , X + • ; (opr)→(H : X) , (H : X)+ 1→H : X

•    MOV X + , opr

• ; ((H : X))→opr , (H : X)+ 1→H : X

• 由于 MOV 指令中 opr 操作数为8 位地址, H : X 为16 位, 因此

•    MOV opr1 , opr2 ;只能实现零存储页内的直接传送•    MOV opr , X+;只能实现零存储页到任一地址的直接传送•    MOV X+, opr ;只能实现任一地址到零存储页内的直接传送

• 例如:•    MOV $00 , $50   • ; 将 $00 地址单元的内容送到 $50 地址单元•    MOV $05 , X + • ; 将 $05 地址单元的内容送到以 H : X 中的值为地址

的存储单元, H : X 中的值再自动加 1

•    MOV X+ , $40

• ; 将以 H : X 中的值为地址的存储单元内容送到 $40地址单元, H : X 中的值再自动加 1

6 ) CPU 寄存器之间的内容传送

•    TAP      ; (A) → CCR

•    TPA ; (CCR) → A

•    TAX ; (A) → X

•    TXA ; (X) → A

•    TSX ; (SP) + 1 → H : X

•    TXS ; (H : X) - 1 → SP

• TSX 指令将堆栈指针 SP 中的数值加1 后的和送到变址寄存器 H X ∶ , SP 保持原初始值不变; TXS 指令将变址寄存器 H X ∶ 中的数值减1 后的差送到堆栈指针 SP , H X ∶ 保持原初始值不变。

• 例如:•    RSP

• ; 置 SP 为 $00FF

•    TSX

• ; H : X = $00FF + 1 = $0100 , SP = $00FF

•    LDHX # $01FF

• ; H : X = $01FF

•    TXS

• ; SP = $01FF - l = $01FE , H : X = $01FF

7 ) 堆栈指令

• 堆栈指令包括入栈指令和出栈指令; M 68 HC 08 没有存储单元的入栈、出栈操作指令, 只能将寄存器 A 、H 、 X 中的值压入堆栈或者将堆栈中的值弹出至 · 60 · 微控制器原理与应用 A 、 H 、 X 寄存器中, 入栈操作按照先压入、后 SP 减1 的规则, 出栈操作按照先 SP 加1 、后弹出的规则。堆栈指令不影响 CCR 标志位。

• 例如:例如:•      PSHA PSHA ; ; PUSH(A),(SP)PUSH(A),(SP) -- 1 → SP1 → SP

•      PSHH PSHH ; ; PUSH(H) PUSH(H) , , (SP) (SP) - - 1 → SP1 → SP

•      PSHX PSHX ; ; PUSH(X) PUSH(X) , , (SP) (SP) - - 1 → SP1 → SP

•      PULA PULA ; ; (SP) (SP) + + 1 → SP 1 → SP , , PULL(A)PULL(A)

•      PULH PULH ; ; (SP) (SP) + + 1 → SP 1 → SP , , PULL(H)PULL(H)

•      PULX PULX ; ; (SP) (SP) + + 1 → SP 1 → SP , , PULL(X) PULL(X)

• 系统复位后, 堆栈指针为系统复位后, 堆栈指针为 $00FF $00FF , 可以在复位, 可以在复位初始化时对初始化时对 SP SP 赋值, 将堆栈区设置的其他地方。赋值, 将堆栈区设置的其他地方。

8 ) 半字节交换指令

• NSA 指令使累加器 A 中的数的高4 位与低4 位对调。操作不影响 CCR 标志位。

• 例如:•    LDA  # $40   ; A = $40

•    NSA ; 执行后, A = $04

2 . 算术类指令

• 算术类指令主要包括加法指令、减法指令、无符号数乘法指令、除法指令、自加/减1 指令、求补/求反指令、 H : X/ SP 增加指令、比较/测试指令等。

• 1 ) 加法指令• 加法指令分为不带进位加 ADD 指令和带进位加

ADC 指令, ADD 指令将累加器中的值加上某一立即数或某一存储单元中的值, ADC 指令则还要加上 CCR 中 C 的值, 它们的最终结果都存放在累加器 A 中。

•    ADD # opr    ; (A) + opr → A

•   ADD opr ; (A) + (opr) → A

•   ADD , X ; (A) + ((H : X)) → A

•   ADD opr , X ; (A) + (opr + (H : X)) → A

•   ADD opr , SP ; (A) + (opr + (SP)) → A

•   ADC # opr ; (A) + opr + C → A

•   ADC opr ; (A) + (opr) + C → A

•   ADC , X ; (A) + ((H : X)) + C → A

•   ADC opr , X ; (A)+ (opr+ (H : X))+ C→A

•   ADC opr , SP ; (A)+ (opr+ (SP))+ C→A

• 例如:•    CLC      ; 0 → C

•    LDA # $AB ; A ← $AB

•    ADD # $CD

• ; (A) + $CD = $AB + $CD = $0178 , 进位 1 → C , $78 → A ; (A)= $78 , C = 1

•    LDA # $00 ; A ← $00

•    ADC # $00

• ; (A) + $00 + C = $00 + $00 + 1 = $01 , 进位 0 → C , $01 →A ; (A)= $01 , C = 0

2 ) 减法指令

• 减法指令分为不带 C 的 SUB 指令和带 C 的 SBC 指令, SUB 指令将累加器中的值减去某一立即数或某一存储单元中的值, SBC 指令则还要减去 CCR 中 C 的值, 差最终都存放在累加器 A 中。

•    SUB # opr   ; (A) - opr → A

•    SUB opr ; (A) - (opr) → A

•    SUB , X ; (A) - ((H : X)) → A

•    SUB opr , X ; (A) - (opr + (H : X)) → A

•    SUB opr , SP ; (A) - (opr + (SP)) → A

•    SBC # opr ; (A) - opr - C → A

•    SBC opr ; (A) - (opr) - C → A

•    SBC , X ; (A) - ((H : X)) - C → A

•    SBC opr , X ; (A)- (opr+ (H : X))- C→A

•    SBC opr , SP ; (A)- (opr+ (SP))- C→A

• 例如:•    CLC    ; 0 → C

•    LDA # $AB ; $AB → A

•    SUB # $CD ; (A)- $CD = $AB- $CD

• ;借位 1→C , $100+ $AB- • $CD = $DE → A

• ; A= $DE , C= 1

•    LDA # $02 ; $02 → A

•    SBC # $01 ; A- C- $01= $02- 1- 1= $00

• ;无借位, 0→C , $01→A

• ; A= $00 , C= 0

3 ) 乘/除法指令

• MUL 为无符号数乘法指令, 寄存器 X 、 A 中各放一个8 位无符号乘数, 执行后, 16 位积的高8 位在 X 中, 低8 位在 A 中, 同时将 H 、 C 标志位置零, 不影响其他标志位; DIV 为无符号数除法指令, 16 位被除数的高低8 位分别放在 H 、 A 寄存器中, 除数放在 X 寄存器中, 执行后, 商放入 A 中, 余数放入 H 中, 影响 Z 、 C 标志位, 不影响其他标志位。

•    MUL  ; (X) × (A) → X : A

•    DIV ; (H : A)/ (X) → A …H

• 例如:•    X = $50 , A = $A0

• 指令 MUL 执行后:•    X = $32 , A = $00 , H = C = 0

• 又如:•    H = $10 , A = $A0 , X = $50

• 指令 DIV 执行后:•    A = $35 , H = $10 , Z = C = 0

4 ) 自加1/减1 指令

• 自加1/减1 指令用于将 CPU 寄存器 A 、 X 或存储单元中的值自加1/减1 ,对 V 、 N 、 Z 标志位有影响, 对其他标志位无影响。

•    INCA     ; (A) + 1 → A

•    INCX ; (X) + 1 → X

•    INC opr ; (opr) + 1 → opr

•    INC , X ; ((H : X)) + 1 → (H : X)

•    INC opr , X

• ; (opr + (H : X))+ 1→opr+ (H : X)

•    INC opr , SP ; (opr + (SP))+ 1 → opr+(SP)

• DECA ; (A) - 1 → A

•    DECX ; (X) - 1 → X

•    DEC opr ; (opr) - 1 → opr

•    DEC , X ; ((H :X)) - 1 → (H:X)

•    DEC opr , X ; (opr + (X))- 1→opr+ (H:X)

•    DEC opr , SP ; (opr + (SP))- 1 → opr+ (SP)

• 例如:•    LDA # $00    ; A = 00

•    INCA ; A = 01

•    MOV # $40 , $40 ; $40 存储单元的值为 $40

•    INC $40 ; $40 存储单元的值为 $41

5 ) 求补/求反指令

• 求补/求反指令用于将 CPU 寄存器 A 、 X 或存储单元中的值求补/求反后再放回原处, 仅对 H 、 I 标志位无影响。

• 求补指令 NEG 执行立即数# 00 H - A/ X/存储单元中的值的操作, 并将运算结果送回 A/ X/存储单元中, 同时根据结果影响 V 、 N 、 Z 、 C 标志位。

• 求反指令 COM 执行立即数# 0 FFH - A/ X/存储单元中的值的操作, 并将运算结果送回 A/ X/存储单元中, 同时清 V 标志位为0 , 置 C 标志位为1 , 根据结果影响 N 、 Z 标志位。

• NEGA     ; 00H - (A) → A

•    NEGX ; 00H - (X) → X

•    NEG opr ; 00H - (opr) → opr

•    NEG , X ; 00H - ((H:X)) → (H:X)

•    NEG opr , X ; 00H- (opr+ (H:X))→(opr+ (H:X))

•    NEG opr , SP ; 00H- (opr+ (SP))→(opr+ (SP))

•    COMA ; 0FFH- (A)→A

•    COMX ; 0FFH- (X)→X

•    COM opr ; 0FFH- (opr)→opr

•    COM , X ; 0FFH- ((H :X))→(H:X)

•    COM opr , X ; 0FFH- (opr+ (H:X))→opr+ (H:X)

•    COM opr , SP ; 0FFH- (opr+ (SP))→opr+ (SP)

• 例如:•    LDA # 30H

•    NEGA   ;指令执行后, A=D0H , VNZC= 0101

•    LDA # 30H

•    COMA ; 指令执行后, A = CFH , VNZC = 0101

•    LDA # 0A3H

•    NEGA ; 指令执行后, A = 5DH , VNZC = 0001

•    LDA # 0A3H

•    COMA ; 指令执行后, A = 5CH , VNZC = 0001

6 ) H : X/ SP 增加指令

• H : X/ SP 增加指令用于将16 位间址寄存器 H : X 或16 位堆栈指针 SP 中的值直接增加一个8 位有符号立即数, 8 位有符号数所能表示的范围为- 128 ~ +127 , 超过此范围的参数将被编译软件视为非法。指令不影响任何标志位。

•    AIX # opr ; (H : X)+ opr → H : X

•    AIS # opr ; (SP)+ opr →SP

• 在 M 68 HC 08 系统中, 在前缀# 和数值之间加一负号“ - ” 来表示有符号立即数中的负数, 例如:

•   #- $10   ; 表示立即数- 10H

•   #- 64T ; 表示立即数- 64T

• 下面 H : X/ SP 增加指令是合法的:•    AIX #- $80 ; (H:X)+ (- 128T)→H:X

•    AIS # $7F ; (SP) + 127 → SP   • AIX # 32T ; (H:X) + 32T → H:X

•    AIS #- 64T ; (SP) + ( - 64T) → SP

7 ) 比较/零测试指令

• 比较指令用于将寄存器 A 、 X 或者 H : X 中的值与立即数或者存储单元的值进行比较, 它执行减法操作, 但不改变任何原操作数的值, 只是根据运算结果改变 CCR 寄存器中的 V 、 N 、 Z 、 C 标志位, 对 H 、 I 无影响。

•    CMP # opr     ; (A) 与 opr 比较•    CMP opr ; (A) 与 (opr) 比较•    CMP , X ; (A) 与 ((H : X)) 比较• CMP opr , X

• ; (A) 与 (opr+ (H:X)) 比较•     

•      CMP opr , SP

• ; (A) 与 (opr + (SP)) 比较•    CPX # opr ; (X) 与 opr 比较•    CPX opr ; (X) 与 (opr) 比较•    CPX , X ; (X) 与 ((H : X)) 比较•    CPX opr , X

• ; (X) 与 (opr + (H : X)) 比较•    CPX opr , SP

• ; (X) 与 (opr + (SP)) 比较•    CPHX # opr16 ; (H : X) 与 opr16 比较•    CPHX opr ; (H:X) 与 (opr: opr+ 1) 比较

• 例如, 若 A = FFH , 100 H = 00 H , H : X = 0000 H , 00 H = 0 FFH , 则

•    CMP # 0FFH  • ; (A) - 0FFH , 指令执行后, A 内容不变, V =

0 , N = 0 , Z = 1 , C = 0 , IMM 寻址•    CMP 100H

• ; (A) - (100H) , 指令执行后, 累加器 A 和 100H 单元内容不变, V = 0 , N = 1 , Z = 0 , C = 0

•     

• CMP , X

• ; (A) - (00H) , 指令执行后, 累加器 A 和 00H 单元内容不变, V = 0 , N = 0 , Z = 1 , C = 0

•    CPX 100H , X

• ; (X) - (100H) , 指令执行后, 寄存器 X 和 100H 单元内容不变, V = 0 , N = 0 , Z = 1 , C = 0

•    CPX , X

• ; (X) - (00H) , 指令执行后, 寄存器 X 和 00H 单元内容不变, V = 0 , N = 0 , Z = 0 , C = 1

• 零测试指令 TST 用于测试 A/ X/存储单元的值是否小于等于0 , 它执行减0的操作, 但不改变原操作数的值, 只是根据结果改变 N 、 Z 标志位。

•    TSTA   ; (A) = 0 ?•    TSTX ; (X) = 0 ?•    TST opr ; (opr) = 0 ?•    TST , X ; ((H : X)) = 0 ?•    TST opr , X ; (opr+ (H:X))= 0?•    TST opr , SP ; (opr+ (SP))= 0 ?

• 例如,若 A= FFH , 40H= 00H , H:X= 0000H ,则•    TSTA ; A - 00 , 指令执行后, A 中值不变,

N = 1 , Z = 0

•    TSTX ; X - 00 , 指令执行后, X 中值不变,N = 0 , Z = 1 , INH 寻址

•    TST 40H , X ; (40H)- 00 ,指令执行后, 40H单元中值不变, N= 0 , Z= 1 , IXl 寻址

• 比较/零测试指令仅影响 CCR 寄存器中相应标志位的值, 通常和比较转移指令配合使用, 控制程序流程。

8 ) 十进制调整指令

• DAA 是 BCD 码加法调整指令, 当两个 BCD 码进行加法运算后, 必须使用本指令调整才能得到和的正确 BCD 码。例如, 求两个 BCD 码 $ 54 与 $28 之和,必须在 ADD 指令后再用 DAA 指令进行调整:

•    LDA # $54    •    ADD # $28 ; VNZC= 0000 , A= $7C

•    DAA ; VNZC= 1100 , A= $82

3 . 逻辑类指令

• 逻辑类指令主要包括与/或/异或操作指令。• 与/或/异或指令将累加器 A 中的内容与相应的操作数进

行按位与/或/异或逻辑运算, 再将运算结果存入 A 中, 同时清标志位 V 为0 , 影响N 、 Z 标志位,对其他标志位无影响。

•    AND # opr   ; (A) opr → A∧•    AND opr ; (A) (opr)→A∧•    AND , X ; (A) ((H:X))→A∧•    AND opr , X ; (A) (opr∧ + (H:X))→A

•    AND opr , SP ; (A) (opr∧ + (SP))→A

•     

• ORA # opr ; (A) opr → A∨•    ORA opr ; (A) (opr) → A∨•    ORA , X ; (A) ((H ∨ : X)) → A

•    ORA opr , X ; (A) (opr∨ + (H : X))→A

•    ORA opr , SP ; (A) (opr ∨ + (SP)) → A

•    EOR # opr ; (A) opr → A⊕•    EOR opr ; (A) (opr) → A⊕•    EOR , X ; (A) ((H ⊕ : X)) → A

•    EOR opr , X ; (A) (opr⊕ + (H : X))→A

•    EOR opr , SP ; (A) (opr⊕ + (SP))→A

4 . 移位指令

• 移位指令分为算术左移/右移指令、逻辑左移/右移指令、循环左移/右移指令几种, 它们都需借助于 CCR 寄存器中的 C 标志位来实现左移右移功能, 影响除H 、 I 之外的其他标志位。

1) 算术左移指令

• 算术左移指令 ASL 将 A 、 X 或字节存储单元中的8 位数值左移1 位, 把8位操作数的最高位 b7 移入标志位 C 中, 其他位左移1 位, 0 移入 b0 。

•   ASLA

•    ASLX

•    ASL opr

•    ASL , X

•    ASL opr , X

•    ASL opr , SP

• ASL 指令相当于将寄存器或存储单元中的无符号数乘以2 后再将结果放回原处。

• 例如:•    CLC      ; 0 → C

•    LDA # $A5 ;执行后, A= A5H= 1010010lQ

•    ASLA ; 执行后, A= 01001010Q= 4AH , C= 1 , A5H×2= 14AH

•    ASLA ;执行后, A= 10010100Q= 94H , C= 0 , 4AH×2= 094H

•    ASLA ;执行后, A= 00101000Q= 28H , C= 1 , 94H×2= 128H

2) 算术右移指令

• 算术右移指令 ASR 将 A 、 X 或字节存储单元中的8 位数值右移1 位, 把8位操作数的最低位 bit0 移入标志位 C 中, 其他位右移1 位, 同时保持最高位 bit 7 不变。

•   ASRA

•    ASRX

•    ASR opr

•    ASR , X

•    ASR opr , X

•    ASR opr , SP

• ASR 指令相当于将寄存器或存储单元中的有符号数除以2 后再将结果放回原处。

• 例如:•    CLC     ; 0 → C

•    LDA # $A5      • ;执行后, A= A5H= 10100101Q=- 91T

•    ASRA

• ;执行后, A= 11010010Q= D2H=- 46T , C= 1

•    ASRA

• ;执行后, A= 11101001Q= E9H=- 23T , C= 0

•    ASRA

• ;执行后, A= 11110100Q= F4H=- 12T , C= 1

3) 逻辑左移指令

• 逻辑左移指令 LSL 将 A 、 X 或字节存储单元中的8 位数值左移1 位, 功能与算术左移指令 ASL 完全相同。

•    LSLA

•    LSLX

•    LSL opr

•    LSL , X

•    LSL opr , X

•    LSL opr , SP

4) 逻辑右移指令

• 逻辑右移指令 LSR 将 A 、 X 或字节存储单元中的8 位数值右移1 位, 把8位操作数的最低位 bit0 移入标志位 C 中, 其他位右移1 位, 0 移入 bit7 。

•   LSRA

•    LSRX

•    LSR opr

•    LSR , X

•    LSR opr , X

•    LSR opr , SP

• LSR 指令相当于将寄存器或存储单元中的无符号数除以2 后再将结果放回原处。

• 例如:•    CLC      ; 0 → C

•    LDA # $A5

• ; 执行后, A = A5H = 10100101Q

•    LSRA

• ;执行后, A= 01010010Q= 52H , C= 1

•   LSRA

• ; 执行后, A = 00101001Q = 29H , C = 0

•    LSRA

• ; 执行后, A = 0001 0100Q = 14H , C = 1

5) 循环左移指令

• 循环左移指令 ROL 通过标志位 C 将寄存器 A 、X 或字节存储单元中的8 位数值左移1 位, 将8 位操作数的最高位 bit 7 移入标志位 C 中, 原标志位 C 则移入 bit 0 , 其他位相应左移1 位。

• ROLA

•    ROLX

•    ROL opr

•    ROL , X

•    ROL opr , X

•    ROL opr , SP

• 例如:•    SEC        ; 1 → C

•    LDA # $A5

• ; 执行后, A = A5H = 1010010lQ

•    ROLA

• ;执行后, A= 01001011Q= 4BH , C= 1

•    ROLA

• ;执行后, A= 10010111Q= 97H , C= 0

6) 循环右移指令

• 循环右移指令 ROR 通过标志位 C 将 A 、 X 或字节存储单元中的8 位数值右移1 位, 把8 位操作数的最低位 bit 0 移入标志位 C 中, 原标志位 C 移入 bit 7 ,其他位右移1 位。

•     RORARORA

•      RORXRORX

•      ROR oprROR opr

•      ROR ROR , , XX

•      ROR opr ROR opr , , XX

•      ROR opr ROR opr , , SPSP

• 例如:•    SEC      ; 1 → C

•    LDA # $A5

• ; 执行后, A = A5H = 1010010lQ

•    RORA

• ; 执行后, A = 11010010Q = D2H , C = 1

•    RORA

• ; 执行后, A = lll0100lQ = E9H , C = 0

5 . 位操作类指令

• M 68 HC 08 的位操作类指令主要有位测试指令、位清0/置1 指令和 CCR 位操作指令。

• 1 ) 位测试指令• 位测试指令 BIT 用于测试 A 中的值与操作数的

各个位是否一致, 它将累加器 A 中的值和对应的操作数进行与运算, 运算的结果不回送到 A , 也不影响原来的操作数, 仅根据运算结果改变 N 、 Z 标志位, 并清0 V 标志位, 对其他标志位无影响。

• BIT # opr

•    BIT opr

•    BIT , X

•    BIT opr , X

•    BIT opr , SP

• 例如, 若 A = FFH , 120H = F0H , 100H = 00H , H : X = 0000H , 则

•    BIT # 0FFH   • ; 指令执行后, A 内容不变, V = 0 , N = 1 , Z = 0

•    BIT 120H

• ; 指令执行后, 120H 单元内容不变, V = 0 , N = 1 , Z = 0

•    BIT 100H , X

• ; 指令执行后, 100H 单元内容不变, V = 0 , N = 0 , Z = 1

• 2 ) 位清0/置1 指令• 位清0 指令 BCLR 和位置位指令 BSET 可以对微

控制器第0 页地址空间 ($0000 ~ $00FF) 中的任一可读、写的 RAM 存储单元和 I/ O 控制、状态寄存器的某一可读、写位执行清0 或置1 操作, 而其他位并不受影响。该指令也不会影响寄存器 CCR 中的各标志位。

•    BCLR n , opr

•    BSET n , opr

• 3 ) CCR 位操作指令• CCR 位操作指令包括对进位/借位标志位 C 清

0/置1 指令和对中断屏蔽标志位 I 清0/置1 指令。指令不影响除自己外的其他 CCR 标志位。

•    CLC ; 0 → C , 进位/借位标志位 C 清 0

•    SEC ; 1 → C , 进位/借位标志位 C 置 1

•    CLI ; 0 → I , 开中断•    SEI ; 1 → I , 关中断

6 . 转移类指令

• 转移类指令分为有条件转移类指令和无条件转移指令, M 68 HC 08 的转移指令大多为有条件转移指令。条件转移指令在条件满足时转移到 PC 指定的相应地址处执行, 否则顺序执行程序。无条件转移指令则无条件限制, 直接转移到 PC 指定的地址处执行程序。条件转移指令可分为位测试转移指令、累加器 A 比较相等转移指令、减1 不为0 转移指令、 CCR 转移指令等。 JMP 为无条件转移指令。

• 用户编写汇编语言程序时, 在转移指令中可以使用地址标号, 汇编程序会在编译程序时自动计算相对转移量, 并进行检查, 以确定是否超出了有效转移范围。

• 1 ) 位测试转移指令• 位测试转移指令可分为2 组, 分别用于对第0 页

存储空间 (0000 H ~ 00FFH) 任一字节单元某一位或微控制器的 IRQ 引脚电平的测试转移。

•    BRCLR n , opr , rel   • ; (opr) 第 n 位= 0 则转移•    BRSET n , opr , rel

• ; (opr) 第 n 位= 1 则转移•    BIL rel ; IRQ引脚= 0 则转移•    BIH rel ; IRQ引脚= 1 则转移

2 ) 累加器 A 比较相等转移指令

• 这组指令是 CMP 指令和 BEQ 指令的综合, 用于表格查找子程序的快速跳转, 它检测累加器 A 中的值是否与某一立即数或存储器中的值相等, 若相等则使程序转移到指令所指定的地址处执行, 否则顺序执行下一条指令。

• 这组指令既不改变任何原操作数的值, 也不影响任一 CCR 标志位。

• 这组指令中的 CBEQ X + , rel 是唯一一条采用无偏移量变址后加1 寻址方式 IX + 的指令, CBEQ opr ,X + , rel 是唯一一条采用8 位偏移量变址后加1 寻址方式 IX1+的指令。

• CBEQA # opr , rel   ; (A) = opr 则转移•    CBEQX # opr , rel ; (X) = opr 则转移•    CBEQ opr , rel ; (A) = (opr) 则转移•    CBEQ X+, rel

• ; (A) = ((H:X)) 则转移, (H:X)+ 1→H:X

•    CBEQ opr , X + , rel ; (A) = (opr + (H:X)) 则转移, (H : X) + 1 → H:X

•    CBEQ opr , SP , rel ; (A)= (opr+ (SP)) 则转移• 例如:•    CBEQ X+, Pro  • ;若 A= ((H:X))则转移至 Pro 处执行,且 (H:X)+ 1→H:X ;否则顺序执行且 (H:X)+ 1→H:X

3) 减1 不为0 转移指令

• 减1 不为0 转移指令 DBNZ 对寄存储器 A/ X 或某一字节存储器的值进行减1 运算并将结果放回原处, 若结果不为0 则转移, 否则顺序执行下一条指令。 DBNZ 指令不影响 CCR 标志位。

•    DBNZA rel  ; ( A) - 1 ≠ 0 则转移•    DBNZX rel ; ( X) - 1 ≠ 0 则转移•    DBNZ opr , rel ; ( opr) - 1 ≠ 0 则转移•    DBNZ X , rel ;(( H: X))- 1 ≠ 0 则转移•    DBNZ opr , X , rel

• ;( opr+( H:X))- 1≠0则转移•    DBNZ opr , SP , rel

• ;( opr+( SP))- 1≠0则转移

4) CCR 转移指令

• CCR 转移指令根据最近一条影响、改变 CCR 中 H 、 I 、 C 、 Z 、 N 、 V 标志位的指令的操作结果控制程序的转移。指令不影响 CCR 标志位。

•    BHCC rel ; H = 0 则转移•    BHCS rel ; H = 1 则转移•    BMC rel ; I = 0 则转移•    BMS rel ; I = 1 则转移•    BCC rel ; C = 0 则转移

• BCS rel BCS rel ; ; C C = = 1 1 则转移则转移•      BHS rel BHS rel ; ; C C = = 0 0 则转移则转移•      BLO rel BLO rel ; ; C C = = 1 1 则转移则转移•      BHI rel BHI rel ; ; C Z ∨C Z ∨ = = 0 0 则转移则转移•      BLS rel BLS rel ; ; C Z ∨C Z ∨ = = 1 1 则转移则转移•      BNE rel BNE rel ; ; Z Z = = 0 0 则转移则转移•      BEQ rel BEQ rel ; ; Z Z = = 1 1 则转移则转移•      BPL rel BPL rel ; ; N N = = 0 0 则转移则转移•      BMI rel BMI rel ; ; N N = = 1 1 则转移则转移•      BGE rel BGE rel ; ; N V ⊕N V ⊕ = = 0 0 则转移则转移•      BLT rel BLT rel ; ; N⊕N⊕ V V = = 1 1 则转移则转移•      BGT rel BGT rel ; ; Z ∨Z ∨ (( N V⊕N V⊕ ) = ) = 0 0 则转移则转移•      BLE rel BLE rel ; ; Z ∨Z ∨ (( N V⊕N V⊕ ) = ) = 1 1 则转移则转移

• M 68 HC 08 指令系统中能够影响、改变 CCR 标志位的指令很多, 当上述 CCR 转移指令与 CMP 、CPX 、 CPHX 、 SUB 等指令配合使用后, 便可实现大于转移、小于转移、大于等于转移、小于等于转移、相等转移、不等转移等多种转移功能。

• 上述所有条件转移类指令在其汇编后的机器指令码中都用一个字节来存储相对偏移量, 2 字节的转移指令可转移的范围为相对于存放转移机器指令码地址的- 126 ~ + 129 B ; 3 字节的转移指令可转移的范围则为相对于存放转移机器指令码地址的- 125 ~ + 130 B 。

5) 无条件转移指令

• 无条件转移指令包括 BRA 和 JMP 指令, 均不影响 CCR 标志位。

•    BRA rel   ; 无条件相对转移•    JMP opr ; opr → PC , 无条件转移•    JMP , X ;( H: X) → PC , 无条件转移•    JMP opr , X ; opr+( H:X)→ PC ,无条件转移

• BRA 指令实现无条件相对转移, 由于是相对寻址, 本身又为二字节指令,故其无条件相对转移的范围为相对于存放 BRA 机器指令码地址的- 126 ~+ 129 B 。

• JMP 指令将其后面所接的的操作数作为地址值送至16 位程序计数器 PC ,使程序跳至 JMP 指令所指定的地址处执行, JMP 指令可以实现64 KB (0000 H ~0 FFFFH) 空间任一有效地址的跳转。

• 例如:•    BRA   ; 无条件重复执行本语句•    JMP $F000H

• ; $F000→PC ,程序跳至 $F000 地址处执行•    JMP $8000H , X

• ; 16 位偏移量 $8000+ H:X 中的值之和→ PC

6) 子程序调用/返回指令

• 子程序调用/返回指令实现子程序的调用和返回, 其中, BSR 为相对寻址子程序调用指令, 只能调用相对于本指令地址- 126~+ 129B 地址空间内的子程序; JSR 指令可调用 64KB ( $0000 ~ $FFFF) 地址空间中任一有效地址处的子程序。 RTS 为子程序返回指令, RTI 为中断子程序返回指令。

• BSR   rel   ;( PC)+ n→PC( n= 1/ 2/ 3)•    JSR opr ; PUSH( PCL),( SP)- 1→SP

•    JSR , X ; PUSH( PCH),( SP)- 1→SP

•    JSR opr , X ;( PC)+ rel→PC

•    RTS ;( SP)+ 1→SP , PULL( PCH)• ;( SP)+ 1→SP , PULL( PCL)•    RTI ;( SP)+ 1→SP , PULL( CCR)• ;( SP)+ 1→SP , PULL( A)• ;( SP)+ 1→SP , PULL( X)• ;( SP)+ 1→SP , PULL( PCH) • ;( SP)+ 1→SP , PULL( PCL)

• 执行 BSR 或 JSR 指令时, 首先将下一条将要执行的指令的地址值送到16 位程序计数器 PC , 然后按照先入后减、先低8 位、后高8 位的顺序将 PC 中的值压入堆栈, 最后将子程序的入口地址装入 PC , 完成对子程序的调用。在子程序的最后应该使用 RTS 指令, 否则程序无法正确返回至 BSR 或 JSR 的下一条指令处, 可能产生预想不到的错误。

• 执行 RTS 指令时按照先加后出的顺序将堆栈中的值分别弹出至 PCH 和 PCL , 这样正好使程序返回至 BSR 或 JSR 的下一条指令处, 实现了子程序的正确返回。

• 在中断子程序中则应使用 RTI 返回指令。由于在进入中断子程序前已依次将 PCL 、 PCH 、 X 、 A 、CCR 寄存器中的值入栈, 所以执行 RTI 时则依次将堆栈中的值弹出至 CCR 、 A 、 X 、 PCH 、 PCL 中。

7 . 其他指令

• 其他指令包括: 空操作指令、软中断指令、进入停止模式指令和进入等待模式指令。

• 1) 空操作指令 NOP

• 空操作指令执行时不进行任何操作, 不影响 CCR 标志位, 常用来产生软件延时。

•    NOP  ; 通常用于产生 1 个总线周期的延时•    BRN rel ; 相当于执行一个耗时 3 个总线周期的

空操作

2) 软中断指令 SWI

• SWI 是一条不可屏蔽的中断指令, 不论 CCR 中中断屏蔽位 I 是否为0 , I 的状态对 SWI 都没有影响。执行 SWI 时, 将依次完成以下操作:

•    SWI ; PC= PC+ 1

• ; PUSH( PCL), SP = SP - 1

• ; PUSH( PCH), SP = SP - 1

• ; PUSH( X), SP= SP- 1

• ; PUSH( A), SP= SP- 1

• ; PUSH( CCR), SP= SP- 1 , I= 0

• ; PCH=( $FFFC), PCL=( $FFFD)

• 执行 SWI 程序时, 将依次把 SWI 下一条指令的地址和 X 、 A 、 CCR 中的值压入堆栈, 然后清 I 位为0 , 将中断向量表 $FFFC ~ $FFFD 处的地址值装入 PC , 使程序转移到 $FFFC ~ $FFFD 处所指定的入口地址处执行软中断服务子程序。在软中断服务子程序的最后, 再用 RTI 命令返回原断点处, 继续往下执行下一条指令。

3) 进入停止模式指令 STOP

• STOP 指令用于使微控制器进入停止低功耗模式, 微控制器在进入低功耗模式前自动清 I 位为0 并允许外部 IRQ 中断。在停止低功耗模式下只有少数模块在继续工作。若 CONFIG 2 寄存器中的 OSCSTOPENB 位为0 , 则振荡器也禁止工作; 在执行 STOP 指令前应该设置 CONFIG 1 寄存器中的 STOP 位为1 , 以免产生非法操作码复位。

• 例如:•   BSET 1 , CONFIGl  ;允许 STOP 指令•   BCLR 1 , CONFIG2

• ;禁止振荡器在 STOP 模式下工作•   STOP

• ; I= 0 ,微控制器进入 STOP 低功耗模式• 微控制器进入 STOP 模式后, 所有的寄存器和 RA

M 中的数据保持不变, I/ O 引脚的电平也保持不变。外部 IRQ 中断或其他中断如键盘中断等可以使微控制器退出STOP 低功耗模式。退出 STOP 模式后, CPU 时钟和总线时钟继续工作, 频率等于执行 STOP 指令前的频率。

4) 进入等待模式指令 WAIT

• WAIT 指令用于使微控制器进入等待低功耗模式。 WAIT 模式下的功耗要比 STOP 模式的大, 此时 CPU 的时钟被关闭, 但内部总线时钟并不停止, 微控制器内部大多数模块仍在继续工作, 这些模块所产生的中断可以使微控制器退出 WAIT 低功耗模式。执行 WAIT 指令时会自动清 I 位为0 , 并允许外部 IRQ 中断。

3. 4. 3   PIC 指令系统

• PIC 16 F 87 X 指令系统共有35 条指令, 均是长度为14 位的单字节指令。将所有指令按操作对象的不同又可分为3 类: 面向字节操作类(17 条) , 面向位操作类(4 条) , 常数操作和控制操作类(14 条) 。

标志位定义:

• (1) 进位/借位标志位 C

• 执行加法指令时, 发生进位 C = 1 , 否则C = 0 ; 执行减法指令时, 不发生借位 C =

1 , 否则 C = 0 。

(2) 辅助进位位 DC ( auxiliary carry)

执行加法指令时, 低4 位向高4 位发生进位 DC = 1 , 否则 DC = 0 ; 执行减法指令时, 低4 位向高4 位不发生借位 DC = 1 , 否则 DC = 0 。

• (3) 零标志位 Z

• 算术或逻辑运算的结果为0 , Z = 1 , 否则DC = 0 。

• (4) 降耗标志位 PD

• 初始加电或执行看门狗清0 指令( CLRWDT) 后 PD = 1 , 执行睡眠指令( SLEEP) 后 PD = 0 。

(5) 超时标志位 TO

• 上电或 CLRWDT 或 SLEEP 指令执行后 TO = 1 , 若看门狗发生超时 TO = 0 。

• (6) RAM 数据存储器体选择位 IRP 、 RP 1 和 RP0

• RP 1 和 RP 0 用于直接寻址:• RP 0    RP 1• 0    0    选中体0• 0    1    选中体1• 1    0    选中体2• 1    1    选中体3

习题与思考题

• 3 . 1  微控制器指令按功能可以分为哪几类? 每类指令的作用是什么?• 3 . 2  按功能对 PIC 指令分类, 并指出它们各有什么特点?• 3 . 3  变址寻址和相对寻址中的地址偏移量有何异同?• 3 . 4  有几种办法可以对某个存储单元中数据进行变换, 使其中某些

位取反而其余位不变?• 3 . 5  有几种办法可以将2 个存储单元中数据进行交换?• 3 . 6  如何将4 个单字节无符号数相加?如何将2 个双字节无符号数

相加?• 3 . 7  如何进行 BCD 加法和减法? 并对其工作过程进行分析。• 3 . 8  如何进行单字节无符号数的乘法和除法? 多字节无符号数的乘法和除法又如何进行?

• 3 . 9  如何进行异或等较复杂的位逻辑运算?• 3 . 10  如何将缓冲区数据中的正数和负数分别送入正数区和负数区?