保持快乐,善于表达,敢于创新

寻址方式

上一篇 / 下一篇  2010-10-18 16:26:56 / 个人分类:嵌入式开发

指令是对数据的操作,通常把指令中所要操作的数据称为操作数,HC08 CPU所需的操作数可能来自:寄存器、指令代码、存储单元。而确定指令中所需操作数的各种方法称为寻址方式(Addressing Mode)。寻址方式越多,指令系统的功能就越强,灵活性也越大。MC68HC08系列单片机的寻址方式共有16种,比MC68HC05单片机增加了8种。下面逐一介绍。

(1) 内在寻址方式(INHInherent addressing mode)

内在寻址,是指那些在指令中已经包含了操作数所在之处。内在寻址的指令是没有明确指出操作数的指令,操作数由指令隐含,且为单字节指令。这类指令只是执行内在的数据操作。例如累加器加1指令INCA、中断返回指令RTI、停止指令STOP和置进位标志指令SEC等。

(2) 立即寻址方式(IMMImmediate addressing mode)

立即寻址,是在指令中直接给出操作数。这种指令是双字节指令,第一个字节是操作码,第二个字节是参与操作的立即数。立即寻址指令通常是对立即数和累加器内容或变址寄存器内进行操作。下述指令属于IMM寻址方式。

LDA  #$FC     // 把十六进制数$FC放入累加器A

特别说明:在Freescale(Motorola)公司单片机的指令系统中,规定在数字前加$表示十六进制数,加%表示二进制数,无前缀表示十进制数。另外,指令中的数据前加#表示立即数。

(3) 直接寻址方式(DIRDirect addressing mode)

直接寻址指令,字长二字节,它可以对存储器的起始256个地址($0000$00FF),叫内存直接页(或内存0)进行访问。指令的第一个字节是操作码,第二个字节是操作数地址。在直接寻址中,CPU自动把$00作为操作数高位地址,第二个字节作为操作数的低位地址,其寻址范围为$0000~$00FF。下述指令属于DIR寻址方式。

LDA   $60       //将存储单元$60中的数取至累加器A

BRSETBRCLR2条很特别的3字节指令,它们用直接寻址方式取得操作数,用相对寻址方式指明转移目的地址。例如:

BRCLR  #3,$50,A1 //若存储单元$50的第3=0则转至标号A1

BRSET  #3,$50,A1 //若存储单元$50的第3=1则转至标号A1

(4) 扩展寻址方式(EXTExtended addressing mode)

扩展寻址指令是三字节指令,可访问存储器中的任何地址。在这种指令中,第一个字节是操作码,第二个字节是操作数的高字节地址,第三个字节是低字节地址。扩展寻址是相对于直接寻址方式而言的,其寻址范围为$0000~$FFFF,比直接寻址范围大得多。下述指令属于EXT寻址方式,因为它的地址已经超过了DIR寻址方式的范围。

LDA  $023D     //将存储单元$023D中的数取至累加器A

特别说明:实际编程时,程序员不必考虑是直接寻址还是扩展寻址,汇编程序会自动识别,主要区别在于汇编产生的指令长度不一样。

(5) 无偏移量变址方式(IXIndexed, no offset addressing mode)

无偏移量变址的指令是单字节指令。在这种指令中,变址寄存器HX中的内容是操作数的地址。所以无偏移量变址指令可以对$0000~$FFFF地址进行寻址。下述指令属于IX寻址方式。

LDA  ,X  //从变址寄存器HX指向的存储器单元中取数到累加器A

COM  ,X  //将变址寄存器HX指向的存储单元数据取反

无偏移量变址指令通常用于数据表中移动数据指针或者用于保存频繁使用的RAMI/O单元的地址

特别说明:在变址方式中,在操作数位置出现的X,实际代表变址寄存器HX,这样书写,仅是因为HC08是从HC05发展而来,而HC05系列MCU中没有H,下同。

(6) 八位偏移量变址方式(IX1Indexed,8-bit offset addressing mode)

8位偏移量变址是双字节指令,CPU把变址寄存器HX的内容和指令第二个字节内容相加,其和便是操作数地址。下述指令属于IX1寻址方式。

STA  $80,X   //A中的数存至地址为HX+$80的存储器单元中

LDA  $80,X   //将存储单元HX+$80中的数取至累加器A

(7) 十六位偏移量变址方式(IX2Indexed,16-bit offset addressing mode)

该变址方式指令是三字节指令,可访问存储器的任何地址。CPU将变址寄存器HX的内容与指令的第二、三字节相加,和为操作地址。在第二、三字节中,第二字节是高位地址,第三字节是低位地址。下述指令属于IX2寻址方式。

STA  $280,X  //A中的数存放到以HX+$280为地址的存储器单元中

LDA  $280,X  // 将存储单元HX+$280中的数取至累加器A

特别说明:实际编程时,程序员不必考虑是八位偏移量变址方式(IX1)还是十六位偏移量变址方式(IX2),汇编程序会自动识别,主要区别在于汇编产生的指令长度不一样。

(8) 相对变址寻址方式(REL Relative addressing mode)

