这条指令想做什么?
.text:4044A5EC LDR R5, =(unk_40885080 - 0x4044A5F8)
查看 unk_40885080 的值,它在 .data 段中的值为 20。
这条指令想做什么?
.text:4044A5EC LDR R5, =(unk_40885080 - 0x4044A5F8)
查看 unk_40885080 的值,它在 .data 段中的值为 20。
这似乎是 ARM PIC(位置无关)代码,其中地址是相对于程序计数器给出的。Ida 检测到这一点并显示“真实”地址。
不幸的是,你没有在你的单个语句周围发布任何代码,所以我使用我自己的反汇编之一向你展示:
.text:00062454 LDR R3, [R4,#8]
.text:00062458 MOV R0, #0x2C ; ','
.text:0006245C LDR R1, =(unk_218172 - 0x62474) <--- a
.text:00062460 MOV R5, #0
.text:00062464 MOV R2, #4 ; n
.text:00062468 STRB R0, [R3,#0x12]
.text:0006246C ADD R1, PC, R1 <--- b
.text:00062470 LDR R3, [R4,#8]
.text:00062474 ADD R0, R3, #0x30 ; dest
.text:00062478 STR R1, [R3,#8]
.text:0006247C STR R1, [R3,#0x14]
代码将一些值加载到 R1 (a) 中,然后 (b) 将 PC 添加到其中。因此,寄存器的值应该是指向内存的指针,但由于 PC 是稍后添加的,因此在 2645C 加载的值没有任何意义。Ida 检测到 ADD 指令,并以一种让您看到它应该指向的位置的方式显示 LDR 指令。
0x62474 的“更正偏移”不是ADD指令地址的事实是因为处理器内的流水线;在ADD执行的那一刻,下一条指令已经被读取,所以 PC 是指令所在的“后面”的两条指令ADD。
(编译器产生这种代码的原因是,当相同的代码稍后被加载到不同的地址时,它仍然有效,即使没有重定位修补链接器/加载器也必须这样做。这称为 PIC,或位置-独立代码。)