Freescale8位单片机寻址模式什么是寻址?MOV$00,$20指令,源操作数,目标操作数STA$0100,X指令,源操作数(隐含)目标操作数1,目标操作数2什么是寻址模式?寻址模式定义为CPU访问源操作数或目标操作数的方法。HCS08中,所有的存储器,状态和控制寄存器,I/O端口共享一个64Kbyte的线性地址空间,因此一个16位的二进制地址能够唯一确定任何存储器地址。这种排列意味着能够访问RAM中变量的指令能够同样用来访问I/O和控制寄存器。一些指令用到不止一种寻址模式。比如,MOVE指令用一种寻址模式确定源操作数和第二种寻址模式确定目的操作数。对于BRCLR,BRSET,CBEQ和DBNZ这样的指令用一种寻址模式确定测试操作数的位置,然后当测试条件为真,用相关的寻址模式确定分支目的地址。对于BRCLR,BRSET,CBEQ和DBNZ,在指令设置表格中列出的寻址模式是用于访问测试操作数的寻址模式,访问分支目的则需要使用相关寻址模式。不应该说某条指令使用什么寻址模式。因该说某条指令的源操作数使用什么寻址模式,目标操作数使用什么寻址模式。S08的指令的寻址方式可以分为以下几类:1.隐含寻址(Inherent)2.立即寻址(Immediate)3.直接寻址(Direct)4.扩展寻址(Extended)5.变址寻址(Indexed)•无偏移量,8位,16位偏移量•堆栈指针加偏移量寻址•带自动加1的变址寻址6.相对寻址(Relative)7.存储器到存储器寻址方式(MemorytoMemory)•立即数寻址•直接寻址•变址寻址隐含寻址模式(INH)在这种寻址模式中,操作码中已包含源操作数或目标操作数。它可访问累加器,变址寄存器和重要条件寄存器,均为单字节指令?,比如CLRA和DIV。立即寻址模式(IMM)在立即寻址模式中,目标代码中指令的操作数紧跟在存储器中指令代码之后,字节数与寄存器大小一致。而紧跟在指令码后的“#”是说明符,说明后面紧跟的是操作数数值而不是地址。在16位立即操作数的情况下,高位字节位于操作码之后存储空间的下一个字节,低位字节紧接其后。这类指令的长度为2~3字节。LDHX#$010A0AHOP45存储器01低地址高地址X0A01直接寻址模式(DIR)在直接寻址方式中当操作数的有效地址的高位字节为$00时,这个$00无须包含在指令中。当操作数为单字节时,直接寻址指令能访问存储器中最低的256字节。这样节省了指令空间,同时提高了指令的执行速度。这种寻址方式只能对$0000~$00FF内存空间中的操作数进行操作。例如:LDA$08;AOPLDA存储器0A低地址高地址08H0A扩展寻址模式(EXT)在扩展寻址模式下,操作数的全部16位地址位于操作码之后程序存储器的下两个字节(首先是高位字节)。因此,大多数扩展寻址指令为3字节:1字节的操作码,2字节的有效地址。注意:在某些编译器中,在单字节地址前加符号“”表示直接寻址,否则,编译时会在该地址前加上一个$00字节,这样就成了扩展寻址。例如:LDA$50;属于直接寻址LDA$50;汇编时将自动生成两字节操作数$0050,就成了扩展寻址而有的编译器遇到地址高8位为0的情况会自动按直接寻址处理,不需要直接寻址符号“”变址寻址模式(Indexed)1.使用地址寄存器寻址的间接寻址模式。所谓“变址寻址”就是变址寄存器(H:X)的内容加上指令中给定的8位或16位偏移量作操作数的地址。变址寻址又可分为无偏移量,8位偏移量和16位偏移量3种变址寻址模式。(1).无偏移量变址寻址(IX)。无偏移量变址寻址方式实际上就是间接寻址方式。HCS08CPU的变址寄存器扩展到16位,高位称为H寄存器,低位称为X寄存器,允许用户访问64KB的内存空间。如果指令没有修改H寄存器中的内容,则H寄存器中的值将默认为$00,这样就确保了与CPU05指令的完全兼容。无偏移量的变址寻址指令可以移动链表指针,或者锁定一个经常使用的RAM地址或输入,输出地址。它们均为单字节指令。例如:CLR,X;把以变址寄存器(H:X)为地址的存储单元的内容清零注意:CLR,X与CLRX的取别(2).8位偏移量变址寻址(IX1)。在8位偏移量变址寻址方式中,有效地址是无符号的16位变址寄存器(H:X)的内容与操作码后的1字节无符号整数之和。它可用于从一个有N个元素的表中选择第K个元素。这时,K的值放在H:X中,而指令中8位偏移量是首地址。例如:CLR$10,X;把以变址寄存器(H:X)加上$10为地址的单元的内容清零(3).16位偏移量变址寻址(IX2)。16位偏移量变址寻址指令为3字节指令,有效地址为无符号的16位变址寄存器(H:X)的内容与操作码后的2字节16位无符号整数之和。例如:STA$0100,X;把累加器A的内容送到以变址寄存器(H:X)加上$0100为地址的单元内容2.使用堆栈指针的变址寻址方式(SP1,SP2)所谓“用堆栈指针的变址寻址”就是用堆栈指针代替变址寄存器,分为用堆栈指针的8位偏移量变址寻址(SP1)和用堆栈指针的16位偏移量变址寻址(SP2)。由于与堆栈指针相关的指令要求预先访问1字节,因此有的与堆栈指针的指针相关的指令要比同样的变址指令多用1个时钟周期。用堆栈指针的8位偏移量变址寻址指令为3字节指令,功能与8位偏移量变址寻址指令相似。用堆栈指针的8位偏移量变址寻址可以方便地访问堆栈中的数据,有效地址是无符号16位堆栈寄存器的内容与操作码后无符号整数之和。当中断被屏蔽时,这种寻址方式允许堆栈指针寄存器作为第2个变址寄存器用。例如:LDA$88,SP;把(SP)加上$88为地址的单元内容送到累加器A中用堆栈指针的16位偏移量变址寻址方式虽然有,但基本不可能用到。LDA$0100,SP对,但不常用相对寻址模式(REL)相对寻址模式用于确定分支转移指令的目的地址。有符号8位偏移量值位于在操作码之后的存储空间。如果分支条件为真,有符号的偏移量符号扩展为一个16位的值,并加到引导程序继续执行到分支目的地址的程序计数器的当前值。在使用汇编程序时,用户不必自己计算偏移量,汇编程序会计算偏移量,并进行校验,看是否在转移范围内。在HCS08中有4个转移指令(BLT,BGT,BLE,和BGE)是要通过访问标志位N,V,Z来确定相关的符号操作数的值。例:BRALOOP;转移到LOOP标号处BEQ$1102;当条件成立,则转向地址为$1102的程序;否则顺序执行存储器到存储器的寻址方式存储器到存储器的寻址方式有以下4种形式:1.立即数到直接寻址2.直接寻址到直接寻址3.自动变址寻址到直接寻址4.直接寻址到自动变址寻址指令格式MOV源地址,目的地址(1)立即数到直接寻址直接移动立即数寻址为3字节指令,需要4个时钟周期。源地址是一个立即数,通常用来初始化变量和寄存器;操作码后紧跟的操作数将被存储到操作码后第2字节所指的地址中。用这种寻址方式的传送指令不影响累加器的值。例如:MOV#$AA,$00F0;将立即数$AA送到地址$00F0处(2)直接寻址到直接寻址这种寻址方式为3字节指令,需要5个时钟周期,通常用于在存储器间直接移动数据。操作码后第1字节是源操作数的地址,第2字节是目的操作数的地址。用这种寻址方式的传送指令不影响累加器的值。这种寻址方式排除累加器对数据传送的影响,将执行时间从8个时钟周期减少到5个。这种节省使程序可以使用大量寄存器间的数据传送。例如:MOV$00,$20;将地址为$0000的内容送到地址$0020处MOV$0100,$0101?直接寻址(3)自动变址寻址到直接寻址这种寻址方式为2字节指令,执行时间为4个时钟周期,通常用来在直接寻址页中的数据块传送。用这种寻址方式的指令不影响累加器的值。H:X中的内容被存放在直接页中。有效地址由操作码的后继字节给出,移出后,H:X启动加1。例如:MOVX+,$20;将变址寄存器(H:X)为地址的内容送到地址$0020处,然后(H:X)自动加1(4)直接寻址到自动变址寻址这种寻址方式为2字节指令,执行时间为4个时钟周期,通常用于将寄存器的内容填充到直接页中的数据数组。用这种寻址方式不影响累加器的值。移动后,H:X自动加1。例如:MOV$18,X+;将地址为$0018单元的内容送到变址寄存器(H:X)为地址的存储器单元中,然后(H:X)自动加1.INH隐含寻址IMM立即数寻址DIR直接寻址8位地址EXT扩展寻址IX,IX1,IX2使用HX的变址寻址SP1,SP2使用SP的变址寻址REL相对寻址IMD,DD,DIX+,IX+D存储器到存储器寻址