[基于Android的ARM汇编语言系列]之四:ARM处理器的寻址方式

作者:郭嘉

邮箱:[email protected]

博客:http://blog.csdn.net/allenwells

github:https://github.com/AllenWell

处理器的寻址方式是通过指令给出的地址码字段来寻找真实操作数地址的方式,ARM处理器支持9中寻址方式。

一 立即寻址

立即寻址指令后面的地址码部分为立即数(常量或常数),立即寻址多用于给寄存器赋值。

举例

MOV RO, #1234

指令执行后,R0=1234。

二 寄存器寻址

寄存器寻址中,操作数在寄存器中,指令执行时直接从寄存器中取值进行操作。

举例

MOV R0, R1

指令执行后,R0=R1。

三 寄存器移位寻址

寄存器移位寻址是ARM指令集特有的寻址方式,和寄存器寻址类似,只是操作前需要对寄存器操作数进行移位操作。

  • LSL:逻辑左移,移位后寄存器空出的低位补0。
  • LSR:逻辑右移,移位后寄存器空出的高位补0。
  • ASR:算术右移,移位过程中,符号位保持不变,如果源操作数是正数,则空出的高位补0,否则补1.
  • ROR:循环右移,移位后移除的低位填入空出的高位。
  • RRX:带扩展的循环右移,操作数右移一位,移位空出的高位用C标志的值填充。

举例

MOV R0, R1, LSL #2

R1寄存器左移两位赋值给R0,指令执行后,R0=R1*4。

四 寄存器间接寻址

寄存器间接寻址中地址码给出的寄存器是操作数的地址指针,所需的操作数保存在寄存器指定的存储单元中。

举例

LDR R0, [R1]

将R1寄存器的数值作为地址,取出此地址中的值赋给R0寄存器。

五 基址寻址

基址寻址是将地址码给出的基址寄存器和偏移量相加,形成操作数的有效地址,所需的操作数保存在有效地址所指向的存储单元中。基址寻址多用于查表和数组访问等操作。

举例

