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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 联想服务器R630 收集日志

    联想服务器R630 收集日志

    2021年8月30日
    106
  • 缓冲区溢出流程

    缓冲区溢出流程缓冲区溢出流程一、ImmunityDebugger最好以管理员的身份运行Innunitydebugger通常有两种方法可以使用ImmunityDebugger来调试应用程序:确保应用

    2022年7月3日
    38
  • 微信个人号机器人

    微信个人号机器人前段时间公司需求开发一套自定义的微信机器人,需求是可以自批量添加好友,自动聊天,自动回复,发朋友圈,转发语音,以及定时群发等,还可以提取聊天内容,进行数据汇总,what????微信还可以这样做!!调研开发了3个月,3个月啊!!!(主要被各种技术走偏路),终于成功了,都是走过的心酸泪,分享给大家,大家学习完,记得给我点个赞!!!大家一般需求点无非是以下几个需求:1.开发个人微信营销系统2.开发自定义的微信机器人,3.开发微信智能聊天客服系统4.定制行业内的群数据分析功能需求很

    2022年5月7日
    48
  • Firefox浏览器设置字符编码格式

    Firefox浏览器设置字符编码格式

    2021年9月25日
    182
  • pycharm编译器设置_bash python

    pycharm编译器设置_bash python第一步:安装flake8运行cmd.exe,直接输入:pipinstallflake8安装完成后,用flake8-h检查是否安装成功第二步:配置打开pyCharm,在File->Settings->Tools->ExternalTools中点击“+”。Program:$PyInterpreterDirectory$/python Arguments:-mflake8–statistics$Pro…

    2025年11月6日
    2
  • 2021idea激活码【在线注册码/序列号/破解码】「建议收藏」

    2021idea激活码【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月20日
    57

发表回复

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

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