ARM 常用汇编指令

Posted 『流浪的Coder』

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ARM 常用汇编指令相关的知识,希望对你有一定的参考价值。

ARM 汇编程序的框架结构

.section .data

      <初始化的数据>

.section.bss

      <未初始化的数据>

.section .text

.global _start

_start:

      <汇编代码>

注意: 一般是将上面结构进行简化

.text

.global  _start

_start:

     <汇编代码>

 

寄存器操作指令:

算术和逻辑指令:

MOV :用于将一个寄存器或被移位寄存器或一个立即数移动到目的寄存器

MOV  r1 ,#8 (注意:#+数,表示一个十进制数,#+0b数,表示一个二进制数,#+0x数,表示一个十六进制数)

 

MVN :对源操作数取反再赋值给目的寄存器

MOV R1#8

 

SUB : 将一个数减去另外一个数再存放如寄存器

SUB R1,#8#6(8-6)

 

ADD:将一个数加上另外一个数后将其存放如寄存器中

ADD R1R2R3

 

AND :逻辑与

AND R1R2#0

 

BIC:位清除

BIC R1R2#0B1101

R2中所与#b11011所对应的位清零后的结果保存在R1

比较指令:

CMP:顾名思义,用于比较两个数的大小,比较的结果不过会放在哪个通用寄存器中而是改在程序状态寄存器中的一个标志状态位

CMP R1#0B111010

 

TST:测试位,将两个数按位与

TST R1R2

 

分枝指令:

B:条件跳转指令

B [条件]  标号  (注意 :中括号在编写程序时不需要写出)

 

BL :带连接的返回(类似于C语言中的子函数调用,调用子函数后返回主函数)

 

移位指令:

LSL:算术左移位

MOV R1R1LSL#2(R1中的数据左移两位存入R1)

 

 

ROR:循环右移

MOV R1R1#ROR 2(R1中的数据循环右移后存入R1)

 

程序状态字访问指令:

上面所学指令都不能对计算机中的程序状态字中的指令进行访问和读写,所以需要专用计算机指令来将程序状态字中的数据读写到通用寄存器中,在进行修改后写入

MRS :将程序状态字中的数据搬出来

MRS  R0CPRS

MSR:将数据搬回程序状态字中

MSR  CPRS, R0

 

存储器操作指令:

LDR :将内存中的值导出到通用寄存器中

LDR R0 ,#0XFF ‘

STR:将同用寄存器中的数据写回到内存中

STR R0 ,#0XFF

 

 

伪指令:

定义类伪指令:(1:编译时起作用2:起作用但是转化为其他机器指令)

.global  表明一个全局的符号 (注意GNU伪指令的特点在前面加上一个“.)

.data    定义一个数据段

      .ascii 定义字符串的数据

      .byte 定义一个字节的数据

      .word 定义一个字的数据

      .data

.equ (类似于C语言中定义宏)

 

.align 用于字节对齐

 

 

操作类伪指令:

nop:空操作指令 \

具体实现:mov r0 ,r0

ldr:用于将一个大于八位的数据装入寄存器

注意:ldr r0 ,=0x1ff

这里后面是用的等号这里和其他地方有些不一样

 

      

协处理指令:(最重要是就是CP15

作用:系统控制

mcr:

mrc:

mrc p15,0, r0 ,c0,c0,0

注意:蓝色部分是由芯片手册的cp15寄存器访问列表给出的以访问不同寄存器 。红色部分是内核内部通用寄存器

以上是关于ARM 常用汇编指令的主要内容,如果未能解决你的问题,请参考以下文章

arm汇编

Android 图解逆向工程中ARM常用汇编指令

GNU ARM汇编快速入门

ARM汇编基础详解

GNU ARM 汇编基础笔记

ARM的伪指令