ARM指令的寻址方式
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
+[R1 ; 来自百度文库3 R2+[R1] [R1 ;R0 [R1] [R1 ;[R1] R0
6
ARM指令的寻址方式 ARM指令的寻址方式
基址变址寻址
基址变址寻址就是将寄存器(该寄存器一般为基址寄存器) 基址变址寻址就是将寄存器 ( 该寄存器一般为基址寄存器 ) 的内容与 指令中给出的地址偏移量相加,形成操作数的有效地址。 指令中给出的地址偏移量相加,形成操作数的有效地址。基址变址寻址 用于访问基址附近的存储单元,常用于查表、数组操作。 用于访问基址附近的存储单元,常用于查表、数组操作。 基址加偏移寻址 前索引寻址方式:基址需加(或减) 前索引寻址方式:基址需加(或减)偏移来计算访 问的地址。 问的地址。 例如: ,[R1,#4 [R1 例如:LDR R0,[R1,#4] ; R0 [R1+4] 后索引寻址方式:基址不带偏移作为传送的地址, 后索引寻址方式:基址不带偏移作为传送的地址, 传送后自动索引。 传送后自动索引。 例如: ,[R1],#4 [R1 例如:LDR R0,[R1],#4 ; R0 [R1] ; R1 R1+4 指令指定一个基址寄存器,再指定另一个寄存器( 指令指定一个基址寄存器,再指定另一个寄存器(索 ),其值作为位移加到基址上形成存储器地址 其值作为位移加到基址上形成存储器地址。 引),其值作为位移加到基址上形成存储器地址。 例如: 例如:LDR R0,[R1,R2] ; R0 [R1+R2]
个源操作数为一个立即数, 为前缀, 第 2 个源操作数为一个立即数 , 以 “ # ” 为前缀 , 十六进制 值以在“ 后加“ 表示。 值以在“#”后加“0x”表示。 表示
3
ARM指令的寻址方式 ARM指令的寻址方式
寄存器移位寻址
这种寻址方式是ARM指令集特有的, 这种寻址方式是ARM指令集特有的,第2个寄存器操作数在与第1 ARM指令集特有的 个寄存器操作数在与第1 个操作数结合之前,先选择进行移位操作,再结合。 个操作数结合之前,先选择进行移位操作,再结合。 ,R2,R1 ADD R3,R2,R1,LSL #3 ,R2,LSL,#3 MOV R0,R2,LSL,#3 可以采取的移位操作如有: 可以采取的移位操作如有:
基址加索引寻址
7
ARM指令的寻址方式 ARM指令的寻址方式
多寄存器寻址
多寄存器寻址方式就是用一条指令完成多个寄存器值的传送, 多寄存器寻址方式就是用一条指令完成多个寄存器值的传送 , 允许一 条指令完成传送最多16个通用寄存器的值。 16个通用寄存器的值 条指令完成传送最多16个通用寄存器的值。 ; R0 [R1] ; R2 [R1+4] ; R5 [R1+8] 该指令的后缀IA表示在每次执行完加载/存储操作后,R1按字 IA表示在每次执行完加载 该指令的后缀IA表示在每次执行完加载/存储操作后,R1按字 长度增加,指令可将连续存储单元的值送到R0,R2,R5寄存器中。 R0,R2,R5寄存器中 长度增加,指令可将连续存储单元的值送到R0,R2,R5寄存器中。 ; [R1] R0 ; [R1+4] R2 ; [R1+8] R5 该指令的后缀IA表示在每次执行完加载/存储操作后,R1按字 IA表示在每次执行完加载 该指令的后缀IA表示在每次执行完加载/存储操作后,R1按字 长度增加,指令可将R0,R2,R5寄存器的值送到连续存储单元中。 寄存器的值送到连续存储单元中 长度增加,指令可将 寄存器的值送到连续存储单元中。 使用多寄存器寻址指令时,寄存器子集的顺序由小到大的顺序排列, 使用多寄存器寻址指令时 , 寄存器子集的顺序由小到大的顺序排列 , 连续的寄存器可用“ 连接 或用“ 分隔书写 连接, 分隔书写。 连续的寄存器可用“-”连接,或用“,”分隔书写。 8 STMIA R1,{R0,R2,R5} LDMIA R1,{R0,R2,R5}
5
ARM指令的寻址方式 ARM指令的寻址方式
寄存器间接寻址
寄存器间接寻址就是以寄存器中的值作为操作数的地址, 寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作 数保存在寄存器指定地址的存储单元中, 数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地 址指针。 址指针。
,R2,[R1 ADD R3,R2,[R1] [R1 LDR R0,[R1] STR R0,[R1] [R1
12
LSL:逻辑左移( Left)。寄存器中字的低端空出的位补0 )。寄存器中字的低端空出的位补 LSL:逻辑左移(Logical Shift Left)。寄存器中字的低端空出的位补0。
0
; R3 R2+8×R1 ; R0 8×R2
LSR:逻辑右移( Right)。寄存器中字的高端空出的位补0 )。寄存器中字的高端空出的位补 LSR:逻辑右移(Logical Shift Right)。寄存器中字的高端空出的位补0。
2
ARM指令的寻址方式 ARM指令的寻址方式
立即寻址
立即寻址是一种特殊的寻址方式, 立即寻址是一种特殊的寻址方式,指令中在操作码字段后 面的地址码不是通常意义上的操作数地址, 面的地址码不是通常意义上的操作数地址,而是操作数本 这样的数称为操作数。 身。这样的数称为操作数。 ADD R3,R3,#1 ,R3,#1 ,R7,#0 AND R8,R7,#0xff SUB R0,R0,#1 ; R3 R3+1 ; R8 R7[7:0] ;R0 R0-1
ROR:循环右移(Rotate Right)。从字的最低端移出的位填入字的高 Right)。 )。从字的最低端移出的位填入字的高 ROR:循环右移( 端空出的位。 端空出的位。
RRX:扩展的循环右移( place)。 RRX:扩展的循环右移(Rotate Right Extended by 1 place)。 向右移位,只移一位,左侧空位由状态寄存器C位填充, 向右移位,只移一位,左侧空位由状态寄存器C位填充,右侧移出的位 移进状态位C 移进状态位C中。 C
9
ARM指令的寻址方式 ARM指令的寻址方式
堆栈寻址
这样就有4种类型的堆栈工作方式,ARM处理器支持所有这 处理器支持所有这4 这样就有 4 种类型的堆栈工作方式 , ARM 处理器支持所有这 4 种类型的堆 栈工作方式。 栈工作方式。 满递增堆栈:堆栈指针指向最后压入的数据,且由低地址向高地址生成。 满递增堆栈:堆栈指针指向最后压入的数据,且由低地址向高地址生成。 满递减堆栈:堆栈指针指向最后压入的数据,且由高地址向低地址生产。 满递减堆栈:堆栈指针指向最后压入的数据,且由高地址向低地址生产。 空递增堆栈:堆栈指针指向下一个将要放入数据的空位置, 空递增堆栈:堆栈指针指向下一个将要放入数据的空位置,且由低地址向 高地址生成。 高地址生成。 空递减堆栈:堆栈指针指向下一个将要放入数据的空位置, 空递减堆栈:堆栈指针指向下一个将要放入数据的空位置,且由高地址向 低地址生成。 低地址生成。 ;将寄存器列表中的寄存器 将寄存器列表中的寄存器( STMFD R13!,{R0,R2,R5} ;将寄存器列表中的寄存器(R0,R2,R5) 存入堆栈, ;存入堆栈,满递减堆栈 R13!,{R0,R4;将堆栈内容恢复到寄存器 R0,R4-R12) 将堆栈内容恢复到寄存器( LDMEA R13!,{R0,R4-R12} ;将堆栈内容恢复到寄存器(R0,R4-R12) ;空递增堆栈 10
ARM指令的寻址方式 ARM指令的寻址方式
块复制寻址
多寄存器传送指令用于一块数据从存储器的某一个位置复制到另一位置。 多寄存器传送指令用于一块数据从存储器的某一个位置复制到另一位置。
11
ARM指令的寻址方式 ARM指令的寻址方式
相对寻址
相对寻址是变址寻址的一种变通,由程序计数器PC提供基地址。 PC提供基地址 相对寻址是变址寻址的一种变通 ,由程序计数器 PC 提供基地址。 指令中的地址标号作为位移量,两者相加后得到操作数的有效地址。 指令中的地址标号作为位移量 , 两者相加后得到操作数的有效地址 。 位移量指出的是操作数与现行指令之间的相对位置。例如指令: 位移量指出的是操作数与现行指令之间的相对位置。例如指令: BL SUBR … … SUBR PC, MOV PC,R14 转移到SUBR ; 转移到SUBR ; 返回到此 ;子程序入口地址 ;返回
ARM指令的寻址方式 ARM指令的寻址方式
ARM指令的寻址方式
寻址方式是处理器根据指令中给出的地址码字段信息 寻址方式是处理器根据指令中给出的地址码字段信息 来寻找真实操作数物理地址的方式。目前ARM处理器支持9 ARM处理器支持 来寻找真实操作数物理地址的方式。目前ARM处理器支持9 种基本的寻址方式。 种基本的寻址方式。 寄存器寻址 立即寻址 寄存器移位寻址 寄存器间接寻址 变址寻址 多寄存器寻址 堆栈寻址 块复制寻址 相对寻址
0
4
ARM指令的寻址方式 ARM指令的寻址方式
寄存器移位寻址
ASR:算术右移( Right) ASR:算术右移(Arithmetic Shift Right)。算术移位的对象是 带符号数,若源操作数为正数,则字的高端空出的位补0 带符号数,若源操作数为正数,则字的高端空出的位补0。若源操 作数为负数,则字的高端空出的位补1 作数为负数,则字的高端空出的位补1。
ARM指令的寻址方式 ARM指令的寻址方式
堆栈寻址
堆栈是一种数据结构,操作顺序分为“先进后出” FILO) 堆栈是一种数据结构 , 操作顺序分为 “ 先进后出 ” ( FILO ) 和 “ 后进 先出” LIFO) 先出”(LIFO),使用一个成为堆栈指针的专用寄存器指示当前的操作 位置,堆栈指针总是指向栈顶。 位置,堆栈指针总是指向栈顶。 根据增长方向,堆栈可分为: 根据增长方向,堆栈可分为: 向上生长:即向高地址方向生长,称为递增堆栈( 向上生长:即向高地址方向生长,称为递增堆栈(Ascending Stack)。 )。 向下生长:即向低地址方向生长,称为递减堆栈( 向下生长:即向低地址方向生长,称为递减堆栈(Descending Stack)。 ) 根据栈指针的指向位置,堆栈可分为: 根据栈指针的指向位置,堆栈可分为: 满堆栈: 满堆栈:堆栈指针指向最后压入堆栈的有效数据项 空堆栈: 空堆栈:堆栈指针指向下一个数据项放入的空位置
1
ARM指令的寻址方式 ARM指令的寻址方式
寄存器寻址
寄存器中的数值作为操作数, 寄存器中的数值作为操作数,指令中地址码字段给出的是 寄存器编号,指令执行时直接取出寄存器值操作。 寄存器编号,指令执行时直接取出寄存器值操作。 R0,R1, ADD R0,R1,R2 ; R0 R1+R2
该指令的执行效果是将寄存器R1和R2的内容相加,其结 的内容相加, 该指令的执行效果是将寄存器 和 的内容相加 果存放在R0寄存器中 寄存器中。 果存放在 寄存器中。 R1, MOV R1,R2 ; R1 R2 该指令的执行效果是将寄存器R2的内容传送到寄存器 中 该指令的执行效果是将寄存器 的内容传送到寄存器R1中。 的内容传送到寄存器