ARM汇编基础

ARM是基于RISC指令架构下的处理器,现在有ARM#,ARM-Cortex-M#,ARM-Cortex-R#,ARM-Cortex-A#很多版本。学习处理器,还是从最简单的入手,就像学习x86汇编,先学习8086一样。

1.ARM汇编分类

标准汇编:ARM公司标准的汇编环境,只有ARM编译器才可以使用,如ADS集成开发环境。
GNU汇编:Linux下的GNU交叉工具链中的汇编环境,我们一般选用这种模式。

2.ARM七种工作模式

(1)用户模式(USR):正常程序执行模式,不能直接切换到其他模式
(2)系统模式(SYS):运行操作系统的特权任务,与用户模式类似,但具有可以直接切换到其他模式等特权
(3)快中断模式(FIQ):支持高速数据传输及通道处理,FIQ异常响应时进入此模式
(4)中断模式(IRQ):用于通用中断处理,IRQ异常响应时进入此模式
(5)管理模式(SVC):操作系统保护模式,系统复位和软件中断响应时进入此模式(由系统调用执行软中断SWI命令触发)
(6)中止模式(ABT):用于支持虚拟内存和/或存储器保护,在ARM7TDMI没有大用处
(7)未定义模式(UND):支持硬件协处理器的软件仿真,未定义指令异常响应时进入此模式

除用户模式外,其余6种工作模式都属于特权模式,特权模式中除了系统模式以外的其余5种模式称为异常模式,大多数程序运行于用户模式,进入特权模式是为了处理中断、异常、或者访问被保护的系统资源。

硬件权限级别:系统模式 > 异常模式 > 用户模式

3.ARM寻址方式

立即寻址
操作数是立即数,以“#”为前缀,表示 16 进制数值时以“0x”表示。
MOV R0,#0xFF00 ;0xFF00 -> R0
SUBS R0,R0,#1 ;R0 – 1 -> R0

寄存器寻址
操作数的值在寄存器中,指令执行时直接取出寄存器值操作。
MOV R1,R2 ;R2 -> R1
SUB R0,R1,R2 ;R1 - R2 -> R0

寄存器偏移寻址
当第二操作数是寄存器偏移方式时,第二个寄存器操作数在与第一个操作数结合之前,选择进行移位操作。
MOV R0,R2,LSL #3 ;R2 的值左移 3 位,结果放入 R0,即 R0 = R2 * 8

寄存器间接寻址
操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针。
LDR R1,[R2] ;将 R2 中的数值作为地址,取出此地址中的数据保存在 R1 中

基址寻址
将基址寄存器的值与偏移量相加,形成操作数的有效地址,基址寻址用于访问基址附近的存储单元,常用于查表、数组操作、功能寄存器访问等。
LDR R2,[R3,#0x0F] ;将R3中的数值加 0x0F 作为地址,取此地址的值保存在 R2 中
STR R1,[R0,#-2] ;将R0中的数值减 2 作为地址,把 R1的值保存到此地址中

多寄存器寻址
一次传送多个寄存器值,允许一条指令传送 16 个寄存器的任何子集或所有寄存器。多寄存器寻址时,寄存器子集按由小到大的顺序排列,连续的寄存器可用“-”连接,否则,用“,”分隔书写。
例:
LDMIA R1!,{R2-R7,R12} ;将 R1的值读出到 R2-R7,R12,过程中R1 自动加 1
STMIA R0!,{R3-R6,R10};将 R3-R6,R10的值保存到 R0 指向的地址,过程中R0 自动加 1

堆栈寻址
堆栈寻址使用堆栈指针SP,即R13,指向堆栈的栈顶。堆栈可分为两种:
向上生长:向高地址方向生长,称为递增堆栈,
向下生长:向低地址方向生长,称为递减堆栈,
堆栈指针指向最后压入的有效数据项,称为满堆栈,
堆栈指针指向下一个要放入的空位置,称为空堆栈,这样就有 4 种类型的堆栈。
A)满递增:堆栈地址向上增长,堆栈指针指向有效数据的最高地址。如 LDMFA,STMFA。
B)空递增:堆栈地址向上增长,堆栈指针指向堆栈上的第一个空位置。如 LDMEA,STMEA 。
C)满递减:堆栈地址向下增长,堆栈指针指向有效数据项的最低地址。如 LDMFD,STMFD。
D)空递减:堆栈地址向下增长,堆栈指针指向堆栈下的第一个空位置。如 LDMED,STMED 。
STMFD SP!,{R1-R7,LR} ; 将 R1~R7,LR 入栈。满递减堆栈。
LDMFD SP!,{R1-R7,LR} ;数据出栈,放入 R1~R7,LR 寄存器。满递减堆栈。

