ARM初识

ARM 指令集为精简指令集(指令长度为2或4)
X86 指令集为复杂指令集(指令长度可变)

Thumb: 16位指令,长度为2字节
ARM: 32位指令,长度为4字节


数据类型

数据类型 长度(bits)
Byte 8Bits
HalfWord 16Bits
Word 32Bits
DWord 64Bits

ARM工作模式(7种)

用户模式(1种), 系统模式(5种), 未定义模式(1种)

寄存器介绍(R3模式)

共37个可访问寄存器(31个通用寄存器,6个状态寄存器)

R0~R12 为通用寄存器

寄存器名 寄存器功能
R11 通用寄存器(FP),一般做栈底,方便栈变量和参数的寻址
R13 堆栈指针(SP),即栈顶
R14 链接寄存器(LR), 用处为保存函数调用的返回地址
R15 程序计数器(PC),即当前执行指令的下一条指令的下一条指令的地址
CPSR 状态寄存器

状态寄存器:

作用
0~4位 标识当前处于什么模式
5位 T位(为1则为Thumb模式,指令为2字节, 为0则为ARM模式,指令4字节)
6,7位 I/F位, 用于屏蔽中断 ,当I位为1时,IRQ中断被禁止;当F位为1时,FIQ中断被禁止
8~27位 保留字段
28位 V位, 溢出标志位 , 当该位为1时:使用加法/减法运算时,表示有符号溢出;否则V=0
29位 C位, 进位标志位,当该位为1时:若为加法运算(含CMN)表示产生进位,否则C=0
30位 Z位, 零标志位 当该位为1时:表示两数相等。为0时:表示两数不相等
31位 N位, 符号位, 当该位为1时:表示负数。为0时:表示正数

bl: 相当于X86的CALL, 调用导入函数使用(PLT) 标明函数重定位
功能为:流程转移到指定地址,然后返回地址入R14(LR)寄存器, 可直接调用库函数

ARM的函数调用:前四个参数 分别传入R0~R3, 其余参数入栈

当子函数中再次发生函数调用时, 则给R14(LR)寄存器的值入栈

注意: ARMmov指令不支持操作内存


GNUAS功能

用于编译.s文件为ARM指令程序

手工编译ARM程序

1
2
3
4
as -e SrcNmae.c -o SrcNmae.i        //预编译处理文件 .I
as -s SrcNmae.i -o SrcNmae.s //ASM文件 .s
as -c SrcNmae.s -o SrcNmae.o //编译中间文件 .o(OBJ)
gcc LIB SrcNmae.o -o SrcNmae //链接库文件

ARM的ASM伪指令

伪指令 功能

Tips:

JAVA没有运算符重载语法, 单独给String类提供一个重载语法特例
data/system/packet.xml 此文件保存系统中所有的APP的权限
Android.os.Debug.waitForDebugger() 等待调试器加载,一般写在SOOnLoad

文章目录
  1. 1. 数据类型
  2. 2. ARM工作模式(7种)
  3. 3. 寄存器介绍(R3模式)
  4. 4. GNU的AS功能
  5. 5. 手工编译ARM程序
  6. 6. ARM的ASM伪指令
|