购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.3 Cortex-M4 的寻址方式

寻址方式是处理器根据指令中给出的地址信息来寻找有效地址的方式,是确定本条指令的数据地址以及下一条要执行的指令地址的方法。在处理器中,操作数或指令字写入或读出的方式包括地址指定方式、相联存储方式和堆栈存取方式。几乎所有的计算机系统,在内存中都采用地址指定方式。当采用地址指定方式时,形成操作数或指令地址的方式称为寻址方式。寻址方式分为两类,即指令寻址方式和数据寻址方式。形成操作数的有效地址的方法称为操作数的寻址方式。

在Cortex-M4 内核的处理器中,与大多数微型计算机系统类似,主要有以下几种寻址方式。

3.3.1 立即数寻址

立即寻址也称为立即数寻址,在立即寻址中的操作码字段后面的地址码部分就是操作数本身,即数据包含在指令当中,取出指令就取出了立即数。

例如:

指令中的第二操作数都是立即数,并以“#”为前缀,对于以十六进制表示的立即数,还要求在“#”后加上“0x”或“&”,需要注意的是,ARM处理器立即数寻址中的立即数是一个有限的数值。

3.3.2 寄存器寻址

寄存器寻址中操作数的值在寄存器中,就是利用指令中的地址码字段指出的寄存器中的数值作为操作数,指令执行时直接取出寄存器值操作。该寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。

例如:

以上指令中,第一条指令是将寄存器R1 和R2 的内容相减,其结果存放在寄存器R0 中,第二条指令是将寄存器R2 的内容存放在寄存器R1 中。

3.3.3 寄存器间接寻址

寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针。例如:

3.3.4 寄存器移位寻址

寄存器移位寻址是ARM指令集特有的寻址方式。当第 2 个操作数是寄存器移位方式时,第 2 个寄存器操作数在与第 1 个操作数结合之前,选择进行移位操作。

例如:

3.3.5 基址寻址

基址寻址就是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址。基址寻址用于访问基址附近的存储单元,常用于查表、数组操作、功能部件寄存器访问等。

例如:

3.3.6 多寄存器寻址

多寄存器寻址一次可传送几个寄存器值,允许一条指令传送 16 个寄存器的任何子集或所有寄存器。多寄存器寻址指令举例如下:

3.3.7 堆栈寻址

堆栈是一种数据结构,按先进后出(First In Last Out,FILO)的方式工作,使用一个称为堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(Full Stack),而当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈(Empty Stack)。同时,根据堆栈的生成方式,又可以分为递增堆栈或升序堆栈(Ascending Stack)和递减堆栈或降序堆栈(Decending Stack),当堆栈由低地址向高地址生成时,称为递增堆栈;当堆栈由高地址向低地址生成时,称为递减堆栈。这样就有 4 种类型的堆栈工作方式,Cortex-M4 微处理器本身的PUSH和POP指令是支持满降序堆栈,由于Cortex M4 还配有了多寄存器加载指令LDM和STM,因此它配以不同的指令后缀组合后就可支持所有这 4 种类型的堆栈工作方式。这里的后缀见表3.3,同一行的几种后缀对应的堆栈属性是一致的。

表3.3 多寄存器处理指令后缀

①满升序:堆栈通过增大存储器的地址向上增长,堆栈指针指向内含有效数据项的最高地址,如图3.3 所示。

②空升序:堆栈通过增大寄存器的地址向上增长,堆栈指针指向堆栈上的第一个空位置,如图3.4 所示。

图3.3 满降序

图3.4 空降序 Htzeg9R9aqLPtmoQLizsHDYcGgrPahpfsXExQAGbU+LoDwrxXhIAEPDX22SRdOLk

点击中间区域
呼出菜单
上一章
目录
下一章
×