以下 AARCH64 LDR 和 STR 指令究竟做了什么?

逆向工程 艾达 部件 arm64 aarch64
2021-06-15 14:15:22

以下说明是 IDA 对 AARCH64 二进制文件进行反汇编的一部分。虽然很明显#代表纯数字并且[]可能指代 中的元素所指的内存地址[],但我不太明白“,”的作用是什么。我很欣赏以下加载和存储指令的描述。

LDR             X1, [X28,#0x10]
STR             X0, [SP,#0x30+arg_8]
1个回答

这是一个非常标准的程序集语法,并不是 AArch64 特有的。

一般模式如下所示:

[reg, displacement]

(在某些汇编程序中,使用括号代替方括号)

执行的操作大约相当于 C 表达式:

*(reg+displacement)

换句话说,位移被添加到寄存器的值中,结果值被取消引用,就好像它是一个指针一样。对于加载指令(LDR),读取内存并将结果存入目的寄存器;对于存储 (STR),源寄存器的值将写入计算地址处的存储器。

在 SP 引用的情况下,IDA 将原始位移值转换为堆栈变量引用。这样做是为了更容易跟踪整个函数中对堆栈帧相同区域的访问。虽然 SP 值可能会在运行时发生变化,但在每次程序运行时,堆栈变量将存储在与其相同的偏移量处。