块拷贝寻址
用于将一块数据从存储器的某一位置拷贝到另一位置。
STMIA R0!,{R1-R7} ;将R1~R7的数据保存到存储器中,存储器指针在保存第一个值之后增加,增长方向为向上增长。
STMIB R0!,{R1-R7} ;将R1~R7的数据保存到存储器中,存储器指针在保存第一个值之前增加,增长方向为向上增长。
STMDA R0!,{R1-R7} ;将R1~R7的数据保存到存储器中,存储器指针在保存第一个值之后增加,增长方向为向下增长。
STMDB R0!,{R1-R7} ;将R1~R7的数据保存到存储器中,存储器指针在保存第一个值之前增加,增长方向为向下增长。

相对寻址
相对寻址是基址寻址的一种变通,由程序计数器 PC 提供基准地址,指令中的地址
码字段作为偏移量,两者相加后得到有效地址。
例:
BL ROUTE1 ;调用ROUTE1 子程序
BEQ LOOP ;条件跳转到 LOOP 标号处

LOOP MOV R2,#2

ROUTE1

4.汇编程序框架

.section .data
< 初始化的数据>
.section .bss
< 未初始化的数据>
.section .text

.section .text
.global _start
_start:
<汇编代码>

或者:
.data
<初始化数据>
.bss
<未初始化数据>
.text
.global _start
start:
<汇编代码>

5.Hello汇编程序

说明:该程序无法运行,可以调试运行
.text
.global _start
_start:
mov r1, #1
mov r2, #2
add r3, r1, r2

编译for:2440开发板,内存起始地址0x30000000
arm-linux-gcc -g -c -o hello.o hello.S
arm-linux-ld -Ttext 0x30000000 -o hello.elf hello.o

参考:
https://blog.csdn.net/xiaolangyangyang/article/details/51768462
https://www.cnblogs.com/icefree/p/8539112.html

原文地址:https://blog.51cto.com/14207158/2485772

时间: 2024-08-07 14:52:01

ARM汇编基础的相关文章

ARM汇编基础(iOS逆向)

1. ARM汇编基础 在逆向一个功能的时候,往往需要分析大量的汇编代码,在iOS逆向中,ARM汇编是必须掌握的语言,本文总结了ARM汇编的基础知识,如果你想了解更多,请参考狗神的小黄书<iOS逆向逆向工程>或ARM官方手册. 1.1 寄存器,内存和栈 在ARM汇编里,操作对象是寄存器,内存和栈 ARM的栈遵循先进后出,是满递减的,向下增长,也就是开口向下,新的变量被存到栈底的位置;越靠近栈底,内存地址越小 一个名为stackPointer的寄存器保存栈的栈底地址,成为栈地址. 可以把一个变量给

ARM汇编基础(1)--ADS1.2安装与第一个ARM汇编程序

前言 最近的工作是与逆向相关, 用到ARM汇编, 以前在大学时学过x86汇编和ARM开发, 自我感觉当时学的还挺好, 很久没用也生疏了. 正好趁着这个机会也复习一下ARM汇编. 关于ARM的介绍和理论知识,此处就不再赘述. 进入正题: 安装ADS1.2 安装过程很简单, 没什么技术含量. 但是, win7可能会碰到卡在100%的问题, 网上有很多解决的办法, 但好像都不管用. 我用XP的虚拟机装的ADS1.2, 在XP系统上安装很顺利. 第一个ARM汇编程序 新建一个工程, 然后再按照一下步骤设

