Arm汇编学习笔记(九)——高效的分支代码及非对齐数据的访问

分支代码switch(x)在我们平常的代码中是非常常见的,而且也是比较耗时的操作,如果优化以后可以对代码的效率有很大提升。 1. 对于0 此种情况N不能太大,对于下面C代码: int ref_switch(int x) { switch (x) { c...

2016-08-19 16:58:19

阅读数 1082

评论数 2

Arm汇编学习笔记(八)——寄存器的使用

在程序中,我们可以使用16个通用寄存器中的14个来保存自己的数据,r13和r15分别是sp和pc寄存器,我们无法使用。 ATPCS规定,栈指针应该是8字节对齐。 ATPCS规定,被调用函数必须保证在执行前和执行后r4-r11的内容不变,即被调用函数必须在开始保存r4-r...

2016-08-18 17:23:20

阅读数 1843

评论数 0

Arm汇编学习笔记(七)——ARM9五级流水及流水线互锁

本文主要是通过分析五级流水及流水线互锁的原理,从而可以编写出更加高效的汇编代码。 1. ARM9五级流水线 ARM7采用的是典型的三级流水线结构,包括取指、译码和执行三个部分。其中执行单元完成了大量的工作,包括与操作数相关的寄存器和存储器读写操作、ALU操作及相关器件之间的数据传输。这三个阶段...

2016-08-17 17:26:06

阅读数 5417

评论数 0

Arm汇编学习笔记(六)——函数调用栈空间以及fp寄存器

Arm上函数调用的规则在ARM System Developer's Guide文档中的ATPCS部分有详细的定义,这里主要通过函数调用过程中函数栈的情况来说明fp和sp等寄存器的作用。有关ATPCS的详细内容可以去文档中看。 fp叫做frame pointer寄存器,即栈帧指针寄存器;sp叫...

2016-08-17 12:44:12

阅读数 13731

评论数 1

Arm汇编学习笔记(前序)——ARM处理器简介

一 ARM处理器与ARM指令集 整个ARM处理器被分为三个部分: ClassicEmbeddedApplication Classic被称为经典系列。 ARM1~ARM11一直都以数字来命名,ARM12以后改为用Cortex命名。Cortex有以下几个分类: Cort...

2016-08-15 15:03:49

阅读数 587

评论数 0

Arm汇编学习笔记(五)——MOVS及^符号等

1. MOVS MOV一般不影响CPSR, 除非执行类似MOV pc, lr,效果上等同于BX lr,可能会影响到T标志位 MOVS总是会影响CPSR, 包括N,Z,C标志位,执行MOVS pc, lr时,CPSR会被SPSR覆盖(内核态,USER和SYSTEM模式下没有SPSR) ...

2016-08-15 11:14:18

阅读数 5883

评论数 0

Arm汇编学习笔记(四)——Arm的37个寄存器和异常处理

1. Arm的37个寄存器 看下面这张图: 可以看到User和System模式下的R0~R15和CPSR都是相同的寄存器,而在其它特权模式下用灰色三角形标注的那些寄存器,是该特权模式下特有的寄存器,比如在User模式下存入R8值0x50,切换到FIQ模式下存入R8值0x100,再切换回User...

2016-08-12 19:00:55

阅读数 1467

评论数 0

Arm汇编学习笔记(三)——GCC内联汇编

之前每次看内联汇编都有一些地方看不明白,"=r","r","%0","%1"这些符号看不明白,本次总结一下这些内容吧,虽然很简单,但是手不能懒! 首先,C语言中为什么要内联汇编以及其带来的好处这个我就不说了。...

2016-08-12 17:34:15

阅读数 5961

评论数 0

Arm汇编学习笔记(二)——编写编译并执行依赖外部模块的汇编代码以及PIC代码分析

1. 编译依赖外部模块的汇编代码并执行 创建test.S汇编文件,并输入如下内容: .global main .extern printf .text main: stmfd sp!, {r11, lr} ldr r0, =str bl printf ldmfd sp...

2016-08-12 11:43:47

阅读数 1096

评论数 2

Arm汇编学习笔记(一)——编写编译并执行简单汇编文件

建立一个test.S文件,并输入以下内容: mov r0, r1 命令行下输入命令: arm-linux-androideabi-as test.S -o test.o 得到test.o 然后输入命令: arm-linux-androideabi-objdump -d test.o 得...

2016-08-11 11:38:47

阅读数 4259

评论数 0

Arm Inline hook的简易原理图

Arm架构下有arm指令和thumb指令之分,不同指令集的hook过程不一样。 假设我们要hook libc.so中的execv和read函数,android系统的库应该都加了-mthumb-interworking编译选项,支持thumb/arm的代码交织,所以要区分目标函数是thumb还是ar...

2016-05-16 16:55:52

阅读数 3551

评论数 0

如何判断thumb2指令的宽度

thumb2指令同时支持16位和32位,判断方式如下: Bit[15:11] 0b111010b111100b11111 如果指令的15到11位是如上三种值的话就是32位,相邻两个半字组成一条指令,否则就是16位。 C语言判断的宏定义: static in...

2016-05-16 10:42:53

阅读数 1826

评论数 1

ARM / Thumb 指令混合编程之代码交织 ( interworking )

原文地址:http://blog.csdn.net/cfy_phonex/article/details/18698259 本文翻译整理自 http://stuff.mit.edu/afs/sipb/project/egcs/src/egcs/gcc/config/arm/REA...

2016-05-12 11:10:30

阅读数 861

评论数 0

Android平台的 Ptrace, 注入, Hook 全攻略

原帖:http://www.aiuxian.com/article/p-1295924.html Android平台上的Ptrace已经流行很久了,我记得最早的时候是LBE开始使用Ptrace在Android上做拦截,大概三年前我原来的同事yuki (看雪上的古河) 写了一个利用Ptrace注入...

2016-05-11 19:04:06

阅读数 1617

评论数 0

ARM汇编名词

指令: BL:branch-with-link 寄存器: PC:Program Counter LR:link register CPRC:co-processor register candidate 其他: AAPCS:procedure call standard for arm archi...

2016-04-25 19:03:09

阅读数 334

评论数 0

ARM汇编伪指令

第一部分 GUN ARM 汇编指令 Linux下ARM汇编语法尽管在Linux下使用C或C++编写程序很方便,但汇编源程序用于系统最基本的初始化,如初始化堆栈指针、设置页表、操作 ARM的协处理器等。初始化完成后就可以跳转到C代码执行。需要注意的是,GNU的汇编器遵循AT&T...

2016-04-20 19:33:55

阅读数 749

评论数 0

ARM汇编初探---汇编代码中都有哪几类指令---ARM伪指令介绍

要学习一个东西首先要把概念搞清楚,下面只是自己的一些关于汇编的理解。 可执行文件中的01码是机器码,机器码不等于汇编码,虽然机器码可以很容易翻译成汇编码。 汇编码中包含很多汇编指令、伪指令和宏指令等,这些是不可以直接在机器上运行的。 机器指令是ARM指令集和Thumb指令集这些arm...

2016-04-20 18:00:12

阅读数 1193

评论数 0

Arm指令格式

ARM指令的编码格式  实际指令语法格式为:  ADDEQS R0,R1,R2;  该指令的编码格式为:  ARM指令的助记符  ARM指令在汇编程序中用助记符表示,一般ARM指令的助记符格式为:  {} {S} ,,  其中:  操作码,如ADD表示算术加操作指...

2016-04-20 15:58:07

阅读数 2192

评论数 0

ARM指令在Thumb模式和arm模式之间跳转

根据arm spec, 跳转地址最低位( lsb ) 为0表示 arm 指令;最低位为1表示thumb指令。 一、绝对地址跳转进入 thumb模式 如下指令可以切换到thumb模式。 [cpp] view plain copy ...

2016-04-20 15:13:47

阅读数 2594

评论数 0

ARM CPSR/SPSR 的示意图

2016-04-20 15:12:03

阅读数 1285

评论数 0

提示
确定要删除当前文章?
取消 删除