返回介绍

20.3 ARM 指令

发布于 2024-10-10 22:32:21 字数 2455 浏览 0 评论 0 收藏 0

逆向者必须能看懂汇编代码,就类似于在调试 Java 层代码的时候一样,必须会 smali 语法。庆幸的是,这两种语法都不是很复杂,知道一些大体的语法和指令就可以了,下面来看看 ARM 指令中的寻址方式、寄存器、常用指令,了解这三个知识点,就会对 ARM 指令有一个大体的了解。

1.ARM 指令中的寻址方式

·立即数寻址

立即数寻址也叫立即寻址,是一种特殊的寻址方式。操作数本身包含在指令中,只要取出指令也就取到了操作数。这个操作数叫做立即数,对应的寻址方式叫作立即寻址。例如:

·寄存器寻址

寄存器寻址是利用寄存器中的数值作为操作数,也称为寄存器直接寻址。例如:

·寄存器间接寻址

寄存器间接寻址就是把寄存器中的值作为地址,再通过这个地址去取得操作数,操作数本身存放在存储器中。例如:

·寄存器偏移寻址

这是 ARM 指令集特有的寻址方式,它是在寄存器寻址得到操作数后再进行移位操作,得到最终的操作数。例如:

·寄存器基址变址寻址

寄存器基址变址寻址又称为基址变址寻址,是在寄存器间接寻址的基础上扩展来的。它将寄存器(该寄存器一般称作基址寄存器)中的值与指令中给出的地址偏移量相加,从而得到一个地址,通过这个地址取得操作数。例如:

·多寄存器寻址

这种寻址方式可以一次完成多个寄存器值的传送。例如:

·堆栈寻址

堆栈是一种数据结构,按先进后出(First In Last Out,FILO)的方式工作,使用堆栈指针(Stack Pointer,SP)指示当前的操作位置,堆栈指针总是指向栈顶。例如:

2.ARM 中的寄存器

R0-R3:用于函数参数及返回值的传递。

R4-R6,R8,R10-R11:没有特殊规定,就是普通的通用寄存器。

R7:栈帧指针(Frame Pointer),指向前一个保存的栈帧(stack frame)和链接寄存器(link register,lr)在栈上的地址。

R9:操作系统保留。

R12:又叫 IP(intra-procedure scratch)。

R13:又叫 SP(stack pointer),是栈顶指针。

R14:又叫 LR(link register),存放函数的返回地址。

R15:又叫 PC(program counter),指向当前指令地址。

3.ARM 中的常用指令含义

ADD:加指令。

SUB:减指令。

STR:把寄存器内容存到栈上去。

LDR:把栈上内容载入一寄存器中。

.W:是一个可选的指令宽度说明符。它不会影响为此指令的行为,它只是确保生成 32 位指令。Infocenter.arm.com 的详细信息。

BL:执行函数调用,并把使 lr 指向调用者(caller)的下一条指令,即函数的返回地址。

BLX:同上,但是在 ARM 和 thumb 指令集间切换。

CMP:指令进行比较两个操作数的大小。

4.ARM 指令简单代码段分析

C 代码:

对应的 ARM 指令:

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文