null第五章
HC08 CPU与汇编基础第五章
HC08 CPU与汇编基础主要
内容
财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容
HC08 CPU基本构成
寻址方式
指令系统
HCS08 CPU与HC08 CPU的比较
08汇编语言基础 5.1 HC08 CPU基本构成5.1 HC08 CPU基本构成M68HC08系列单片机的各种型号的CPU均使用HC08 CPU,有时也将HC08 CPU称为CPU08,它具有如下主要特点:
① 目标代码与M68HC05系列单片机向上兼容;
② 具有16位堆栈指针SP;
③ 具有16位变址寄存器HX;
④ 8MHz CPU内部总线频率;
⑤ 64KB程序/数据存储器空间;
⑥ 16种寻址方式;
⑦ 不经过累加器A的存储器之间数据直接传送;
⑧ 快速8位×8位乘法指令、快速16位与8位相除指令,增强的BCD指令;
⑨ 模块化结构,可扩展的内部总线定义可使寻址范围超过64KB;
⑩ 低功耗的STOP、WAIT模式。HC08 CPU中有5个寄存器:HC08 CPU中有5个寄存器:(1)累加器A(Accumulator)
累加器A是8位通用寄存器,用来存放操作数和运算结果。数据读取时,累加器A用于存放从存储器读出的数据;数据写入时,累加器A用于存放准备写入存储器的数据。在执行算术、逻辑操作时,累加器首先存放一个操作数,执行完毕时累加器存放操作结果。累加器A是指令系统中最灵活的一个寄存器,各种寻址方式均可对之寻址。复位时,累加器的内容不受影响。 (2)变址寄存器HX(Index Register)(2)变址寄存器HX(Index Register) HC08 CPU的变址寄存器HX是16位寄存器,H是高8位,X是低8位,可单独使用。变址寄存器HX主要用于变址寻址方式中确定操作数的地址,也可以用来存放临时数据,作为一般寄存器使用。复位时,高8位被清零。
(3)堆栈指针SP(Stack Pointer)
SP是指向下一个栈地址的16位寄存器,堆栈指针SP采用递减的结构,即进栈时SP减1,出栈时SP加1。复位时,SP的初值为$00FF(前置符号$
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示十六进制数,下同)。栈指针复位指令(RSP)可将SP的低8位置为$FF,而不影响高8位。
在堆栈指针作为8位或16位的偏移量寻址方式中,SP充当变址寄存器功能,CPU利用SP的内容确定操作数的条件地址。 (4)程序计数器PC(Program Counter)(4)程序计数器PC(Program Counter) 程序计数器PC也是16位的,可寻址范围达64KB。PC存放下一条指令的地址,在执行转移指令时存放转移地址,在执行中断指令时存放中断子程序入口地址。复位时,程序计数器PC装入地址$FFFE和$FFFF中的内容。一般地,地址$FFFE和$FFFF中的内容是复位的入口地址,这样,复位后,程序能够从复位入口地址开始执行程序。复位入口地址也称复位向量地址或复位矢量地址(Reset vector address),意味着复位状态过后,PC指向该处,从这里执行程序。
(5)条件码寄存器CCR(Condition Code Register)
条件码寄存器CCR是8位的寄存器(见图5-1),其中5位(除了中断屏蔽位I)用于指示刚执行完指令的结果状态,这些位可由程序来测试。第6位(D6)和第5位(D5)永远为1,其余位有具体的含义。HC08 CPU的寄存器HC08 CPU的寄存器返回5.2 寻址方式5.2 寻址方式(1)内在寻址方式(INH,Inherent addressing mode)
内在寻址,是指那些在指令中已经包含了操作数所在之处。内在寻址的指令是没有明确指出操作数的指令,操作数由指令隐含,且为单字节指令。这类指令只是执行内在的数据操作。例如累加器加1指令INCA、中断返回指令RTI、停止指令STOP和置进位标志SEC等。
(2)立即寻址方式(IMM,Immediate addressing mode)
立即寻址,是在指令中直接给出操作数。这种指令是双字节指令,第一个字节是操作码,第二个字节是参与操作的立即数。立即寻址指令通常是对立即数和累加器内容或变址寄存器内进行操作。下述指令属于IMM寻址方式。
LDA #$FC ; 把十六进制数$FC放入累加器A中(3)直接寻址方式(DIR,Direct addressing mode)(3)直接寻址方式(DIR,Direct addressing mode)直接寻址指令,字长二字节,它可以对存储器的起始256个地址($0000~$00FF,叫内存直接页或内存第0页)进行访问。指令的第一个字节是操作码,第二个字节是操作数地址。在直接寻址中,CPU自动把$00作为操作数高位地址,第二个字节作为操作数的低位地址,其寻址范围为$0000~$00FF。下述指令属于DIR寻址方式。
LDA $60 ;将存储单元$60中的数取至累加器A
BRSET和BRCLR是2条很特别的3字节指令,它们用直接寻址方式取得操作数,用相对寻址方式指明转移目的地址。例如:
BRCLR 3,$50,A1 ;若存储单元$50的第3位=0则转至标号A1处
BRSET 3,$50,A1 ;若存储单元$50的第3位=1则转至标号A1处(4)扩展寻址方式(EXT,Extended addressing mode)(4)扩展寻址方式(EXT,Extended addressing mode) 扩展寻址指令是三字节指令,可访问存储器中的任何地址。在这种指令中,第一个字节是操作码,第二个字节是操作数的高字节地址,第三个字节是低字节地址。扩展寻址是相对于直接寻址方式而言的,其寻址范围为$0000~$FFFF,比直接寻址范围大得多。下述指令属于EXT寻址方式,因为它的地址已经超过了DIR寻址方式的范围。
LDA $023D ;将存储单元$023D中的数取至累加器A
(5)无偏移量变址方式(IX,Indexed, no offset addressing mode)
无偏移量变址的指令是单字节指令。在这种指令中,变址寄存器HX中的内容是操作数的地址。所以无偏移量变址指令可以对$0000~$FFFF地址进行寻址。下述指令属于IX寻址方式。
LDA ,X ;从变址寄存器HX指向的存储器单元中取数到累加器A中
COM ,X ;将变址寄存器HX指向的存储单元数据取反(6)八位偏移量变址方式(IX1,Indexed,8-bit offset addressing mode)(6)八位偏移量变址方式(IX1,Indexed,8-bit offset addressing mode) 8位偏移量变址是双字节指令,CPU把变址寄存器HX的内容和指令第二个字节内容相加,其和便是操作数地址。下述指令属于IX1寻址方式。
STA $80,X ;将A中的数存至地址为HX+$80的存储器单元中
INC $80,X ;将地址为HX+$80的存储器单元的内容加1
(7)十六位偏移量变址方式(IX2,Indexed,16-bit offset addressing mode)
该变址方式指令是三字节指令,可访问存储器的任何地址。CPU将变址寄存器HX的内容与指令的第二、三字节相加,和为操作地址。在第二、三字节中,第二字节是高位地址,第三字节是低位地址。下述指令属于IX2寻址方式。
STA $280,X ;把A中的数存放到以HX+$280为地址的存储单元中
INC $280,X ;把以HX+$280为地址的存储器单元的内容加1 (8)相对变址寻址方式(REL,Relative addressing mode)(8)相对变址寻址方式(REL,Relative addressing mode)相对变址只用于转移指令。当转移条件满足时,CPU将指令中的偏移量和程序计数器 PC的内容相加,得出转移的目的地址。如果转移条件不满足,则CPU执行下一条指令。转移指令中的偏移量是带符号的,且用一字节表示,因此转移指令的偏移量为-127~+128。偏移量用二进制补码表示。相对变址转移指令的转移范围在下一条指令地址的-127~+128之间。下述指令属于REL寻址方式。
BRA A1 ;无条件转向标号A1处执行
BSR L1 ;调用标号L1处的子程序
特别说明:以上8种寻址方式在M68HC05系列中也具有,以下8种为M68HC08系列单片机新增的寻址方式,其中9~12为存储器到存储器的数据传送寻址方式,13~14是含有加1的变址寻址,15~16为堆栈寻址。(9)存储器:直接地址—直接地址寻址方式(DD, Direct to direct addressing Mode)(9)存储器:直接地址—直接地址寻址方式(DD, Direct to direct addressing Mode)在存储器的四种数据直接传送的寻址方式中,欲传送的数据直接从源存储单元送向目的存储单元,勿需寄存器中转。在本寻址方式中,源地址与目标地址由指令直接给出。只有一条指令为DD寻址方式:
MOV N1,N2 ;把内存变量N1赋值给内存变量N2
等同于下列两条指令,但上述指令不影响累加器A。
LDA N1
STA N2
等同于C语言语句:
N2=N1;
特别说明:这里设N1、N2为内存变量,下同。 (10)存储器:直接地址—变址、变址加1的寻址方式(DIX+,Direct to indexed with post increment addressing Mode)(10)存储器:直接地址—变址、变址加1的寻址方式(DIX+,Direct to indexed with post increment addressing Mode)源地址为直接地址,目标地址在HX中。把源地址的数据存至目标地址后,HX+1→HX。仅有一条指令为DIX+寻址方式。
MOV $80,X+ ;($80)→(HX),HX+1→HX
等同于下列三条,但上述指令不影响累加器A,主要用于内存或端口数据填充一个表格。
LDA $80 ;($80)→A
STA ,X ;A→(HX)
AIX #!1 ;HX+1→HX
特别说明:操作说明栏中,($80)表示地址为$80的内存单元内容。(HX)表示地址为HX值的内存单元。若内存单元作为源操作数,表示从该内存单元中取数,若内存单元作为目的操作数,表示将数存至该内存单元。 (11)存储器:立即数—直接地址寻址方式(IMD,Immediate source to direct destination addressing Mode)(11)存储器:立即数—直接地址寻址方式(IMD,Immediate source to direct destination addressing Mode)该寻址方式,将立即数存入直接地址,指令给出的地址即作为目的地址,在指令书写中,立即数位于直接地址之前,下述指令为IMD寻址方式。
MOV #!86,N1 ;将立即数!86赋值给内存变量N1
等同于C语言语句:
N1=86; (12)存储器:变址—直接地址、变址加1的寻址方式(IX+D,Indexed with post increment to direct addressing Mode)(12)存储器:变址—直接地址、变址加1的寻址方式(IX+D,Indexed with post increment to direct addressing Mode)HX为源地址,直接地址为目的地址,把源地址的数据存至目标地址后后,HX+1→HX。仅有一条指令为IX+D寻址方式。
MOV X+,$80 ;(HX)→($80),HX+1→HX
等同于下列三条指令,但上述指令不影响累加器A,主要用于向端口传送内存数据块。
LDA ,X ;(HX)→A
STA $80 ;A→($80)
AIX #!1 ;HX+1→HX(13)无偏移量变址、变址加1寻址方式(IX+,Indexed,no offset, post increment addressing mode)(13)无偏移量变址、变址加1寻址方式(IX+,Indexed,no offset, post increment addressing mode) 在这种寻址方式与无偏移量变址寻址方式IX的区别在于,在本寻址方式中多了HX+1→HX的操作。只有一条指令属于IX+寻址方式,该指令先完成比较操作,但不论条件是否满足,均有HX+1→HX。通常用于寻找一段存储区中是否有与A中相等的数。
CBEQ X+,rel ;若A=(HX)则转移,HX+1→HX
(14)八位偏移量变址、变址加1寻址方式(IX1+,Indexed, 8-bit offset, post increment addressing mode)
与上条指令的差别是:目的操作数的地址为8位直接地址+(HX),属于IX+寻址方式的指令也只有一条。
CBEQ addr8,X+,rel ;若A=(HX+addr8)则转移,HX+1→HX(15)八位偏移量堆栈寻址方式(SP1,Stack pointer,8-bit offset addressing mode)(15)八位偏移量堆栈寻址方式(SP1,Stack pointer,8-bit offset addressing mode) 8位偏移量堆栈寻址,是将指令给出的8位直接地址与堆栈指针SP相加形成操作数的地址,下列指令属于SP1寻址方式。
LDA !2,SP ;(2+SP) →A
(16)十六位偏移量堆栈寻址方式(SP2,Stack pointer,16-bit offset addressing mode)
16位偏移量堆栈寻址,将指令给出的16位直接地址与堆栈指针SP相加形成操作数的地址,下列指令属于SP2寻址方式。
LDA $130,SP ;将地址$130+SP中的数取至A中
特别说明:实际编程时,程序员不必考虑8位偏移量堆栈寻址还是16位偏移量堆栈寻址,汇编程序会自动识别,它们的主要区别在于汇编产生的指令长度不一样。 返回5.3 指令系统5.3 指令系统HC08 CPU指令简表 :HC08 CPU指令简表(续):HC08 CPU指令简表(续):5.3.1 数据传送类指令5.3.1 数据传送类指令5.3.2 算术运算类指令
5.3.3 逻辑运算类指令
5.3.4 位操作类指令
5.3.5 移位类指令
5.3.6 程序控制类指令
5.3.7 其它指令返回5.4 HCS08 CPU与HC08 CPU的比较5.4 HCS08 CPU与HC08 CPU的比较Freescale于2004年推出了08系列单片机的增强系列——MCS08系列。MCS08系列单片机的内核使用HCS08 CPU。与HC08 CPU相比,HCS08 CPU速度更快,内部总线频率由最高8MHz提高到20 MHz,即执行一条基本指令的时间是50ns。
HCS08 CPU共有141条基本指令,比HC08 CPU增加了1条基本指令(即BGND这一条)。这141条基本指令加上寻址方式形成了280条具体指令,比HC08 CPU增加了10条具体指令。 HCS08 CPU比HC08 CPU增加的指令如下:HCS08 CPU比HC08 CPU增加的指令如下:(1)对LDHX指令,增加了EXT、IX、IX1、IX2、SP1寻址方式
指令 操作 寻址方式
LDHX addr16 (addr16: addr16+1)→HX EXT
LDHX ,X (HX:HX+1)→HX IX
LDHX addr16,X (addr16+HX: addr16+HX+1)→HX IX2
LDHX addr8,X (addr8+HX: addr8+HX+1)→HX IX1
LDHX addr8,SP (addr8+SP: addr8+SP+1)→HX SP1
(2)对STHX、CPHX增加了EXT、SP1寻址方式
STHX addr16 HX→(addr16: addr16+1) EXT
STHX addr8,SP HX→(addr8+SP: addr8+SP+1) SP1
CPHX addr16 HX-(addr16:addr16+1) EXT
CPHX addr8,SP HX-(addr8+SP:addr8+SP+1) SP1
(3)增加了BGND(background)指令,用于调试
BGND 用于背景调试 INH 返回5.5 08汇编语言基础5.5 08汇编语言基础5.5.1 08汇编源程序格式
把汇编语言写成的源程序“翻译”成机器语言的工具叫汇编程序或编译器(Assembler),以下统一称作编译器。
汇编语言源程序可以用通用的文本编辑软件书写编辑,以ASCII码形式存盘。具体的编译器对汇编语言源程序的格式有一定的要求,同时,编译器除了识别单片机的指令系统外,为了能够正确地产生目标代码以及方便汇编语言的编写,编译器还提供了一些在汇编时使用的命令、操作符号,在编写汇编程序时,也必须正确使用它们。由于编译器提供的指令仅是为了更好地做好“翻译”工作,并不产生具体的机器指令,因此这些指令被称为伪指令(Pseudo Instruction)。
汇编语言源程序以行为单位进行
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
,每一行最多可以包含以下四个部分:(1)标号(Labels)(1)标号(Labels)对于标号有下列要求及说明:
如果一个语句有标号,则标号必须从第一列开始书写。
可以组成标号的字符有:字母A~Z、数字0~9、下划线“_”、美元符号“$”,但开头的第一个符号不能为数字和$。
08编译器不区分标号中字母的大小写。
标号应小于16个字符。
标号后可以带冒号“:”,也可以不带冒号。
一个标号在一个程序中只能定义一次,不能通过编译。
若一行中第一个字符是星号“*”,这是标号,表明该行为注释。
一行语句若只有标号,编译器将把当前程序计数器的值赋给该标号。
若希望更多的编译器能够识别,建议标号长度小于8个字符。
“#”表示立即数。 (2)操作码(Opcodes)(2)操作码(Opcodes) 操作码包括指令码以及后面即将介绍的08编译器可以识别的伪指令码。对于有标号的行,必须用至少一个空格或制表符(TAB)将标号与操作码隔开。对于没有标号的行,不能从第一列开始写指令码,应以空格或制表符(TAB)开头。08编译器不区分操作码中字母的大小写。
(3)操作数(Operands)
操作数可以是地址、标号或指令码定义的常数,也可以是由伪运算符构成的表达式。08编译器识别下列伪运算符:加(+)、减(-)、乘(*)、除(/)、特殊除(\,允许被除数为0,此时认为结果也为0)、左移(<)、右移(>)、取余数(%)、与(&)、或(|)、异或(^)。如果超过一种运算或中间有插入空格应使用{}把它们包含在内。
(4)注释(Comments)
注释即是说明文字,若是处于指令之后,则用空格和分号“;”与指令分开,若整行为注释文字,则在第一列写上“;”或“*”。 5.5.2 08伪操作指令5.5.2 08伪操作指令 08编译器常用伪指令如下。
(1)存储区定义伪指令:RMB n
定义了一个存储区,预留n个字节。这里的n可以为数字,也可以是已经定义过的符号。一般用于在RAM区用标号定义数据变量或缓冲区。相当于高级语言的变量声明。
(2)字节常数定义伪指令:FCB m
定义程序区中(Flash存储器区)的字节常数。该伪指令可以有一个或多个用逗号“,”隔开的操作数。每个操作数的值应在一个字节内,编译器将它们分别存放在目标程序的一个地址中。m可以为数字、标号、字符串。字符串必须用单引号或双引号括起来,实际定义其ASCII码。
(3)双字节常数定义伪指令:DW n
定义程序区放入目标程序的两个连续地址中,高字节在前,低字节在后。n可以是数字或标号。(4)赋值伪指令: 标号:EQU n(4)赋值伪指令: 标号:EQU n 该伪指令把EQU后的操作数值赋给EQU之前的标号,相当于高级语言中给一个常数名赋值,以便后面编程使用。例如:
X1_1: EQU $50 ; 把$50赋值给标号X1_1
(5)指令存储定位伪指令:ORG n
定义程序或数据区的起始地址。该伪指令中的表达式n为数字或标号,它告诉编译器,在指令汇编后,其后的指令在存储器中将从地址n开始向地址增大方向存放。对于M68HC08系列单片机来说,一个完整的可以在编译后放入单片机执行的源程序,至少必须有一个ORG语句使程序能够放入Flash区。
(6)INCLUDE 指示命令
INCLUDE是一个附加文件的链接指示命令,利用它,可以把另一个源文件插入当前的源文件一起汇编,成为一个完整的源程序。
格式:$INCLUDE “[驱动器名:][路径名] 文件名”返回本章小结本章小结本章从程序员角度介绍HC08 CPU的编程结构、寻址方式、指令系统,比较HC08 CPU与HCS08 CPU,给出08汇编语言的格式、伪指令以及汇编过程涉及的文件。要求掌握CPU内部5个寄存器的使用方法、理解16种寻址方式、记住常用指令、进行编程实践。 返回