Android与ARM处理器
反射调用Java层方法
反射获取Java层字段的值
JNI动态注册
在ARM汇编中,所有标号都必须在一行顶格书写,且后面不需要添加高级语言所用的冒号,而所有的指令都不能顶格书写。ARM汇编器对标识符的大小写敏感,书写标号和指令时,字母大小写必须一致。在ARM汇编程序中,一条ARM指令、伪指令或寄存器名,可以全部为大写字母,也可以全部为小写字母,但不能大小写混合编写使用。注释使用“;”(分号),注释内容由“;”(分号)开始到此行结束,注释可以在一行的顶格书写。
标准的ARM指令格式为:[标号] <指令|条件|S> <操作数>[;注释]
源程序中允许有空行,适当的插入空行可以提高源代码的可读性。如果单行太长,可以使用字符“\”将其分行,“\”后不能有任何字符,包括空格和制表符等等。对于变量的设置,常量的定义,其标识符必须在一行的顶格书写。
汇编指令正确的例子和错误的例子如下:
正确的例子:
错误的例子:
ARM 汇编中,符号可以代表地址、变量、数字常量,当符号代表地址时又称为标号,符号就是变量的变量名、数字常量的名称、标号,符号的命名规则如下:
1.符号由大小写字母、数字以及下划线组成;
2.除局部标号以数字开头外,其它的符号不能以数字开头;
3.符号区分大小写,且所有字符都是有意义的;
4.符号在其作用域范围内是唯一的;
5.符号不能与系统内部或系统预定义的符号同名;
6.符号不与指令助记符、伪指令同名。
常量有数字常量、字符常量、布尔常量三种。
十进制数,如:12,5,876,0;
十六进制数,如:0x4387,0xFF0, 0x1;
n 进制数,用n-XXX 表示,其中n 为2~9,XXX 为具体的数。如2-010111,8-4363156等。
字符常量由一对单引号及中间字符串表示,标准C 语言中的转义符也可使用。如果需要包含双引号或 , 必 须 使 用 " " " " 和 ,必须使用""""和 ,必须使用""""和 代 替 。 例 如 : H e l l o S E T S " H e l l o W o r l d ! " E r r o r l S E T S " T h e p a r a m e t e r " " V F H " " e r r o r 代替。 例如:Hello SETS "Hello World!" Errorl SETS "The parameter ""VFH""error 代替。例如:HelloSETS"HelloWorld!"ErrorlSETS"Theparameter""VFH""error$2"
布尔常量的逻辑真为{TRUE},逻辑假为{FALSE}。
例如:testno SETS {FALSE}
ARM是指令的基本格式为:
{} {s} , {,}
其中<>号内的项是必须的,{}号内的项是可选的。
各项说明如下:
opcode: 指令助记符
cond: 执行条件
s: 是否影响CPSR寄存器的值
Rd: 目标寄存器
Rn: 第一个操作数的寄存器
operand2: 第二个操作数
条件码“cond”的使用可以实现高效的逻辑操作(节省跳转和条件语句),提高代码效率。所有的ARM指令都可以条件执行,而THUMB指令只有B(跳转)指令具有条件执行功能。如果指令不标明条件代码,将默认为无条件(AL)执行。
ARM指令一般分为5个域:
上述指令的5个域为:0000 0010 1001 0001 0000 0000 0000 1000
条件的指令执行中,cond有4位,共16种组合,跟CPSR配合决定指令是否执行,如下表所示。
例如:指令ADDEQ R4,R3,#1,带EQ标志位,只有CPSR当中的Z位置才执行该指令。
其中,条件后缀和S后缀的关系如下:
1.如果既有条件后缀又有S后缀,则书写时S排在后面,如ADDEQS R1,R0,R2该指令在Z=1时执行,将R0+R2的值放入R1,同时刷新条件标志位。
2.条件后缀是要测试条件标志位,而S后缀是要刷新条件标志位。
3.条件后缀要测试的是执行前的标志位,而S后缀是依据指令的结果改变条件标志。
通过今天的分享,我们了解了在ARM汇编的规范、指令条件域以及ARM指令的格式: {} {s} , {,},其中<>号内的项是必须的,{}号内的项是可选的。
如果你也对安卓逆向感兴趣。可以加入下方的群,大家一起讨论问题,或者扫描下方二维码关注公众号,关注回复 “安卓逆向” 获取免费教程
安卓逆向交流学习:1139349849
vx:Yjxiaox