arm export 汇编_Arm汇编指令集

本文详细介绍了ARM汇编中的跳转指令,包括B、BL和BLX,以及数据处理指令如MOV、MVN、CMP、TST等。还涉及程序状态寄存器的访问、加载/存储指令、数据交换以及伪指令的使用,是理解ARM汇编指令集的重要参考。
摘要由CSDN通过智能技术生成

跳转指令:1:使用专门的跳转指令

2;直接修改PC寄存器的值为跳转地址值 ,从而实现跳转

MOV LR PC //先把pc值保存起来到LR,返回的时候能找到

MOV PC 0x232233

跳转指令

B 指令的格式: B{条件} 目的地址

B指令是最简单的跳转指令

B label 有去无回,不能返回

BL 指令的格式

BL的指令和B差不多,唯一不同的是,在跳转之前会在寄存器R14中保存当先pC的值

和前面说的效果是一样的 ,比他简单。一个指令就实现了前面两条指令,能返回

BLX 目标地址

比BL多出的功能是,X是用来切换ARM指令集和Tumbe指令集,之间的切换

数据处理指令分为几种 {}的意思是可以有可以没有 S的意思是可能会影响CPSR状态寄存

器 一般不加S

1,数据的传递指令 MOV {条件}{S} 目的寄存器 源操作数

MOV R1,R0

MOV PC,R14

MOV R1,R0,LSL#3

MVN指令 MVN {}{} 目的寄存器 源操作数

MVN R0 , #0xff 把Oxff按位取反,之后放进R0里面去

比较指令 CMP指令

CMP{} 操作数1 操作数2

比较指令 不存储结果 但是影响CPSP的状态

TST指令 TST{}{}操作数1 操作数2

两个操作数之间的安位与操作运算 根据结果去更新CPSR中条件标志位的值

TST R1,#%1 %的意思是二进制的意思

ADD{}{} 目的寄存器 操作数1 操作数2

ADD R0,R1,R3

SUB{}{}目的寄存器 操作数1 操作数2 操作数1减去操作数2

AND{}{}目的寄存器 操作数1 操作数2

用于在两个操作数之间做逻辑与

ORR 逻辑或运算

BIC指令 清零指令 把Rn的某些位清零

BIC {}{} Rd,Rn,operand2

Bic指令用于清除Rn中的某些位,并把结果存放在Rd中,operand2是掩码位,掩码位哪个位

1.清除哪个

MUL指令 乘法指令

MUL{}{}目的寄存器 操作数1 操作数2

ARM程序状态寄存器访问指令

MRS指令 MOV不能访问程序状态寄存器 只能访问通用寄存器

MRS{条件} 通用寄存器,程序状态寄存器(CPSR或者SPSR)

MRS指令是值将程序状态寄存器的内容传送到通用寄存器当中去

MRS R0,CPSR

MSR指令和MRS正好相反 是值传到程序状态寄存器中去

MSR CPSR ,R0

有域的概念

位31:24 条件标志位域 用f表示 23 16 位状态域 用s表示

位15:8 位扩展位域 用x表示 7 0 位控制位域 用c表示

MSR CPSR_c ,R0 ;传送R0的内容到SPSR,但仅仅修改CPSR的控制位域

加载/存储指令 访问内存 内存和寄存器之间的通讯

LDR {} 目的寄存器

LDR用于从存储器中将一个32位的字数据传送到目的寄存器中,

LDR R0 ,[R1] R1寄存器放的是内存的地址

LDR R0 ,[R1,R2]

LDR R0, [R1,#8]

LDR R0 ,[R1,R2]! R1+R2放入到R0中,并且将新地址写入R1

LDRB 这个是一个8位的数据取出来存放到寄存器中

LDRH 是吧一个16位的数据取出来放在寄存器

STR把寄存器中的数据存到内存当中的指令

STR {}源寄存器 《存储器地址》

STR R0,【R1】,#8

上面的只是一次加载 存储一个单元 下面的是操作一片

LDM{条件}{类型} 基址寄存器{!}, {^}

STM{}{}基址寄存器{!},{^}

这两个指令主要用于有基址寄存器所指示的一片连续存储器到寄存器列表所表示的多个寄存

器之间传送数据

STMFD R13!,{R0,R4-R12,LR}

把这些寄存器的值存入堆栈

LDMFD R13! ,{R0,R4-R12,LR}

从堆栈内容恢复到寄存器中

数据交换指令

SWP 字数据的交换 SWP {条件}目的寄存器 ,源寄存器存器2】、

就是交换

例如

SWP R0,R1,【R2】 先把R2放进R0 之后把R1放进R2

SWPB 字节数据的交换

LSL移位指令

ROR移位指令,左端用右端移出的位填进去

异常产生指令

SWI 软件中断

BKPT 断点中断指令

ARM的伪指令

符号定义伪指令

GBLA GBLL GBLS 定义全局变量

LCLA LCLL LCLS 局部变量

SETA SETL SETS 对变量赋值

语法格式

GBLA GBLL GBLS 全局变量名

数字变量 逻辑变量 字符串变量

GBLA test1

test1 SETA 0xaa 对变量赋值

RLIST定义寄存器列表

RegList RLIST {R0-R5,R8,R10}

DCB指令

分配一片连续的字节存储单元,并用伪指令中指定的表达式初始化

标号 DCB 表达式

Str DCB “this is a test”

SPACE指令

标号 SPACE 表达式

分配大小

Dataspace SPACE 100 分配一个连续空间100字节的空间

MAP指令

MAP 表达式 {, 基址寄存器}

MAP 0x100,R0

FILED指令

分段用的和MAp使用

MAP 0x100

A FIELD 16

B FIElD 32

汇编控制伪指令

IF指令

IF逻辑表达式

ELSE

ENDIF

WHILE指令

AREA 段名 属性1 属性2

AREA Init CODE ,READONLY 属性都有DATA CODE READONLY ALIGN

CODE16 通知编译器 下面的代码为thumb指令

CODE32

ENTRY指令 是用于指定汇编程序 的入口点

EQU指令

EQU 表达式 {,类型} 类似于C语言的宏定义

test ETU 50

EXPORT指令

EXPORT 标号

用于程序中声明一个全局的标号,其他文件也能使用了,类似于extern C语言中的

IMPORT指令

导入 和EXPORT一起使用

END指令 代表程序的结束

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值