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
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值