以下说明是 IDA 对 AARCH64 二进制文件进行反汇编的一部分。虽然很明显#代表纯数字并且[]可能指代 中的元素所指的内存地址[],但我不太明白“,”的作用是什么。我很欣赏以下加载和存储指令的描述。
LDR X1, [X28,#0x10]
STR X0, [SP,#0x30+arg_8]
以下说明是 IDA 对 AARCH64 二进制文件进行反汇编的一部分。虽然很明显#代表纯数字并且[]可能指代 中的元素所指的内存地址[],但我不太明白“,”的作用是什么。我很欣赏以下加载和存储指令的描述。
LDR X1, [X28,#0x10]
STR X0, [SP,#0x30+arg_8]
这是一个非常标准的程序集语法,并不是 AArch64 特有的。
一般模式如下所示:
[reg, displacement]
(在某些汇编程序中,使用括号代替方括号)
执行的操作大约相当于 C 表达式:
*(reg+displacement)
换句话说,位移被添加到寄存器的值中,结果值被取消引用,就好像它是一个指针一样。对于加载指令(LDR),读取内存并将结果存入目的寄存器;对于存储 (STR),源寄存器的值将写入计算地址处的存储器。
在 SP 引用的情况下,IDA 将原始位移值转换为堆栈变量引用。这样做是为了更容易跟踪整个函数中对堆栈帧相同区域的访问。虽然 SP 值可能会在运行时发生变化,但在每次程序运行时,堆栈变量将存储在与其相同的偏移量处。