I recently had to debug a MachO binary and I came across the following instruction :-
ldr.w r4, [r1, r0, lsl #2]
I understand that ldr r4, [r1, r0, lsl #2]
shifts r0 to the left two times, adds it to r1 and dereferences the result.
How is ldr.w different?
.W
is an optional instruction width specifier. It doesn't affect the behaviour of the instruction as such, it just ensures that a 32 bit instruction is generated. See infocenter.arm.com for details:
LDR (pc-relative) in Thumb-2 You can use the .W width specifier to force LDR to generate a 32-bit instruction in Thumb-2 code. LDR.W always generates a 32-bit instruction, even if the target could be reached using a 16-bit LDR. For forward references, LDR without .W always generates a 16-bit instruction in Thumb code, even if that results in failure for a target that could be reached using a 32-bit Thumb-2 LDR instruction.