
ARM汇编
文章平均质量分 63
beyond702
这个作者很懒,什么都没留下…
展开
-
ARM汇编名词
指令:BL:branch-with-link寄存器:PC:Program CounterLR:link registerCPRC:co-processor register candidate其他:AAPCS:procedure call standard for arm architecture原创 2016-04-25 19:03:09 · 632 阅读 · 0 评论 -
Arm汇编学习笔记(六)——函数调用栈空间以及fp寄存器
Arm上函数调用的规则在ARM System Developer's Guide文档中的ATPCS部分有详细的定义,这里主要通过函数调用过程中函数栈的情况来说明fp和sp等寄存器的作用。有关ATPCS的详细内容可以去文档中看。fp叫做frame pointer寄存器,即栈帧指针寄存器;sp叫做stack pointer寄存器,即栈指针寄存器。那么它们具体的作用是什么呢?首先,大家知原创 2016-08-17 12:44:12 · 28878 阅读 · 2 评论 -
Arm汇编学习笔记(七)——ARM9五级流水及流水线互锁
本文主要是通过分析五级流水及流水线互锁的原理,从而可以编写出更加高效的汇编代码。1. ARM9五级流水线ARM7采用的是典型的三级流水线结构,包括取指、译码和执行三个部分。其中执行单元完成了大量的工作,包括与操作数相关的寄存器和存储器读写操作、ALU操作及相关器件之间的数据传输。这三个阶段每个阶段一般会占用一个时钟周期,但是三条指令同时进行三级流水的三个阶段的话,还是可以达到每个周原创 2016-08-17 17:26:06 · 10632 阅读 · 2 评论 -
Arm汇编学习笔记(八)——寄存器的使用
在程序中,我们可以使用16个通用寄存器中的14个来保存自己的数据,r13和r15分别是sp和pc寄存器,我们无法使用。ATPCS规定,栈指针应该是8字节对齐。ATPCS规定,被调用函数必须保证在执行前和执行后r4-r11的内容不变,即被调用函数必须在开始保存r4-r11,返回前再恢复。如下图:可以用下面的保存模版:routine_name原创 2016-08-18 17:23:20 · 3123 阅读 · 0 评论 -
Arm汇编学习笔记(九)——高效的分支代码及非对齐数据的访问
分支代码switch(x)在我们平常的代码中是非常常见的,而且也是比较耗时的操作,如果优化以后可以对代码的效率有很大提升。1. 对于0 此种情况N不能太大,对于下面C代码:int ref_switch(int x){ switch (x) { case 0: return method_0(); case原创 2016-08-19 16:58:19 · 1757 阅读 · 2 评论 -
Arm汇编学习笔记(二)——编写编译并执行依赖外部模块的汇编代码以及PIC代码分析
1. 编译依赖外部模块的汇编代码并执行创建test.S汇编文件,并输入如下内容:.global main.extern printf.textmain: stmfd sp!, {r11, lr} ldr r0, =str bl printf ldmfd sp!, {r11, pc}.datastr:.asciz "Hello asm\n".en原创 2016-08-12 11:43:47 · 1798 阅读 · 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得到以下输出:test.o: file format elf32-litt原创 2016-08-11 11:38:47 · 7998 阅读 · 0 评论 -
Arm汇编学习笔记(三)——GCC内联汇编
之前每次看内联汇编都有一些地方看不明白,"=r","r","%0","%1"这些符号看不明白,本次总结一下这些内容吧,虽然很简单,但是手不能懒!首先,C语言中为什么要内联汇编以及其带来的好处这个我就不说了。C语言中使用汇编要通过函数asm(),即__asm__()的别名,两者是一样的。常见的内联汇编有下面两种形式:asm( "mov r0, r0\n\t" "m原创 2016-08-12 17:34:15 · 13996 阅读 · 0 评论 -
Arm汇编学习笔记(四)——Arm的37个寄存器和异常处理
1. Arm的37个寄存器看下面这张图:可以看到User和System模式下的R0~R15和CPSR都是相同的寄存器,而在其它特权模式下用灰色三角形标注的那些寄存器,是该特权模式下特有的寄存器,比如在User模式下存入R8值0x50,切换到FIQ模式下存入R8值0x100,再切换回User模式下后,R8寄存器的值还是0x50。这样算一下R0~R15在加上CPSR,然后在加上图中原创 2016-08-12 19:00:55 · 2142 阅读 · 0 评论 -
Arm汇编学习笔记(五)——MOVS及^符号等
1. MOVSMOV一般不影响CPSR, 除非执行类似MOV pc, lr,效果上等同于BX lr,可能会影响到T标志位MOVS总是会影响CPSR, 包括N,Z,C标志位,执行MOVS pc, lr时,CPSR会被SPSR覆盖(内核态,USER和SYSTEM模式下没有SPSR)举例,当USER模式下有一条未定义指令,CPU在译码阶段会发现指令未定义,这时会跳转到相应的处理函数,原创 2016-08-15 11:14:18 · 22105 阅读 · 0 评论 -
Arm汇编学习笔记(前序)——ARM处理器简介
一 ARM处理器与ARM指令集整个ARM处理器被分为三个部分:ClassicEmbeddedApplicationClassic被称为经典系列。ARM1~ARM11一直都以数字来命名,ARM12以后改为用Cortex命名。Cortex有以下几个分类:Cortex-A:广泛用于智能手机、上网本、电子书以及数字电视等。Cortex-M:用于微控制领域,该系列的特原创 2016-08-15 15:03:49 · 875 阅读 · 0 评论 -
Arm的几种工作模式和工作状态
转载地址:http://blog.chinaunix.net/uid-28458801-id-3494646.htmlARM处理器工作模式一共有 7 种 :USR 模式 正常用户模式,程序正常执行模式FIQ模式(Fast Interrupt Request) 处理快速中断,支持高速数据传送或通道处理IRQ模式 处理普通转载 2015-11-18 16:31:06 · 27216 阅读 · 0 评论 -
Android Inline hook跳转部分代码
转自看雪帖子:http://bbs.pediy.com/showthread.php?p=1216957求人不如求己阿,已经解决啦!现在放出被注入的SO源码(至于如何注入并查找目标函数,自己去看看古河大哥的libinject);源码主要分为两块:1.用于初始化trampoline和实现自己函数的libservice.cpp2.用于实现trampoline的shellco转载 2016-04-18 17:47:37 · 1430 阅读 · 0 评论 -
Android平台的 Ptrace, 注入, Hook 全攻略
原帖:http://www.aiuxian.com/article/p-1295924.htmlAndroid平台上的Ptrace已经流行很久了,我记得最早的时候是LBE开始使用Ptrace在Android上做拦截,大概三年前我原来的同事yuki (看雪上的古河) 写了一个利用Ptrace注入的例子,被广泛使用,听说他还因此当上了版主,呵呵:Android平台上的注入代码两年前转载 2016-05-11 19:04:06 · 3875 阅读 · 0 评论 -
ARM / Thumb 指令混合编程之代码交织 ( interworking )
原文地址:http://blog.youkuaiyun.com/cfy_phonex/article/details/18698259本文翻译整理自 http://stuff.mit.edu/afs/sipb/project/egcs/src/egcs/gcc/config/arm/README-interworking针对ARM7T处理器,Cygnus GNU Pro Too转载 2016-05-12 11:10:30 · 1959 阅读 · 0 评论 -
学习Arm指令的网站汇总
http://www.fourtheye.org/armasm.shtmlhttp://www.ethernut.de/en/documents/arm-inline-asm.htmlhttp://www.fourtheye.org/cgi-bin/language.pl?language=asmhttp://www.bravegnu.org/gnu-eprog/index.htm原创 2016-04-19 17:47:57 · 878 阅读 · 0 评论 -
ARM CPSR/SPSR 的示意图
原创 2016-04-20 15:12:03 · 2927 阅读 · 0 评论 -
ARM指令在Thumb模式和arm模式之间跳转
根据arm spec, 跳转地址最低位( lsb ) 为0表示 arm 指令;最低位为1表示thumb指令。一、绝对地址跳转进入 thumb模式如下指令可以切换到thumb模式。[cpp] view plain copy print?LDR R6, =0x24000 ADD R6, #1转载 2016-04-20 15:13:47 · 6148 阅读 · 0 评论 -
Arm指令格式
ARM指令的编码格式 实际指令语法格式为: ADDEQS R0,R1,R2; 该指令的编码格式为: ARM指令的助记符 ARM指令在汇编程序中用助记符表示,一般ARM指令的助记符格式为: {} {S} ,, 其中: 操作码,如ADD表示算术加操作指令; {} 决定指令执行的条件域; {S} 决定指令执行是否影响CPSR寄存器的值; 目原创 2016-04-20 15:58:07 · 4579 阅读 · 0 评论 -
如何判断thumb2指令的宽度
thumb2指令同时支持16位和32位,判断方式如下:Bit[15:11]0b111010b111100b11111如果指令的15到11位是如上三种值的话就是32位,相邻两个半字组成一条指令,否则就是16位。C语言判断的宏定义:static inline boolT$32bit$i(uint16_tic) {return((i原创 2016-05-16 10:42:53 · 2722 阅读 · 1 评论 -
ARM汇编初探---汇编代码中都有哪几类指令---ARM伪指令介绍
要学习一个东西首先要把概念搞清楚,下面只是自己的一些关于汇编的理解。可执行文件中的01码是机器码,机器码不等于汇编码,虽然机器码可以很容易翻译成汇编码。汇编码中包含很多汇编指令、伪指令和宏指令等,这些是不可以直接在机器上运行的。机器指令是ARM指令集和Thumb指令集这些arm硬件支持的指令集组成的。汇编码中的伪指令和宏指令这些都是汇编语言这个级别的指令,在汇编文件原创 2016-04-20 18:00:12 · 2214 阅读 · 0 评论 -
ARM汇编伪指令
第一部分 GUN ARM 汇编指令Linux下ARM汇编语法尽管在Linux下使用C或C++编写程序很方便,但汇编源程序用于系统最基本的初始化,如初始化堆栈指针、设置页表、操作 ARM的协处理器等。初始化完成后就可以跳转到C代码执行。需要注意的是,GNU的汇编器遵循AT&T的汇编语法,可以从GNU的站点(www.gnu.org)上下载有关规范。一. Linux汇编行结构转载 2016-04-20 19:33:55 · 2198 阅读 · 0 评论 -
Arm Inline hook的简易原理图
Arm架构下有arm指令和thumb指令之分,不同指令集的hook过程不一样。假设我们要hook libc.so中的execv和read函数,android系统的库应该都加了-mthumb-interworking编译选项,支持thumb/arm的代码交织,所以要区分目标函数是thumb还是arm指令的。用ndk编译自己的代码好像默认的是arm(虽然我网上查的说默认是thumb,但我的库编原创 2016-05-16 16:55:52 · 5980 阅读 · 0 评论