第3章ARM指令第一部分ARM的寻址方式

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

ARM处理器的寻址方式寻址方式是根据指令中给出的地址码字段来实现寻找真是操作数地址的方式ARM处理器有九种基本的寻址方式寄存器寻址方式操作数的值在寄存器中,指令中的地址码字段指出的是寄存器的编号,指令执行时直接取出寄存器值操作。寄存器寻址指令举例如下:MOVR1,R2;R2-R1SUBR0,R1,R2;R1-R2-R00xAA0x55R2R1MOVR1,R20xAA立即寻址立即寻址指令中的操作码字段后面的地址码部分就是操作数本身,也就是说,数据就包含在指令当中,取出指令也就取出了可以立即使用的操作数(立即数)。立即寻址指令举例如下:SUBSR0,R0,#1;R0–1-R0MOVR0,#0xff00;0xff00-R0立即数要以“#”为前缀,表示16进制数值时以“0x”表示。0x55R0MOVR0,#0xFF00程序存储MOVR0,#0xFF000xFF00从代码中获得数据寄存器偏移寻址寄存器偏移寻址是ARM指令集特有的寻址方式,当第2操作数是寄存器偏移方式时,第2个寄存器操作数在与第1个操作数结合之前,选择进行移位操作。寄存器偏移寻址方式指令举例如下:MOVR0,R2,LSL#3;R2的值左移3位,结果放入R0,即R0=R2*8ANDSR1,R1,R2,LSLR3;R2的值左移R3位,然后和R1相与操作,结果放入R10x55R0R20x01MOVR0,R2,LSL#30x080x08逻辑左移3位寄存器间接寻址寄存器间接寻址指令中的地址码给出的是一个通用寄存器编号,所需要的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针。寄存器间接寻址指令举例如下:LDRR1,[R2];将R2中的数值作为地址,取出此地址中的数据保存在R1中SWPR1,R1,[R2];将R2的数值作为地址,取出此地址中的数值与R1中的值交换0x55R1R20x400000000xAA0x40000000LDRR1,[R2]0xAA基址寻址基址寻址是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址,基址寻址用于访问基址附近的存储单元,常用于查表,数组操作,功能部件寄存器访问等。基址寻址指令举例如下:LDRR2,[R3,#0x0C];将R3中的数值加0x0C作为地址,取出此地址的数值保存在R2中STRR1,[R0,#-2];将R0中的数值减2作为地址,把R1中的内容保存到此地址位置0x55R2R30x400000000xAA0x4000000CLDRR2,[R3,#0x0C]0xAA将R3+0x0C作为地址装载数据LDRR0,[R1],#4;R0=[R1],R1=R1+4;后索引基址寻址;ARM这种自动索引机制不消耗额外的时间LDRR0,[R1,R2];R0=[R1+R2];基址加索引寻址;多寄存器寻址多寄存器寻址就是一次可以传送几个寄存器值,允许一条指令传送16个寄存器的任何子集或所有寄存器多寄存器寻址指令举例如下:LDMIAR1!,{R2-R4,R6};将R1单元中的数据读出到R2-R4,R6,R1自动加1STMIAR0!,{R3-R6,R10};将R3-R6,R10中的数据保存到R0指向的地址,R0自动加1使用多寄存器寻址指令时,寄存器子集的顺序时由小到大的顺序排列,连续的寄存器可用“-”连接,否则,用“,”分隔书写。0x40000000R1R20x??0x010x400000000x??R3R40x??R60x??0x020x030x040x400000040x400000080x4000000C存储器LDMIAR1!,{R2-R4,R6}0x010x020x030x040x40000000堆栈寻址堆栈是特定顺序进行存取的存储区,操作顺序分为“后进先出”和“先进后出”,堆栈寻址时隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储区域(堆栈),指针所指向的存储单元就是堆栈的栈顶。存储器堆栈可分为两种:向上生长:向高地址方向生长,称为递增堆栈向下生长:向低地址方向生长,称为递减堆栈堆栈指针指向最后压入的堆栈的有效数据项,称为满堆栈堆栈指针指向下一个要放入的空位置,称为空堆栈。这样就有4中类型的堆栈表示递增和递减的满堆栈和空堆栈堆栈分为以下四种类型(FULLUPEMPTYDOWN)①满向上生长型(FA):堆栈按高地址方向生长,当前堆栈指针指向最高有效值;②空向上生长型(EA):堆栈按高地址方向生长,当前堆栈指针指向第一个空值;③满向下生长型(FD):堆栈按低地址方向生长,当前堆栈指针指向最低有效值;④空向下生长型(ED):堆栈按低地址方向生长,当前堆栈指针指向第一个空值。栈底栈顶栈区SP堆栈存储区栈顶栈底栈区SP向下增长向上增长0x123456780x12345678堆栈压栈堆栈压栈栈顶SP栈顶SP栈底空堆栈栈底满堆栈0x123456780x12345678栈顶SP0x12345678栈顶SP压栈压栈栈的各种组合满递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向内含有效数据项的最高地址。指令如LDMFA,STMFA等。空递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向堆栈上的第一个空位置。指令如LDMEA,STMEA等。满递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向内含有效数据项的最低地址。指令如LDMFD,STMFD等。空递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向堆栈下的第一个空位置。指令如LDMED,STMED等。堆栈用一般数据存取L位存取P位前变址/后变址U位加/减空向下生长型(之前增量)LDMEDLDMIB111满向下生长型(之后增量)LDMFDLDMIA101空向上生长型(之前增量)LDMEALDMDB110满向上生长型(之后增量)LDMFALDMDA100满向上生长型(之前增量)STMFASTMIB011空向上生长型(之后增量)STMEASTMIA001空向下生长型(之前增量)STMFDSTMDB010满向下生长型(之后增量)STMEDSTMDA000堆栈寻址指令举例如下:STMFDSP!,{R1-R7,LR};将R1~R7,LR入栈。满递减堆栈。LDMFDSP!,{R1-R7,LR};数据出栈,放入R1~R7,LR寄存器。满递减堆栈。块拷贝寻址块拷贝寻址传送指令用于一块数据从存储器的某一位置拷贝到另一位置。块拷贝寻址指令举例如下:LDMIAR0,{R1-R5};STMIAR1,{R1-R5};STMIAR0!,{R1-R7};将R1~R7的数据保存到存储器中,存储器指针在保存第一;个值之后增加,增长方向为向上增长。STMIBR0!,{R1-R7};将R1~R7的数据保存到存储器中,存储器指针在保存第一个值之前增加,增长方向为向上增长。STMDAR0!,{R1-R7};将R1~R7的数据保存到存储器中,存储器指针在保存第一个值之后增加,增长方向为向下增长。STMDBR0!,{R1-R7};将R1~R7的数据保存到存储器中,存储器指针在保存第一个值之前增加,增长方向为向下增长。相对寻址相对寻址是基址寻址的一种变通,由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。相对寻址指令举例如下:BLROUTE1;调用到ROUTE1子程序BEQLOOP;条件跳转到LOOP标号处…LOOPMOVR2,#2

1 / 18
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功