ARM汇编详解

ARM汇编详解ARM 汇编基本指令 https blog csdn net weixin article details Android 与 ARM 处理器 ARM 处理器架构概述 ARM 处理器家族 Android 支持的处理器架构 ARM x86 MIPS 原生程序与 ARM 汇编语言 原生程序逆向初步代码混淆技术 ARM 指令集堆

ARM汇编基本指令:

        https://blog.csdn.net/weixin_/article/details/

Android与ARM处理器:

        ARM处理器架构概述

        ARM处理器家族

        Android支持的处理器架构

        ARM/x86/MIPS

原生程序与ARM汇编语言: 

        原生程序逆向初步

        代码混淆技术

        ARM指令集

堆栈指针寄存器sp/堆栈寻址指令(stmfd压栈/ldmfd出栈)

存储器访问指令(str写入数据到存储器中/ldr从存储器中读取数 据到寄存器)

数据处理指令(mov)/带链接跳转指令(bl)

原生程序的生成过程(交叉编译/跨平台编译)

预处理(预处理指令) 编译 汇编 链接

必须了解的ARM知识

        汇编:芯片,高级语言的逆向,中间语言

        分析和修改汇编指令:赋值、跳转、算术运算、移位运算、堆栈操 作、内存读写指令、函数调用约定

        Thumb(16位)、Thumb2(32位)、ARM(32位)

用户模式(usr):

        不分组寄存器(R0-R7)

        分组寄存器(R8-R14)

        传递参数与返回值(R0-R3)

        保存栈顶地址(R13/SP)

        保存函数的返回地址(R14/LR)

        程序计数器R15(PC)

        状态寄存器CPSR

ARM处理器:

        ARM状态(执行32位对齐指令的ARM指令)

        Thumb状态(执行16位对齐的Thumb指令)

ARM汇编语言程序结构:

        完整的ARM汇编程序

        处理器架构定义

        段定义

        注释与标号

        @=>单行注释

        //=>多行注释

汇编器指令

        子程序与参数传递

        R0-R3这4个寄存器用来传递函数调用的第1到第4个参数,超 出的参数通过堆栈来传递

        R0寄存器同时用来存放函数调用的返回值

        被调用的函数在返回前无需恢复这些寄存器的内容