ARM汇编基础--几个简单实例

实例1: 求1+2+3+......+100的和, 并将结果存入0x80000100地址空间中. 1 area text, code, readonly 2 entry 3 code32 4 start 5 mov r1, #0 6 mov r2, #100 7 loop 8 add r3, r3, r1 ;累加 9 add r1, r1, #1 ;自增 10 cmp r1, r2 11 ble loop 12 ldr r2, =0x80000100 13 str r3, [r2] ;保存结果

ARM开发入门与汇编基础

2019-12-12 关键字:汇编指令基础 首先 ARM 是一家公司,它成立于 1990 年.ARM 公司主要是设计 ARM 系列的 RISC 处理器内核,并将这些内核授权给合作伙伴进行生产与销售.ARM 公司是一家只负责设计内核而不生产芯片的公司. ARM 芯片的产品线主要分为三种: 1.应用级 应用于高端产品的芯片,如智能手机等.其芯片代号为 A 系列,如 Cortex-A8 , Cortex-A9. 2.实时嵌入式 应用于一些对性能要求稍低一些的设备.其芯片代号为 R 系列,如 Corte

Arm处理器寄存器介绍及汇编基础

1. ARM处理器支持7种工作模式 · User (usr): The normal ARM program execution state· FIQ (fiq): Designed to support a data transfer or channel process· IRQ (irq):    Used for general-purpose interrupt handling· Supervisor (svc):   Protected mode for the operating

[A8 学习笔记] A8 汇编基础

A8 处理器工作模式 这点和以往的 arm7 arm11 是一致的.有8个工作模式: 用户模式是通常的ARM程序的执行状态,并用于执行大多数应用程序 快速中断(FIQ)模式是用于处理快速中断 中断(IRQ)模式是用于通用的中断处理 管理模式是一个操作系统保护模式 中断模式是当数据出错或者预取指令出错时进入的模式 系统模式是操作系统的一个特权用户模式 未定义的模式进入一个未定义指令异常发生时 监控方式为安全扩展安全模式安全监控代码. 除了用户模式模式统称为特权模式.特权模式用于服务中断或异常,或访

ARM汇编指令特点

根据朱有鹏老师课程笔记整理而来: (汇编)指令是CPU机器指令的助记符,经过编译后会得到一串1 0组成的机器码,由CPU读取执行. (汇编)伪指令本质上不是指令(只是和指令一起写在代码中),它是编译器环境提供的,目的是用来指导编译过程,经过编译后伪指令最终不会生成机器码. 两种不同风格的ARM指令 ARM官方的ARM汇编风格:指令一般用大写.Windows中IDE开发环境(如ADS.MDK等)常用.如: LDR R0, [R1] GNU风格的ARM汇编:指令一般用小写字母.linux中常用.如:

如何实现对ARM汇编指令的调试?

学习ARM汇编语言时,少不了对ARM汇编指令的调试.作为支持多语言的调试器,gdb自然是较好的选择.调试器工作时,一般通过修改代码段的内容构造trap软中断指令,实现程序的暂停和程序执行状态的监控.为了在x86平台上执行ARM指令,可以使用qemu模拟器执行ARM汇编指令,具体的调试方法,一起来看看吧. 一.准备ARM汇编程序 首先,我们构造一段简单的ARM汇编程序作为测试代码main.s. .globl _start _start: mov R0,#0 swi 0x00900001 以上汇编指

ARM汇编指令集1

(汇编)指令是CPU机器指令的助记符,经过编译过会得到一串0011组成的机器码,可以由CPU读取执行. (汇编)伪指令本质不是指令(只是和指令一起写在代码中),它是编译器环境提供的,目的是用来指导编译过程,经过编译后伪指令最终不会生成机器码. 两种不同风格的ARM指令 --ARM官方的ARM汇编风格:指令一般用大写,Windows中的IDE开发环境(如ADS.MDK)常用.如:LDR  R0,[R1] --GNU风格的ARM汇编:指令一般用小写字母.Linux中常用.如:ldr  r0,[r1]