刘帅嵌入式系统-数据处理指令的操作数的寻址方式

首先,需要纠正一个错误,上次发的文章ARM指令集概要中有说到ARM指令的语法格式,如下图所示:

其中<Rd> <Rn> <shifter_operand>中间之前写成空格了,实际是,他们两者之间均有一个逗号隔开(英文),特在此提出。上图已用红色笔迹标出。其他不变。

现在介绍一下ARM指令的寻址方式,分别有如下几种,之后分别讨论:

1、数据处理指令的操作数的寻址方式

2、字及无符号字节的Load/Store指令的寻址方式

3、杂类Load/Store指令的寻址方式

4、批量Load/Store指令的寻址方式

5、写处理器Load/Store指令寻址方式

首先介绍第一种寻址方式,数据处理指令的操作数的寻址。

通常数据处理指令的格式和上文提到的格式相同,为了方便介绍,再次搬到此处。

<opcode>{<cond>}{S} <Rd>,<Rn>,<shifter_operand>

每部分代表的意思和上面完全相同。数据处理指令的操作数的寻址,顾名思义,介绍的是操作数,即<shifter_operand>的寻址方式。

首先介绍一下<shifter_operand>的格式,有3种格式,如下所示:

1、立即数方式,即一个16进制(可以是其他进制)数。立即数有一定的格式,每个立即数是由一个8位的常数循环右移偶数位得到。可记为:

        立即数 = 8位常数 ROR(2 * 移位数)     ROR:循环右移指令 

因此并不是每一个32位常数都是合法的立即数,只能通过上述的方法得到的才是合法的立即数。但是呢,由于得到立即数的方法种存在循环移位操作,而循环移位操作会影响到cpsr的条件标志C。固,同一个合法的立即数由于不同的编码方式,将会令某些指令产生不同的结果,这是禁止的。因此ARM汇编编译器按照下面的规则来生产立即数编码。

---当立即数数字在0到0xFF范围中时,立即数 = 8位常数,移位数 = 0。

---其他情况下,汇编编译器选择使移位数最小的编码方式。

2、寄存器方式。在寄存器寻址方式下,操作时就是寄存器的数值。

    MOV R3, R2        ;将R2中的值放到R3中  ( 汇编中英文分号为注释的意思。)

3、寄存器移位方式。寄存器移位方式的操作数是寄存器的数值做相应的移位(或循环移位)得到的。移位的方式有下面几种:

    --ASR:算术右移

    --LSL:逻辑左移

    --LSR:逻辑右移

    --ROR:循环右移

    --RRX:扩展的循环右移

例如:    

    MOV R0,R1,LSL #3            ; R0 = R1 * (2*2*2)

数据处理指令操作数的具体寻址方式有11种。

--<immediate>   立即数

--<Rm>              寄存器

--<Rm>,LSL #<shift_imm>  逻辑左移  shifter_imm 代表移位的位数,下同

--<Rm>,LSL <Rs>   Rs为寄存器

--<Rm>, LSR #<shift_imm>  逻辑右移

--<Rm>, LSR <Rs>    逻辑右移寄存器Rs的值的位

--<Rm>, ASR #<shift_imm>  算术右移shift_imm位

--<Rm>, ASR <Rs> 算术右移寄存器Rs 的值的位

--<Rm>, ROR #<shift_imm>  循环右移shifter_imm位

--<Rm>, ROR <Rs>  循环右移寄存器Rs的值的位

--<Rm>, RRX  扩展的循环右移

之后,再详细介绍每种寻址方式。

猜你喜欢

转载自blog.csdn.net/shuai532209720/article/details/88212090