汇编语言是一种功能很强的程序设计语言,也是利用计算机所有硬件特性并能直接控制硬件的语言。目前在嵌入式开发、单片机开发、系统软件设计、某些快速处理、位处理、访问硬件设备等高效程序的设计方面有较多应用。
学习安卓逆向,最基础的就是要懂计算机语言,要看得懂程序结构,ARM是其中最为重要的知识点之一,我们今天就来简单谈谈ARM汇编语言程序结构。
一.ARM汇编规范
1.在ARM汇编中,所有的符号都必须在一行书写,在后面不用添加我们高级语言所用的分号。
2.ARM汇编器对标识符的大小写敏感,这个一定要注意,书写符号以及指令是字母大小写一定要一致。
3.在ARM汇编程序中,一条ARM指令,伪指令。寄存器名可以全部写为大写字母,也可以全部为小写字母,但是不能大小写混合编写使用。
4.注释使用(冒号),注释内容由(冒号)开始到执行结束。
[符号] [;注释]
源程序中可以有空行,适量的插入空行可以提高源代码的可读性。
如果单行太长,可以使用字符”\”将其分行,”\”后不能有任何字符,包括空格和制表符等。我们来看两个例子就明白了。
正确的:
错误的:
二.ARM中的符号
在ARM 汇编中,符号可以代表地址、变量、数字常量。
当符号代表地址时又称为标号,符号就是变量的变量名、数字常量的名称、标
号,符号的命名规则如下:
a. 符号由大小写字母、数字以及下划线组成;
b. 除局部标号以数字开头外,其它的符号不能以数字开头;
c. 符号区分大小写,且所有字符都是有意义的;
d. 符号在其作用域范围你必须是唯一的;
e. 符号不能与系统内部或系统预定义的符号同名;
f. 符号不要与指令助记符、伪指令同名。
三.常量
1.数字常数
数字常量有三种表示方式:
十进制数,如:12,5,876,0。
十六进制数,如0x4387,0xFF0, 0x1。
n 进制数,用n-XXX 表示,其中n 为2~9,XXX 为具体的数。
如2-010111,8-4363156等。
2.字符常量
字符常量由一对单引号及中间字符串表示,标准C 语言中的转义符也可使用。
如果需要包含双引号或“”,必须使用“”和”,必须使用“”和$代替。
如下示例:
Hello SETS “Hello World!”
Errorl SETS “The parameter ““VFH””error$$2”
3.布尔常量
布尔常量的逻辑真为{TRUE},逻辑假为{FALSE}。如下示例:testno SETS {FALSE}
四.ARM指令的格式
指令的基本格式及说明:
ARM是三地址指令格式,指令的基本格式为:
{}{s},{,}
其中<>号内的项是必须的,{}号内的项是可选的。
各项说明如下:
opcode: 指令助记符
cond: 执行条件
s: 是否影响CPSR寄存器的值
Rd: 目标寄存器
Rn: 第一个操作数的寄存器
operand2: 第二个操作数
条件码“cond”的使用可以实现高效的逻辑操作(节省跳转和条件语句),提高代码效率。所有的ARM指令都可以条件执行,而THUMB指令只有B(跳转)指令具有条件执行功能。如果指令不标明条件代码,将默认为无条件(AL)执行。
五.指令的条件域
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:没有溢出
总结:
ARM汇编的特点:汇编语言,又称为助记符语言。它的大多数指令都是单周期指令;大多数指令都是可以有条件执行的。学好语言只是是学好安卓逆向的基础,一定要脚踏实地,先打好基础再去深入学习。r如果有什么问题或者建议欢迎在评论区留言交流或者私聊沟通哦~