LDR R0, [R1, #-4]

将寄存器R1的数组减去4作为地址,取出此地址中的值赋值给R0。

六 多寄存器寻址

多寄存器寻址一条指令最多可以完成16个通用寄存器的传送。

举例

LDMIA R0, {R1, R2, R3, R4}

LDM是数据加载指令,指令的后缀IA表示每次执行完加载操作后R0寄存器的值自增1个字。指令执行后,R1=[R0],R2=[R0+#4],R3=[R0+#8],R4=[R0+#12]。

七 堆栈寻址

堆栈寻址是ARM处理器特有的一种寻址方式,堆栈寻址使用特定的指令来完成。

  • LDMFA/STMFA
  • LDMEA/STMEA
  • LDMFD/STMFD
  • LDMED/STMED

举例

STMFD SP1, {R1-R7, LR}

将R1-R7,LR入栈,多用于保存子程序现场。

LDMFD SP1, {R1-R7, LR}

将数据出栈,放入R0-R7,LR寄存器,多用于恢复程序现场。

八 块拷贝寻址

块拷贝寻址可实现连续地址数据从存储器的某一位置拷贝到另一位置。

  • LDMIA/STMIA
  • LDMDA/STMDA
  • LDMIB/STMIB
  • LDMDB/STMDB

举例

LDMIA R0!, {R1-R3}

从R0寄存器的存储单元中读取3个字到R1-R3寄存器中。

STMIA R0!, {R1-R3}

存储在R1-R3寄存器的内容到R0指向ed存储单元。

九 相对寻址

相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到的操作数作为有效地址。

举例

BL NEXT
   ...
NEXT:
   ...

BL NEXT是跳到NEXT标号处执行,这里的BL就是采用相对寻址,标号NEXT是偏移量。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-04 12:32:08

[基于Android的ARM汇编语言系列]之四:ARM处理器的寻址方式的相关文章

[基于Android的ARM汇编语言系列]之一:ARM汇编语言开篇

作者:郭嘉 邮箱:[email protected] 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell 这是[基于Android的ARM汇编语言系列]博文的开篇文章,这里会先介绍一下ARM处理器的大致分类和作用. 一 ARM处理器与ARM指令集 整个ARM处理器被分为三个部分: Classic Embedded Application Classic被称为经典系列. ARM1~ARM11一直都以数字来命名

[基于Android的ARM汇编语言系列]之二:原生程序的生成过程

作者:郭嘉 邮箱:[email protected] 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell 所谓的原生程序指的是用C/C++编写的程序,下面来详细演示一下原生程序是怎么一步步生成汇编代码的. 这里编译的是一个简单的hello.c程序,如下所示: #include <stdio.h> int main(int argc, char* argv[]){ printf("Hello AR

[基于Android的ARM汇编语言系列]之三:ARM汇编语言程序结构

作者:郭嘉 邮箱:[email protected] 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell Android平台的ARM汇编是GNU ARM汇编格式,使用的汇编器是GAS(GNU Assembler),GAS有自己的一套语法结构.详细的内容可以查阅GAS语法结构官方手册. 我们先来看一个完整的ARM汇编程序: C代码: #include <stdio.h> int main(int argc,

[基于Android的ARM汇编语言系列]之六:NEON指令集与VFP指令集

作者:郭嘉 邮箱:[email protected] 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell NEON指令集与VFP指令集是ARM指令集的扩展,多用于多媒体编程和浮点运算. 一 Android平台使用NEON指令集与VFP指令集 Android NDK从r3版本开始也添加了对NEON指令集与VFP指令集的支持.使用方法如下所示: 1 运行时检测处理器是否支持NEON指令集与VFP指令集 Andr

[基于Android的ARM汇编语言系列]之五:ARM指令集与Thumb指令集

作者:郭嘉 邮箱:[email protected] 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell 写在前面:本篇文章旨在大致介绍下ARM指令集的相关内容,这里也同时提供一个有详细解释和用例的待书签的PDF版本,方便大家查阅. ARM指令集详解 指令集是处理器的核心,ARM指令的基本格式如下所示: opcode {cond}{S}{.W\.N}Rd, Rn{.operand2} S:指定是否影响CPS

ARM汇编语言实现while循环

.section .data .output: .ascii "%d\n\000" .section .text .global main main: mov ip, sp stmfd sp!, {fp,ip,lr,pc} sub fp, ip, #4 sub sp, sp, #80 @memory and register mov r3, # 1 mov r0,r3 loop: cmp r0,# 15 bge stop mov r1,# 1 add r2, r0, r1 mov r0

ARM v7-A 系列CPU的MMU隐射分析

ARM v7-A 系列CPU的MMU隐射分析 摘要:ARM v7-A系列的CPU加入了很多扩展,如多核处理器扩展.大物理地址扩展.TrustZone扩展.虚拟化扩展.若支持大的物理地址,则必须支持多核处理器:若支持虚拟化,则必须支持大的物理地址.多核处理器.TrustZone.加入这些扩展后,相应的MMU(虚拟地址到物理地址的隐射功能)结构也改变了许多.本文首先分析加入扩展后MMU的整体结构,然后详细介绍地址转换中用到短描述符格式(32位)和长描述符格式(64位),以及如何实现虚拟地址到物理地址

ARM 汇编语言源代码行的语法规则

ARM 汇编语言源代码行的语法规则 3.1 Syntax of source lines in assembly language 汇编器首先解析汇编语言源代码,然后把源代码汇编成目标文件.汇编语言源代码的每一行都要符合如下所示的语法格式:      {symbol} {instruction|directive|pseudo-instruction} {;comment} 语法格式中的以大括号分割的三个部分都是可选的. symbol通常表示一个标号.在指令和伪指令中,symbol总是一个标号.

ARM汇编语言的程序结构

一个ARM汇编语言源程序的基本结构: AREA Init, CODE, READONLY ENTRY Start LDR R0, =0x3FF5000 LDR R1, 0xFF STR R1, [R0] LDR R0, =0x3FF5008 LDR R1, 0x01 STR R1, [R0] ... ... ... ... ... ... END 在 ARM( Thumb)汇编语言程序中,以程序段为单位组织代码. 段是相对独立的指令或数据序列,具有特定的名称.段可以分为代码段和数据段,代码段的内