基于android的ARM汇编语言基础(from android软件安全与逆向分析 ch6)
STMFD 和 LDMFD 堆栈寻址指令。STMDF把寄存器的值压入堆栈,有时是为了保护原始寄存器的值,以在程序返回时恢复。LDMFD指令用于从堆栈中恢复寄存器的值,作用与STMFD相反。
STR LDR存储器访问指令。存储器指内存地址,即内存单元。arm指令中将存储器用[]表示。如STR R0,[R11,#VAR_8]即将R0寄存器的值保存到栈变量var_8中 (R11的作用是什么?)
MOV用于寄存器间传送数据。
BL带链接的跳转,完成类似于call 的功能,如BL puts 调用puts函数。
Android NDK支持直接使用arm汇编语言编写的以 .s结尾的文件作为程序的源文件。开发人员还可以用c代码与arm汇编代码混合的方法编写原生程序。(这样的话是否可以直接用c程序调用so动态库来达到破解的目的呢。。)
arm汇编语言的一些知识:
arm微处理器共有37个32位寄存器,其中31个为通用寄存器,6个为状态寄存器。arm处理器支持七种运行模式,分别为:
1.用户模式(usr): arm处理器正常的程序执行状态。
2.快速中断模式(fiq):用于高速数据传输或通道处理。
3.外部中断模式(irq):用于通用的中断处理。
4.管理模式(svc):操作系统使用的保护模式
5.数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护。
6.系统模式(sys):运行具有特权的操作系统任务。
7.未定义指令终止模式(und):当未定义的指令执行时进入该模式。


注释: /* ... */(多行) 或 @(单行)
程序中以 . 开头的指令都是汇编器指令,与汇编器相关,不属于arm指令集。
函数调用:arm汇编中规定R0-R3四个寄存器用来传递函数调用的第1到4个参数,超出的参数通过堆栈来传递。R0寄存器同时用来存放函数调用的返回值。被调用的函数在返回前无须恢复这些寄存器的内容。
arm处理器支持九种寻址方式: 立即寻址(MOV R0, #1234); 寄存器寻址(MOV R0, R1); 寄存器移位寻址(MOV R0, R1, LSL#2 指令功能是将R1寄存器左移两位得到的值赋给R0, 即R0=R1*4); 寄存器间接寻址(LDR R0, [R1] 将R1寄存器中的数值作为地址,取出此地址的值赋给R0寄存器);基址寻址(将地址码给出的基址寄存器与偏移量相加,形成操作数的有效地址,将有效地址中的数取出来赋给目标寄存器 LDR R0, [R1, #-4] 将R1寄存器的值减4作为地址,取出此地址的值赋给R0寄存器);
多寄存器寻址:一条指令最多可完成16个通用寄存器值的传送,如:

posted on 2016-01-12 15:43 CarrieSmile 阅读(494) 评论(0) 收藏 举报
浙公网安备 33010602011771号