概述
首先,需要纠正一个错误,上次发的文章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 扩展的循环右移
之后,再详细介绍每种寻址方式。
最后
以上就是复杂钢笔为你收集整理的刘帅嵌入式系统-数据处理指令的操作数的寻址方式的全部内容,希望文章能够帮你解决刘帅嵌入式系统-数据处理指令的操作数的寻址方式所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复