相对变址只用于转移指令。当转移条件满足时,CPU将指令中的偏移量和程序计数器 PC的内容相加,得出转移的目的地址。如果转移条件不满足,则CPU执行下一条指令。转移指令中的偏移量是带符号的,且用1字节表示,因此转移指令的偏移量为-128~+127。偏移量用二进制补码表示。相对变址转移指令的转移范围在下一条指令地址的-128+127之间。下述指令属于REL寻址方式。

BRA  A1   //无条件转向标号A1处执行

BSR  L1   //调用标号L1处的子程序

特别说明:以上八种寻址方式在M68HC05系列中也具有,以下八种为M68HC08系列单片机新增的寻址方式,其中912为存储器到存储器的数据传送寻址方式,1314是含有加1的变址寻址,1516为堆栈寻址。

(9) 存储器:直接地址—直接地址寻址方式(DDDirect to direct addressing Mode)

在存储器的四种数据直接传送的寻址方式中,欲传送的数据直接从源存储单元送向目的存储单元,勿需寄存器中转。在本寻址方式中,源地址与目标地址由指令直接给出。只有一条指令为DD寻址方式:

MOV  N1,N2  //把内存变量N1赋值给内存变量N2

等同于下列两条指令,但上述指令不影响累加器A

LDA  N1

STA  N2

等同于C语言语句:

N2=N1;

特别说明:这里设N1N2为内存变量,下同。内存变量的声明方法,将在5.5节中讲述。

(10) 存储器:直接地址—变址、变址加1的寻址方式(DIX+Direct to indexed with post increment addressing Mode)

源地址为直接地址,目标地址在HX中。把源地址的数据存至目标地址后,HX+1HX。仅有一条指令为DIX+寻址方式。

MOV  $80,X+ //($80)(HX),HX+1HX

等同于下列三条,但上述指令不影响累加器A,主要用于内存或端口数据填充一个表格。

LDA  $80    //($80)A

STA  ,X     //A(HX)

AIX  #1     //HX+1HX

特别说明:操作说明栏中,($80)表示地址为$80的内存单元内容。(HX)表示地址为HX值的内存单元。若内存单元作为源操作数,表示从该内存单元中取数,若内存单元作为目的操作数,表示将数存至该内存单元。

(11) 存储器:立即数—直接地址寻址方式(IMDImmediate source to direct destination addressing Mode)

该寻址方式,将立即数存入直接地址,指令给出的地址即作为目的地址,在指令书写中,立即数位于直接地址之前,下述指令为IMD寻址方式。

MOV  #86,N1    //将立即数#86赋值给内存变量N1

等同于C语言语句:

N1=86;

(12) 存储器:变址—直接地址、变址加1的寻址方式(IX+DIndexed with post increment to direct addressing Mode)

HX为源地址,直接地址为目的地址,把源地址的数据存至目标地址后,HX+1HX。仅有一条指令为IX+D寻址方式。

MOV  X+,$80  //(HX)($80),HX+1HX

等同于下列三条指令,但上述指令不影响累加器A,主要用于向端口传送内存数据块。

LDA  ,X      //(HX)A

STA  $80     //A($80)

AIX  #1      //HX+1HX

(13) 无偏移量变址、变址加1寻址方式(IX+Indexed,no offset, post increment addressing mode)

在这种寻址方式与无偏移量变址寻址方式IX的区别在于,在本寻址方式中多了HX+1HX的操作。只有一条指令属于IX+寻址方式,该指令先完成比较操作,但不论条件是否满足,均有HX+1HX。通常用于寻找一段存储区中是否有与A中相等的数。

CBEQ  X+,rel  //A=(HX)则转移,同时HX+1HX

(14) 八位偏移量变址、变址加1寻址方式(IX1+Indexed, 8-bit offset, post increment addressing mode)

与上条指令的差别是:目的操作数的地址为8位直接地址+(HX),属于IX+寻址方式的指令也只有一条。

CBEQ  addr8,X+,rel //A=(HX+addr8)则转移,同时HX+1HX

(15) 八位偏移量堆栈寻址方式(SP1Stack pointer,8-bit offset addressing mode)

8位偏移量堆栈寻址,是将指令给出的8位直接地址与堆栈指针SP相加形成操作数的地址,下列指令属于SP1寻址方式。

LDA  2,SP      //(2+SP) A

由于M68HC08系列单片机的堆栈方向是向地址更低的方向堆放,那么从堆栈指针初始化处至堆栈指针处便是实际使用的堆栈空间,利用带有偏移量的堆栈寻址,可以直接取出堆栈空间中的数据,无需通过出栈操作。利用该方式取出堆栈中数据,且不改变堆栈的数据结构。主要用于子程序中开辟局部变量,这种寻址方式,增强了对C语言的支持。在讲子程序规范时,会对此用法做详细说明。

(16) 十六位偏移量堆栈寻址方式(SP2Stack pointer,16-bit offset addressing mode)

16位偏移量堆栈寻址,将指令给出的16位直接地址与堆栈指针SP相加形成操作数的地址,下列指令属于SP2寻址方式。

LDA  $130,SP      //将地址$130+SP中的数取至A

特别说明:实际编程时,程序员不必考虑8位偏移量堆栈寻址还是16位偏移量堆栈寻址,汇编程序会自动识别,它们的主要区别在于汇编产生的指令长度不一样。


TAG:

 

评分:0

我来说两句

Open Toolbar