第3章 ARM指令集寻址方式_第1页
第3章 ARM指令集寻址方式_第2页
第3章 ARM指令集寻址方式_第3页
第3章 ARM指令集寻址方式_第4页
第3章 ARM指令集寻址方式_第5页
已阅读5页,还剩66页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章ARM指令集寻址方式ARM指令寻址方式可分为四大类:数据处理指令寻址Load/Store指令的寻址批量Load/Store指令的寻址协处理指令寻址。内容提要3.1ARM指令的编码格式3.2数据处理指令寻址方式3.3Load/Store指令寻址3.4批量Load/Store指令寻址方式3.5协处理器指令寻址方式3.1ARM指令的编码格式一般编码格式指令条件码一般编码格式每条ARM指令占有4个字节,其指令长度为32位cond(bit[31:28]) 指令执行的条件码;type(bit[27:26]) 指令类型码cond(bit[31:28]) 指令执行的条件码;type(bit[27:26]) 指令类型码cond(bit[31:28]) 指令执行的条件码;type(bit[27:26]) 指令类型码cond(bit[31:28]) 指令执行的条件码;type(bit[27:26]) 指令类型码cond(bit[31:28]) 指令执行的条件码;type(bit[27:26]) 指令类型码cond(bit[31:28]) 指令执行的条件码;type(bit[27:26]) 指令类型码cond(bit[31:28])

指令执行的条件码type(bit[27:26]) 指令类型码I(bit[25])第二操作数类型标志码。数据处理指令中I=1表示第二操作数是立即数,I=0表示第二操作数是移位寄存器opcode(bit[24:21]) 指令操作码;

S (bit[20]) 决定指令的操作结果是否影响CPSR;

Rn

(bit[19:16]) 包含第一个操作数的寄存器编码;Rd(bit[15:12]) 目标寄存器编码;

