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

下载本文档

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

文档简介

第3章ARM指令集寻址方式ARM嵌入式系统结构与编程内容提要3.1ARM指令的编码格式3.2数据处理指令寻址方式3.3Load/Store指令寻址3.4批量Load/Store指令寻址方式3.5协处理器指令寻址方式第3章ARM指令集寻址方式ARM指令寻址方式可分为四大类:数据处理指令寻址Load/Store指令的寻址批量Load/Store指令的寻址协处理指令寻址3.1ARM指令的编码格式每条ARM指令占有4个字节,其指令长度为32位

cond(bit[31:28])

指令执行的条件码type(bit[27:26]) 指令类型码

opcode(bit[24:21]) 指令操作码;

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

Rn

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

Operand2(bit[11:0) 指令第二个操作数。ARM汇编指令语法格式:<opcode>{<cond>}{S}<Rd>,<Rn>,<operand2>例:ADDR0,R1,R2;R0R1+R2

MULSR3,R2,R1

;R3R2×R1,同时设置CPSRtype(bit[27:26])描述00数据处理指令及杂类Load/Store指令01Load/Store指令10批量Load/Store指令及分支指令11协处理指令与软中断指令指令条件码0000EQ相等 Z=10001NE不相等 Z=00010CS/HS无符号大于等于 C=10011CC/LO无等号小于 C=00100MI负数 N=10101PL非负数 N=00110VS上溢出 V=10111VC没有上溢出 V=01000HI无符号数大于 C=1且Z=01001LS无符号小于等于C=0或Z=11010GE有符号数大于等于 N=1且V=1或N=0且V=01011LT有符号数小于 N=1且V=0或N=0且V=11100GT有符号数大于 Z=0且N=V1101LE有符号数小于/等于 Z=1或N!=V1110AL无条件执行3.2数据处理指令寻址方式数据处理指令第2操作数的构成方式具体寻址类型数据处理指令第2操作数的构成方式立即数方式每个立即数由一个8位的常数进行32位循环右移偶数位得到,其中循环右移的位数由一个4位二进制的两倍表示。即:<immediate>=immed_8进行32位循环右移(2*rotate_4)位在ARM数据处理指令中,当参与操作的第2操作数为立即数时,每个立即数都是采用一个8bit的常数循环右移偶数位而间接得到,其中循环右移的位数由一个4bit二进制的两倍表示。注意,如果一个32bit立即数直接用在32bit指令编码中,就有可能完全占据32bit编码空间,而使指令的操作码等无法在编码中实现。如何判断一个数是否是合法立即数首先将这个数转换为32bit16进制形式,例如218=0xDA=0x000000DA除零外,仅有一位数为合法立即数。除零外,仅有二位数,并且相邻(包括首尾,如0x1000000A)的为合法立即数。除零外,仅有三位数,并且相邻(包括中间有0相间,例如0x10800000,包括首尾相邻,如:0x14000003),这三位数中,最高位取值仅能为1、2、3,最低位取值仅能为4、8、C,中间位0x0~0xF。这种组合的为合法立即数。除了以上三种,其他基本是非法立即数。判断一个数是否符合8位位图的原则,首先看这个数的二进制表示中1的个数是否不超过8个.如果不超过8个,再看这n个1(n<=8)是否能同时放到8个二进制位中,如果可以放进去,再看这八个二进制位是否可以循环右移偶数位得到我们欲使用的数.如果可以,则此数符合8位位图原理,是合法的立即数.否则,不符合。无法表示的32位数,只有通过逻辑或算术运算等其它途径获得了.比如0xffffff00,可以通过0x000000ff按位取反得到。编程中,时刻检查用到的第二操作数是否符合8位位图是一件不能疏忽的事。3.2数据处理指令寻址方式数据处理指令第2操作数的构成方式:立即数方式寄存器方式寄存器移位方式具体寻址类型1.第二操作数为立即数汇编语法格式:#<immediate>例:MOVR0,#0xFC0;R00xFC0

2.第二操作数为寄存器汇编语法格式:<Rm>例:ADDR0,R1,R2;R0R1+R23.第二操作数为寄存器移位方式,且移位的位数为一个5位的立即数汇编语法格式:<Rm>,<shift>#<shift_imm>例:MOVR0,R0,LSL#n;R0R0*2n其中,shift表示移位类型编码,bit5用H表示,bit6用S表示,其描述如表SH描述00逻辑左移LSL01逻辑右移LSR10算术右移ASR11循环右移ROR4.第二操作数为寄存器移位方式,且移位数值放在寄存器中汇编语法格式:<Rm>,<shift><Rs>5.第二操作数为寄存器进行RRX移位得到汇编语法格式:<Rm>,RRX3.3Load/Store指令寻址Load/Store指令是对内存进行存储/加载数据操作的指令,根据访问的数据格式的不同,将这类指令的寻址分为字、无符号字节的Load/Store指令寻址和半字、有符号字节Load/Store指令寻址两大类。地址计算方法

1.寄存器间接寻址

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

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

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

2.基址加变址寻址基址加变址寻址即将寄存器的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。常用于访问某基地址附近的地址单元。LDRR0,[R1,#4];R0←[R1+4]

LDRR0,[R1,#4]!;R0←[R1+4],R1=R1+4LDRR0,[R1],#4;R0←[R1],R1=R1+4LDRR0,[R1,R2];R0←[R1+R2]

根据访问存储单元和基地址寄存器更新的先后顺序可以将基址加变址寻址分为两种(1)前变址法,基地址寄存器中的值和地址偏移量先做加减运算,生成的操作数作为内存访问的地址。(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>]!1.Addressing_mode中的偏移量为立即数例:LDRR0,[R1,#4];R0←[R1+4]

LDRR0,[R1,#-4];R0←[R1-4]LDRR0,[R1,#4]!;R0←[R1+4],R1=R1+4LDRR0,[R1],#4;R0←[R1],R1=R1+42.Addressing_mode中的偏移量为寄存器的值前变址不回写形式:[<Rn>,+/-<Rm>]前变址回写形式: [<Rn>,+/-<Rm>]!后变址回写形式: [<Rn>],+/-<Rm>偏移量为寄存器的指令编码类型对应关系WP 汇编语法格式01 [<Rn>,+/-<Rm>]10 [<Rn>],+/-<Rm>11 [<Rn>,+/-<Rm>]!2.Addressing_mode中的偏移量为寄存器的值例:LDRR0,[R1,R2];R0←[R1+R2]LDRR0,[R1,-R2];R0←[R1-R2]LDRR0,[R1,R2]!;R0←[R1+R2],R1=R1+R2LDRR0,[R1],R2;R0←[R1],R1=R1+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]!3.Addressing_mode中的偏移量通过寄存器移位得到例:LDRR0,[R1,R2,LSL#2];R0←[R1+R2*4]LDRR0,[R1,R2,LSL#2]!;R0←[R1+R2*4],

;且R1=

R1+R2*4LDRR0,[R1],R2,LSL#2;R0←[R1],

;且R1=

R1+R2*4半字、有符号字节寻址这类指令可用来加载有符号字节、加载有符号半字、加载/存储无符号半字。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>]!1.Addressing_mode中的偏移量为立即数 LDRSBR0,[R1,#4];R0←[R1+4]字节,R0有符号扩展为32位

LDRHR2,[R1,#-4];R2←[R1-4]半字,R2高16位清零STRHR0,[R1,#4]!;[R1+4]←R0低16位,R1=R1+4LDRSHR0,[R1],#4;R0←[R1]半字,R0有符号扩展为32位

;且R1=R1+42.Addressing_mode中的偏移量为寄存器的值 前变址不回写形式: [<Rn>,+/-<Rm>]前变址回写形式: [<Rn>,+/-<Rm>]!后变址回写形式:

[<Rn>],+/-<Rm>偏移量为寄存器值的指令编码类型对应关系WP 汇编语法格式01 [<Rn>,+/-<Rm>]10 [<Rn>],+/-<Rm>11 [<Rn>,+/-<Rm>]!2.Addressing_mode中的偏移量为寄存器的值LDRSBR0,[R1,R5];R0←[R1+R5]字节,R0有符号扩展为32位

LDRHR2,[R1,-R5];R2←[R1-R5]半字,R2高16位清零STRHR0,[R1,R5]!;[R1+R5]←R0低16位,R1=R1+R5LDRSHR0,[R1],R5;R0←[R1]半字,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;

LDM{<cond>}<addr_mode><Rn>{!},<register>{^}STM{<cond>}<addr_mode><Rn>{!},<register>{^}堆栈操作满堆栈(FullStack):当堆栈指针指向最后压入堆栈的数据时;空堆栈(EmptyStack):当堆栈指针指向下一个将要放入数据的空位置时;根据堆栈的生成方式,又可以分为递增堆栈和递减堆栈:递增堆栈(AscendingStack):当堆栈由低地址向高地址生成时;递减堆栈(DecendingStack):当堆栈由高地址向低地址生成时;满递增堆栈FA满递减堆栈FD空递增堆栈EA空递减堆栈EDLDM{<cond>}<addr_mode><Rn>{!},<register>{^}STM{<cond>}<addr_mode><Rn>{!},<register>{^}堆栈操作满堆栈(FullStack):当堆栈指针指向最后压入堆栈的数据时;空堆栈(EmptyStack):当堆栈指针指向下一个将要放入数据的空位置时;根据堆栈的生成方式,又可以分为递增堆栈和递减堆栈:递增堆栈(AscendingStack):当堆栈由低地址向高地址生成时;递减堆栈(DecendingStack):当堆栈由高地址向低地址生成时;块拷贝与栈操作的对应关系STMIAR9!,{R0,R1,R5}STMIBR9!,{R0,R1,R5}STMDAR9!,{R0,R1,R5}STMDBR9!,{R0,R1,R5}例:LDMIAR0,{R5-R8}

;将内存单元[R0]~[R0+15]以字为单位读到R5~R8中STMFDR13!,{R0,R3-R10,LR}

;将寄存器(R0,R3-R10,LR)内容压入堆栈LDMFDR13!,{R0,R3-R10,PC};将堆栈内容恢复到寄存器(R0,R3-R10,PC)3.5协处理器指令寻址方式<opcode>{<cond>}{L}<coproc>,<CRd>,<addressing_mode>其中:opcode为指令操作码;coproc为协处理器名称;addressing_mode为指令寻址模式。CRd作为目标寄存器的协处理器寄存器。1.内存地址索引格式前变址不回写形式: [<Rn>,#+/-<imm_offset8>*4]前变址回写形式: [<Rn>,#+/-<imm_offset8>*4]!后变址回写形式: [<Rn>],#+/-<imm_offset8>*42.内存地址非索引格式这种指令寻址汇编语法格式为[<Rn>],<user-define> 协处理器数据处理指令的寻址方式协处理器数据处理指令的寻址方式主要通过寄存器寻址,根据寄存器编码来查找相应的寄存器,这部分内容在指令系统中进行详细介绍。例:LDCP3

,CR4

,[R0];将ARM处理器的寄存器R0所指向;的存储器的字数据传送到协处理器P3的CR4寄存器中STCP5,CR1,[R0,#4];将协处理器P5的CR1寄存器的值;写入到ARM处理器的寄存器R0+4所指向的存储器的字数据单元寻址方式举例1.立即寻址ADDR0,R0,#1 ;R0R0+1ANDR8,R7,#0xFF;R8 R7AND0xFF2.寄存器寻址ADDR0,R1,R2 ;R0R1+R2ADDR3,R2,R1,LSR#2;R3R2+R1/4ADDR3,

温馨提示

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

评论

0/150

提交评论