指令集"/>
Android SO ARM及Thumb2指令集
0x01 ARM寄存器
1.1 通用寄存器
1.未分组寄存器:R0~R7
2.分组寄存器:R8~812
R13:SP,常用作堆栈指针,始终指向堆栈的顶部,当一个数据(32位)推入堆栈时,SP(R13的值减4)向下浮动指向下一个地址,即新的栈顶,当数据从堆栈中弹出时,SP(R13的值加4)向上浮动指向新的栈顶。
R14:连接寄存器(LR),当执行BL子程序调用指令时,R14中得到R15(程序计数器PC)的备份,其他情况下,R14用作通用寄存器。
1.2 状态寄存器
CPSR(R16):当前程序状态寄存器,用来保存ALU中的当前操作信息,控制允许和禁止中断、设置处理器的工作模式等。
SPSRs:五个备份的程序状态寄存器,用来进行异常处理。当异常发生时,SPSR用于保存CPSR的当前值,从异常退出时可由SPSR来恢复CPSR。
N、Z、C、V均为条件码标志位,他们的内容可被运算的结果所改变。
N:正负标志,N=1表示运算的结果为负(最高位为1),N=0表示运算的结果为正或0(最高位为0)
Z:零标志,Z=1表示运算的结果为0,Z=0表示运算的结果为非0
C:进位标志,产生了进位时则C=1,否则C=0
V:溢出标志,V=1表示有溢出,V=0表示无溢出
1.3 那么如何判断产生进位和溢出呢?
溢出与进位是针对加法而言
溢出
负数用补码表示,只有相加操作,x,y指的是相加操作的两个数
设:
x 为第一个加数的符号位
y 为第二个加数的符号位
r 为结果的符号位
那么:
xy = 00 r=1,溢出,r=0,未溢出
xy = 11 r=0,溢出,r=1,未溢出
xy = 10 不会溢出
XY = 01 不会溢出
进位
负数用补码表示,只有相加操作,x,y指的是相加操作的两个数
设:
x 为第一个加数的符号位(准确点,这时应叫做最高位)
y 为第二个加数的符号位
r 为结果的符号位
那么:
xy = 00 决不会产生进位
xy = 11 一定会进位
xy = 10 r = 0 ,有进位,r = 1,无进位
XY = 01 r = 0 ,有进位,r = 1,无进位
1.4 地址空间
程序正常执行时,每执行一条ARM指令,当前指令计数器增加4个字节。当前的PC执行PC + 2 * 4 = PC + 8的地址。
0x02 ARM汇编语言
2.1 汇编指令格式
<opcode>{<cond>}{S}<Rd>,<Rn>{,<OP2>}
格式中<>的内容必不可少,{}中的内容可省略
<opcode>:表示操作码,如ADD表示算术加法
{<cond>}:表示指令执行的条件域,如EQ、NE等
{S}:决定指令的执行结果是否影响CPSR的值,使用该后缀则指令执行的结果影响CPSR的值,否则不影响
<Rd>:表示目的寄存器
<Rn>:表示第一个操作数,为寄存器
<op2>:表示第二个操作数,可以是立即数、寄存器或寄存器移位操作数
例子:ADDEQS R0,R1,#8;其中操作码为ADD,条件域cond为EQ,S表示该指令的执行影响CPSR寄存器的值,目的寄存器Rd为R0,第一个操作数寄存器Rd为R1,第二个操作数OP2为立即数#8。
2.2 指令的条件执行
指令的条件后缀只是影响指令是否执行,不影响指令的内容。
条件码 | 助记符后缀 | 标志 | 含义 |
---|---|---|---|
0000 | EQ | Z置位 | 相等 |
0001 | NE | Z清零 | 不相等 |
0010 | CS | C指令 | 无符号数大于或等于 |
0011 | CC | C清零 | 无符号数小于 |
0100 | MI | N置位 | 负数 |
0101 | PL | N清零 | 正数或零 |
0110 | VS |
更多推荐
Android SO ARM及Thumb2指令集
发布评论