ARM指令集:

        立即寻址(mov r0,#0x123) 

        寄存器寻址(mov r0,r1)

        寄存器移位寻址(mov r0,r1,lsl #0x2)

        LSL(逻辑左移)

        LSR(逻辑右移)

        ASR(算术右移)

        ROR(循环右移)

        RRX(带扩展的循环右移)

        寄存器间接寻址(ldr r0,[r1])

        基址寻址(ldr r0,[r1,#-4])

        多寄存器寻址(ldmia r0,{r1,r2,r3,r4})

堆栈寻址(stmfd sp!,{r1-r7,lr}(入栈保护)/ldmfd sp,{r1-r7,lr}(出栈恢复))

        ldmfa/stmfa

        ldmea/stmea

        ldmfd/stmfd

        ldmed/stmed

块拷贝寻址

        ldmia/stmia

        ldmda/stmda

        ldmib/stmib

        ldmdb/stmdb

相对寻址

        相对寻址以程序计算器pc的当前值作为基地址,指令中的地址 标号作为偏移量,将两者相加之后得到操作数有效地址ARM与 Thum指令集

指令格式

        <opcode>:指令助记符

         {<cond>}:执行条件

        {s}:是否影响cpsr寄存器的值

        {.w}:指令宽度说明符.w表示是32位

        {.n}:指令宽度说明符.n表示16位

        <rd>:目的寄存器

        ,<rn>:第一个操作数寄存器

        {,<perand2>}:第二个操作数:立即数、寄存器、寄存器移位

        eq:相等/z=1

        ne:不相等/标志z=0

        hi:无符号数大于/c=1,z=0   

        cs/hs:无符号数大于或等于/c=1

        cc/lo:无符号数小于/c=0  

        ls:无符号数小于或等于/c=0,z=1

        gt:有符号数大于/z=0,n=v   

        ge:有符号数大于或等于/n=v

        lt:有符号数小于/n!=v   

        le:有符号数小于或等于/z=1,n!=v

        mi:负数/n=1              

        pl:整数或0/n=0

        vs:溢出/v=1           

        vc:没有溢出

跳转指令

        B 无条件跳转

        BL 带链接的无条件跳转

        BX 带状态切换的无条件跳转

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

寄存器访问指令

        ldr(<-)/ldrd

        str(->)/strd

        ldm(->)

        stm(<-)

        push(入栈)/pop(出栈)

        swp

数据处理指令

        数据传送指令(mov)/数据非传送指令(mvn)

算术运算指令

        add/adc

        sub/rsb/sbc/rsc

        mul/mls/mla   umull/umlal smull/smlal smlad/smlsd

        sdiv/udiv

        asr(算术右移指令)

逻辑运算指令

        and/orr/eor   逻辑与/逻辑或/逻辑异或

        bic(位清楚指令)

        lsl/lsr   逻辑左移/逻辑右移

        ror/rrx   循环右移/带扩展的循环右移

比较指令

        cmp/cmn/tst/teq

其他指令

        nop(空操作指令)

        swi(软中断指令)

        mrs(读状态寄存器指令)

        msr(写状态寄存器指令)

ARM指令机器码:

B/BL指令

00001BD0   BEQ loc_1c04

31-28:cond=>0000   

27-25:101

25-24:L=>B:0 /BL:1

23-0:offset:目标地址与该指令的相对偏移

offset:(1c04-(1bd0+8))/4=1011

0000 101 0 000000000000000000001011

0A 00 00 0B

00001BD0 0B 00 00 0A

LDR/STR指令

00001BC0 LDR R2,[R12]

00001BC0 00 20 9C E5

E5 9C 20 00

1110 01 011001 1100 0010 000000000000

cond    1110

指令标识   01

IPUBWL   011001

Rn:R12    1100

Rd:R2      0010

offset:0    000000000000

MOV指令

MOV R1, #0x

56 14 A0 E3

E3 A0 14 56

1110 00 1 1101 0 0000 0001 0100 0

Thumb指令

CPSR寄存器

T位:1-thumb,0-arm

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/232210.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 简单倒计时代码(html时间倒计时代码)

    大家好,又见面了,我是你们的朋友全栈君。

    2022年4月15日
    79
  • Spring Boot 中使用 @Transactional 注解配置事务管理

    Spring Boot 中使用 @Transactional 注解配置事务管理事务管理是应用系统开发中必不可少的一部分。Spring为事务管理提供了丰富的功能支持。Spring事务管理分为编程式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;声明式事务基于AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污染,因此在实际使用中声明式事务用的比较多。

    2022年6月6日
    110
  • 电脑15分钟自动重启_windows一分钟重启解决

    电脑15分钟自动重启_windows一分钟重启解决前言Charles是收费软件,可以免费试用30天。试用期过后,未付费的用户仍然可以继续使用,但是每次使用时间不能超过30分钟,并且启动时将会有10秒种的延时。此时,我们只需网上找一个注册码即可解

    2022年7月31日
    11
  • Mybatis中Like 的使用方式以及一些注意点

    做一个积极的人编码、改bug、提升自己我有一个乐园,面向编程,春暖花开!模糊查询在项目中还是经常使用的,本文就简单整理Mybatis中使用Like进行模糊查询的几种写法以及一些常见的问题。使用Springboot简单配置一下Mybatis,然后进行说明。Springboot集成Mybatis这里就不做介绍了。初始数据方式一在Mybatis中的第一种写法: <!–有sq…

    2022年2月28日
    47
  • navicat生成激活码错误-激活码分享

    (navicat生成激活码错误)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlS3…

    2022年3月26日
    68
  • python allure报告_Pytest+Allure 定制报告

    python allure报告_Pytest+Allure 定制报告前言:最近在研究接口自动化的框架,好的测试报告在整个测试框架起到至关重要的部分。终于被我发现一个超好用的报告框架,不仅报告美观,而且方便CI集成。就是它,就是它:AllureTestReport!!!先上一张报告效果图:python版本及必要库python3.5pytest3.3.3pytest-allure-adaptor1.7.9一、环境配置安装Python依赖库:pip3…

    2022年7月26日
    21

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号