Operand2(bit[11:0) 指令第二个操作数。Type描述00数据处理指令及杂类Load/Store指令01Load/Store指令

10批量Load/Store指令及分支指令

11协处理器指令与软中断指令指令条件码1111 NV 从不执行(不要使用) 条件码助记符后缀标志含义0000EQZ置位相等0001NEZ清零不相等0010CSC置位无符号数大于或等于0011CCC清零无符号数小于0100MIN置位负数0101PLN清零正数或零0110VSV置位溢出0111VCV清零未溢出1000HIC置位Z清零无符号数大于1001LSC清零Z置位无符号数小于或等于1010GEN等于V带符号数大于或等于1011LTN不等于V带符号数小于1100GTZ清零且(N等于V)带符号数大于1101LEZ置位或(N不等于V)带符号数小于或等于1110AL忽略无条件执行C代码:if(a>b)a++;elseb++;对应的汇编代码:CMP R0,R1;R0与R1比较ADDHIR0,R0,#1;若R0>R1,则R0=R0+1ADDLSR1,R1,#1;若R0≤R1,则R1=R1+1示例:条件码ARM汇编指令语法格式:<opcode>{<cond>}{S}<Rd>,<Rn>,<operand2>注:在上面的基本格式中,“<>”符号内的项是必需的,“{}”符号内的项是可选的。例如,<opcode>是指令助记符,这是必须书写的;而{<cond>}为指令执行条件,是可选项。若不书写,则使用默认条件AL(无条件执行)。3.2数据处理指令寻址方式数据处理指令第2操作数的构成方式具体寻址类型

数据处理指令第2操作数的构成方式立即数方式每个立即数由一个8位的常数进行32位循环右移偶数位得到,其中循环右移的位数由一个4位二进制的两倍表示。即:<immediate>=immed_8进行32位循环右移(2*rotate_4)位√可以由0x4A循环右移10位得到×2.请列举2个立即数?

思考与练习?1.以下8位立即数是否合法?0x0103C0000x128000000x4000003B(0xED循环右移2位)0x0016C000(0x5B循环右移18位)例题:SUBS R0,R0,#1;R0减1,结果放入R0,并且影响标志位MOV R0,#0xFF000;将立即数0xFF000装入R0寄存器注:立即数要以“#”号为前缀,16进制数值时以“0x”表示寄存器方式 操作数即为寄存器的数值 如: MOVR3,R2ADDR0,R1,R2寄存器移位方式 操作数为寄存器的数值做相应的移位而得到。在ARM指令中移位操作包括逻辑左移、逻辑右移、算术左移、算术右移、循环右移和带扩展的循环右移

例 MOV R0,R2,LSL#3

;R2的值左移3位,结

;果放入R0,;即是R0=R2×8 ANDS R1,R1,R2,LSLR3

;R2的值左移R3位,

;然后和R1相,“与”操作,结果放入R1具体寻址类型

1.第二操作数为立即数汇编语法格式:#<immediate>例:MOVR0,#0xFC02.第二操作数为寄存器汇编语法格式:<Rm>例:ADDR0,R1,R23.第二操作数为寄存器移位方式,且移位的位数为一个5位的立即数汇编语法格式:<Rm>,<shift>#<shift_imm>例:MOVR0,R0,LSL#nshift表示移位类型编码SH描述00LSL01LSR10ASR11ROR4.第二操作数为寄存器移位方式,且移位数值放在寄存器中汇编语法格式:<Rm>,<shift><Rs>例:

ANDSR1,R1,R2,LSLR3;R2的值左移R3位,与R1相“与”,结果放入R15.第二操作数为寄存器进行RRX移位得到汇编语法格式:<Rm>,RRX指令中operand2为寄存器Rm中的数值进行带扩展的循环右移一位,C位填补空位,C位用移出的位代替3.3Load/Store指令寻址Load/Store指令是对内存进行存储/加载数据操作的指令,根据访问的数据格式的不同,将这类指令的寻址分为字、无符号字节的Load/Store指令寻址和半字、有符号字节Load/Store指令寻址两大类。

ARM微处理器内部没有RAM,而ARM除了寄存器(即R0~R15)外没有别的存储单元;在以ARM为核的嵌入式系统中,所有的外围模块都和存储单元一样,是ARM微处理器的不同的地址单元。不管这些模块的功能如何(如输入/输出、定时器、存储器等),也不管这些模块的位置如何(如片内或片外),ARM微处理器都把它们看作是外部存储器。其操作过程和对存储器的操作是相同的。因此,在ARM微处理器的数据传送中,数据的源和数据的目标只有两种:一种是ARM的寄存器R0~R15;另一种就是外部存储器(它们可能是外围模块的寄存器、外部数据存储器或可访问的程序存储器等)。我们把数据从存储器到寄存器的传送叫加载,数据从寄存器到存储器的传送叫存储。存储器寄存器(R0-R15)ARM微处理器外围模块或芯片存储加载3.3.1地址计算方法

1.寄存器间接寻址

寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。例如以下指令:

LDR R0,[R1] ;R0←[R1]

STR R0,[R1] ;[R1]←R0

0x55R0R20x400000000xAA0x40000000LDRR0,[R2]0xAA2.基址加变址寻址 前变址法:基地址寄存器中的值和地址偏移量先作加减运算,生成的操作数作为内存访问的地址。 后变址法:将基地址寄存器中的值直接作为内存访问的地址进行操作,内存访问完毕后基地址寄存器中的值和地址偏移量作加减运算,并更新基地址寄存器。前变址寻址:

LDR R2,[R3,#0x0C] ;读取R3+0x0C地址上的存储单元

;的内容,放入R2STR R1,[R0,#-4]! ;先R0=R0-4,然后把R0的值寄存

;到保存到R1指定的存储单元0x55R2R30x400000000xAA0x4000000CLDRR2,[R3,#0x0C]0xAA将R3+0x0C作为地址装载数据后变址寻址:

LDR R0,[R1],#4;R0=[R1],R1=R1+4 LDRR0,[R1,R2];R0=[R1+R2]3.3.2字、无符号字节寻址汇编指令语法格式为:LDR{<cond>}{B}{T}<Rd>,<addressing_mode>STR{<cond>}{B}{T}<Rd>,<addressing_mode>1.Addressing_mode中的偏移量为立即数前变址不回写形式:[<Rn>,#+/-<immed_offset>]前变址回写形式: [<Rn>,#+/-<immed_offset>]!后变址回写形式: [<Rn>],#+/-<immed_offset>偏移量为立即数的指令编码类型WP 汇编语法格式01 [<Rn>,#+/-<immed_offset>]10 [<Rn>],#+/-<immed_offset>11 [<Rn>,#+/-<immed_offset>]!例:LDRR0,[R1,#4];R0[R1+4]LDRR0,[R1,#—4];R0[R1-4]LDRR0,[R1,#4]!;R0[R1+4]同时R1R1+4LDRR0,[R1],#4;R0[R1]同时R1R1+42.Addressing_mode中的偏移量为寄存器的值前变址不回写形式:[<Rn>,+/-<Rm>]前变址回写形式: [<Rn>,+/-<Rm>]!后变址回写形式: [<Rn>],+/-<Rm>偏移量为寄存器的指令编码类型对应关系WP 汇编语法格式01 [<Rn>,+/-<Rm>]10 [<Rn>],+/-<Rm>11 [<Rn>,+/-<Rm>]!例:LDRR0,[R1,R2];R0[R1+R2]LDRR0,[R1,#—R2];R0[R1-R2]LDRR0,[R1,R2]!;R0[R1+R2]同时R1R1+R2LDRR0,[R1],R2;R0[R1]同时R1R1+R23.Addressing_mode中的偏移量通过寄存器移位得到前变址不回写形式:[<Rn>,+/-<Rm>,<shift>#shift_amount]前变址回写形式: [<Rn>,+/-<Rm>,<shift>#shift_amount]!后变址回写形式:[<Rn>],+/-<Rm>,<shift>#shift_amount偏移量为移位寄存器的指令编码类型对应关系WP 汇编语法格式01 [<Rn>,+/-<Rm>,<shift>#shift_amount]10 [<Rn>],+/-<Rm>,<shift>#shift_amount11 [<Rn>,+/-<Rm>,<shift>#shift_amount]!例:LDRR0,[R1,R2,LSL#2];R0[R1+R2*4]LDRR0,[R1,R2,LSL#2]!;R0[R1+R2*4]同时R1R1+

;R2*4LDRR0,[R1],R2LSL#2;R0[R1]同时R1R1+R2*43.3.3半字、有符号字节寻址这类指令可用来加载有符号字节、加载有符号半字、加载/存储无符号半字。又称为杂类Load/Store指令Load/Store指令对半字、有符号字节操作指令编码格式如下:加载有符号字节到寄存器:LDR{<cond>}SB<Rd>,<addressing_mode>加载有符号半字到寄存器:LDR{<cond>}SH<Rd>,<addressing_mode>加载无符号半字到寄存器:LDR{<cond>}H<Rd>,<addressing_mode>存储无符号半字到内存: STR{<cond>}H<Rd>,<addressing_mode>1.Addressing_mode中的偏移量为立即数 前变址不回写形式:[<Rn>,#+/-<immed_offset8>]前变址回写形式:[<Rn>,#+/-<immed_offset8>]!后变址回写形式: [<Rn>],#+/-<immed_offset8>偏移量为立即数的指令编码类型WP 汇编语法格式01 [<Rn>,#+/-<immed_offset8>]10 [<Rn>],#+/-<immed_offset8>11 [<Rn>,#+/-<immed_offset8>]!例:LDRSBR0,[R1,#4];[R1+4]单元字节送R0,R0有符号扩展为32位LDRHR2,[R1,#-4];[R1-4]单元半字送R2,R2的高16位清零STRHR0,[R1,#4]!;R0低16位送[R1+4],同时R1=R1+4LDRSHR0,[R1],#4;[R1]半字送R0且R0有符号扩展为32位,;R1=R1+42.Addressing_mode中的偏移量为寄存器的值 前变址不回写形式: [<Rn>,+/-<Rm>]前变址回写形式: [<Rn>,+/-<Rm>]!后变址回写形式:

[<Rn>],+/-<Rm>偏移量为寄存器值的指令编码类型对应关系WP 汇编语法格式01 [<Rn>,+/-<Rm>]10 [<Rn>],+/-<Rm>11 [<Rn>,+/-<Rm>]!例:LDRSBR0,[R1,R5];[R1+R5]单元字节送R0,R0有符号扩展为32位LDRHR2,[R1,-R5];[R1-R5]单元半字送R2,R2的高16位清零STRHR0,[R1,R5]!;R0低16位送[R1+R5],同时R1=R1+R5LDRSHR0,[R1],R5;[R1]半字送R0且R0有符号扩展为32位,;R1=R1+R53.4批量Load/Store指令寻址方式ARM指令系统提供了批量Load/Store指令寻址方式,即通常所说的多寄存器寻址,也就是一次可以传送几个寄存器的值,允许一条指令最多传送16个寄存器。编码格式批量加载:LDM{<cond>}<addr_mode><Rn>{!},<register>{^}批量存储:STM{<cond>}<addr_mode><Rn>{!},<register>{^}register_list表示要加载或存储的寄存器列表,bit[15:0]可以表示16个寄存器,如果某位为1,则该位的位置作为寄存器的编号,此寄存器参预加载或存储。S用于恢复CPSR和强制用户位。当程序计数器PC包含在LDM指令的register_list中,且S为1时,则当前模式的SPSR被拷贝到CPSR中,使处理器的程序返回和状态的恢复成为一个原子操作。如果register_list中不包含程序计数器PC,S为1则加载或存储的是用户模式下的寄存器组。注意事项:*指令中寄存器和连续内存地址单元的对应关系:编号低的寄存器对应内存低地址单元,编号高的寄存器对应内存高地址单元。内存操作

后增IA(IncrementAfter):每次数据传送后地址加4;先增IB(IncrementBefore):每次数据传送前地址加4;后减DA(DecrementAfter):每次数据传送后地址减4;先减DB(DecrementBefore):每次数据传送前地址减4;

它们与指令编码中P、U的对应关如下表所示LDM/STM的地址变化方式addr_mode P U D A 0 0I A 0 1D B 1 0 I B 1 1堆栈操作堆栈是一种数据结构,按先进后出(FirstInLastOut,FILO)的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(FullStack);而当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈(EmptyStack)。同时,根据堆栈的生成方式,又可以分为递增堆栈(AscendingStack)和递减堆栈(DecendingStack),当堆栈由低地址向高地址生成时,称为递增堆栈,当堆栈由高地址向低地址生成时,称为递减堆栈。栈顶SP

栈顶SP

栈底空堆栈栈底满堆栈0x123456780x12345678栈顶SP

0x12345678栈顶SP

压栈压栈四种类型的堆栈工作方式ARM微处理器支持这四种类型的堆栈工作方式,即:满递增方式FA(FullAscending):堆栈指针指向最后入栈的数据位置,且由低地址向高地址生成。满递减方式FD(FullDecending):堆栈指针指向最后入栈的数据位置,且由高地址向低地址生成。空递增方式EA(EmptyAscending):堆栈指针指向下一个入栈数据的空位置,且由低地址向高地址生成。空递减方式ED(EmptyDecending):堆栈指针指向下一个入栈数据的空位置,且由高地址向低地址生成。堆栈寻址指令举例:STMFDSP!,{R1-R7,LR};将R1~R7、LR入栈。满递减堆栈LDMFDSP!,{R1-R7,LR};数据出栈,放人R1~R7、LR寄存器。满递减堆栈块拷贝与栈操作的对应关系

例:LDMIAR0,{R5-R8}功能:将内存[R0]~[R15]以字为单位读取到R5~R8中,低地址对应低编号寄存器3.5协处理器指令寻址方式协处理器加载/存储指令的寻址方式

协处理器数据处理指令的寻址方式<opcode>{<cond>}{L}<coproc>,<CRd>,<addressing_mode>其中:opcode为指令操作码;coproc为协处理器名称;addressing_mode为指令寻址模式。1.内存地址索引格式前变址不回写形式: [<Rn>,#+/-<imm_offset8>*4]前变址回写形式: [<Rn>,#+/-<imm_offset8>*4]!后变址回写形式: [<Rn>],#+/-<imm_offset8>*4cond为执行条件Cp_num为协处理器的编号P=1:前变址=0:后变址U=1:内存地址address为基址寄存器Rn值加上地址偏移量

=0:内存地址address为基址寄存器Rn值减去地址偏移量W=1:基地址寄存器回写=0:基地址寄存器不回写L=1:Load操作

=0:Store操作N:依赖于具体的协处理器,一般表示传输数据的大小CRd作为目标寄存器的协处理器寄存器(1) [<Rn>,#+/-<imm_offset8>*4]第一个内存地址编号为基地址寄存器Rn值加上/减去imm_offset8*4

,后续每一个地址是前一个内存地址加4,直到协处理器发出信号,结束本次数据传输为止。操作伪代码:Ifconditionpassed

(cond)thenIfU==1

adress=Rn+imm_offset8*4Else

adress=Rn-imm_offset8*4

start_address=addre

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论