• 【安卓逆向】ARM常见汇编指令总结


     

    跳转指令

    B      无条件跳转
    BL    带链接的无条件跳转
    BX    带状态切换的无条件跳转
    BLX  带链接和状态的无条件跳转

    存储器与寄存器交互数据指令(核心)

    存储器:主存和内存

    寄存器中放的数据:可以是字符串,可以是数,也可以是一个地址,他可以放各种类型的数据

    存储地址单元:地址(如如0x00004000)与地址中存在的值

    LDR:从存储器中加载数据到存储器←Load
    LDR R8,[R9,#04] R8为待加载数据的寄存器,加载值为R9+0x4所指向的存储单元
    
    STR:将寄存器的数据存储到存储器中→Store
    STR R8,[R9,#04] 将R8寄存器的数据存储到R9+0x4所指向的存储单元
    
    LDM:将存储器的数据加载到寄存器列表→
    LDM R0,{R1-R3}将R0指向的存储单元的数据依次加载到R1,R2,R3寄存器
    
    STM:将一个寄存器列表的数据存储到指定的存储器中
    PUSH:将寄存器值推入堆栈
    POP:将堆栈值推出到寄存器
    SWP:将寄存器与存储器之间的数据进行交换
    SWP R1, R1 [R0] 将R1寄存器与R0指向的存储单元的内容进行交换

    堆,队列:数据结构,栈是竖的,后进先出,且只能从栈顶依次填入数据

    数据传输指令

    MOV:将立即数或寄存器的数据传送到目标寄存器
    MOV R0, #8 :R0=0x8

    数据算数指令

    ADD:+
    SUB:—
    MUL:*
    DIV:  /

    数据逻辑运算指令

    与:AND
    或:ORR
    异或:EOR
    LSL:逻辑左移←
    LSR:逻辑右移→
    LSL R0,R1,#2:R0=R1*4

    移位:实质是乘,除,类似于小数点移位,但相反。小数点左移,数变小;右移变大。

    但逻辑移位,左移变大,右移变小,且按2的倍数进行,因为是2进制。

    比较指令

    CMP:比较
    CMP R0 #0:R0寄存器中的值与0比较

    标志位:如z位,这个都可以在动态调试时,寄存器窗口看到

    其他指令

    协处理器指令:SWT (切换用户模式)
    伪指令:DCB

    寄存器寻址方式

    立即寻址:MOV R0,#1234→R0=0X1234
    寄存器寻址:MOV R0,R1→R0=R1
    寄存器移位寻址:MOV R0,R1,LSL #2→R0=R1*4
    寄存器间接寻址:LDR R0,[R1]→将R1寄存器中的值作为地址,取出地址中的值赋予R0
    寄存器间接基址偏移寻址:LDR R0,[R1,#-4]→将R1寄存器的值-0x4的值作为地址,取出地址中的值给R0

    int a=0;这一句简单高级语言的汇编理解

    首先会开辟一个内存存储单元,然后把0x0这个数放入R0寄存器,然后再把R0寄存器的数据放入内存存储单元。所以:MOV R0,#0 STR R0,[R11,#0x14+var_20]

    注意:变量要看存储单元地址,不要以为是寄存器,简单时可以这么看,但试想,如果寄存器是变量,那得要多少寄存器。寄存器就是一个桥梁,和存储器即存储单元地址交互的东西。

  • 相关阅读:
    java设计模式之代理模式 ,以及和java 回调机制的区别
    oracle 安装,启动 ,plsql 连接
    jsp 访问文件夹中的图片,tomcat配置虚拟目录
    最实用解决tomcat startup.bat 一闪而过
    oracle 创建表
    java debug源码完整版
    node.js事件轮询(1)
    markdown命令语法
    mac常用的命令
    node + nginx + mongo搭建负载均衡
  • 原文地址:https://www.cnblogs.com/sqyysec/p/9009969.html
Copyright © 2020-2023  润新知