arm汇编基础

author author     2023-04-05     699

关键词:

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

linux驱动开发:arm汇编基础(代码片段)

文章目录Linux驱动开发:ARM汇编基础一、GUN汇编语法1.1语句结构:1.2伪操作1.3GUN函数二、ARM的寻址方式2.1立即寻址2.2寄存器寻址2.3寄存器间接寻址2.4基址变址寻址2.5多寄存器寻址2.6相对寻址2.7堆栈寻址三、Cortex-A常用汇编... 查看详情

ios汇编入门教程arm64汇编基础(代码片段)

__attribute__anti_debug__arm64____asm____volatile__testabresabresmainrestesthelloBBspspstrw0strw1ldrw0ldrw1addw0w0w1strw0ldrw0addspspretBBspspstpx29x30addx29sporrw0wzrorrw1wzrsturwzrbl_testmovw1strw0m 查看详情

arm汇编基础详解(代码片段)

目录前言1.GNU汇编语法2.Cortex-A7常用汇编指令2.1处理器内部数据传输指令2.2存储器访问指令2.3压栈和出栈指令(了解)2.4跳转指令2.5算术运算指令2.6逻辑运算指令前言我们在进行嵌入式Linux开发的时候是绝对要掌握基本的AR... 查看详情

arm汇编基础

...多版本。学习处理器,还是从最简单的入手,就像学习x86汇编,先学习8086一样。1.ARM汇编分类标准汇编:ARM公司标准的汇编环境,只有ARM编译器才可以使用,如ADS集成开发环境。GNU汇编:Linux下的GNU交叉工具链中的汇编环境,我... 查看详情

android逆向基础之arm汇编语言知识总结(代码片段)

文章目录前言ARM32汇编1.1寄存器1.2寻址方式1.3汇编指令1.4代码识别1.5IDA示例ARM64汇编2.1寄存器2.2变址寻址方式2.3常用汇编指令2.4实例程序分析总结前言X86是英特尔Intel首先开发制造的一种微处理器体系结构的泛称,包括Intel8086... 查看详情

arm汇编基础上(代码片段)

...集处理器,其指令集的设计是定长的,也就是其汇编对应的机器码是定长的(2字节或者4字节)。那么对于定长而言,其优点就是更快的被执行,因为这样CPU取指令译码的速度相对x86的CPU会快一些,但... 查看详情

优化系列汇编优化技术:arm架构64位(aarch64)汇编优化及demo

DATE:2021.8.15文章目录1、arm架构64位优化基础知识2、ARMv8/AArch64neon指令格式3、ARM相关编译参数4、查看状态标记位NZCV的方法5、A64指令集特有的指令及其用法6、资料文档查阅7、AArch64asmdemo8、优化经验总结(满满的干货)1、arm架构6... 查看详情

arm汇编基础基于keil创建stm32汇编程序的编写(代码片段)

文章目录一、新建项目(1)工具介绍(2)创建项目:二、配置环境(1)配置芯片(2)配置运行环境三、调试代码(这里选择使用的是仿真调试)(1)源代码(2)仿真设... 查看详情

android逆向基础之arm汇编语言知识总结(代码片段)

文章目录前言ARM32汇编1.1寄存器1.2寻址方式1.3汇编指令1.4代码识别1.5IDA示例ARM64汇编2.1寄存器2.2变址寻址方式2.3常用汇编指令2.4实例程序分析总结前言X86是英特尔Intel首先开发制造的一种微处理器体系结构的泛称,包括Intel8086... 查看详情

嵌入式:arm汇编语言程序设计基础教程

汇编语言程序设计的步骤①合理地分配存储器资源,将前述的目标系统‘数据结构模型’表示到各存储器单元。②CPU寄存器数量有限,在程序中,大多数操作都要使用寄存器;并且有的操作使用特定的寄存器(如堆栈操作使用SP/... 查看详情

arm开发入门与汇编基础(代码片段)

2019-12-12关键字:汇编指令基础 首先ARM是一家公司,它成立于1990年。ARM公司主要是设计ARM系列的RISC处理器内核,并将这些内核授权给合作伙伴进行生产与销售。ARM公司是一家只负责设计内核而不生产芯片的公司。 ARM芯片... 查看详情

汇编指令及其特点

基础知识指令与伪指令汇编指令:CPU机器指令的助记符,编译后得到1和0组成的机器码,由CPU读取执行伪指令:本质上不是指令,由编译环境提供,谜底在于知道编译过程,最终不会生成机器码不同的ARM风格ARM官方汇编风格:指... 查看详情

arm汇编基础上(代码片段)

...集处理器,其指令集的设计是定长的,也就是其汇编对应的机器码是定长的(2字节或者4字节)。那么对于定长而言,其优点就是更快的被执行,因为这样CPU取指令译码的速度相对x86的CPU会快一些,但... 查看详情

优化系列汇编优化技术:arm架构32位汇编优化及demo

DATE:2021.8.15文章目录1、前言2、Arm汇编架构和ReferenceManuals3、Arm32位寄存器4、ARM指令寻址方式5、ARM指令特点以及优化技巧6、ARM和NEON指令集常用指令汇总7、ARM32位加载数据的两种格式8、ARM32位汇编编写demo9、注意事项10、汇编优化... 查看详情

嵌入式:arm内嵌汇编及c和arm汇编相互调用

内嵌汇编在C程序中嵌入汇编程序可以实现一些高级语言没有的功能,并可以提高执行效率。armcc和armcpp内嵌汇编器支持完整的ARM指令集;tcc和tcpp用于Thumb指集。但是内嵌汇编器并不支持诸如直接修改PC实现跳转的底层功能。内嵌... 查看详情

android逆向arm汇编(使用ida解析arm架构的动态库文件|分析malloc函数的arm汇编语言)(代码片段)

文章目录一、分析malloc函数的arm汇编语言一、分析malloc函数的arm汇编语言在上一篇博客【Android逆向】arm汇编(使用IDA解析arm架构的动态库文件|使用IDA打开arm动态库文件|切换IDA中汇编代码显示样式)打开并配置了选项;分析libc.so的... 查看详情

android逆向arm汇编(使用ida解析arm架构的动态库文件|分析malloc函数的arm汇编语言)(代码片段)

文章目录一、分析malloc函数的arm汇编语言一、分析malloc函数的arm汇编语言在上一篇博客【Android逆向】arm汇编(使用IDA解析arm架构的动态库文件|使用IDA打开arm动态库文件|切换IDA中汇编代码显示样式)打开并配置了选项;分析libc.so的... 查看详情

arm汇编

(汇编)指令是CPU机器指令的助记符,经过编译后会得到一串10组成的机器码,可以由CPU读取执行。(汇编)伪指令本质上不是指令(只是和指令一起写在代码中),它是编译器环境提供的,目的是用来指导编译过程,经过编译... 查看详情