Assembly ldr和ldr.w之间的差异

Assembly ldr和ldr.w之间的差异,assembly,arm,thumb,Assembly,Arm,Thumb,我最近不得不调试一个MachO二进制文件,我遇到了以下指令:- ldr.w r4、[r1、r0、lsl#2] 我知道ldr r4,[r1,r0,lsl#2]将r0向左移动两次,将其添加到r1并取消引用结果 ldr.w有何不同?.w是可选的指令宽度说明符。它不会影响指令本身的行为,只是确保生成32位指令。详情请参阅: Thumb-2中的LDR(电脑相关) 可以使用.W宽度说明符强制LDR在Thumb-2代码中生成32位指令。W始终生成32位指令,即使使用16位LDR可以到达目标。 对于正向引用,不

我最近不得不调试一个MachO二进制文件,我遇到了以下指令:-

ldr.w r4、[r1、r0、lsl#2]

我知道
ldr r4,[r1,r0,lsl#2]
将r0向左移动两次,将其添加到r1并取消引用结果


ldr.w有何不同?

.w
是可选的指令宽度说明符。它不会影响指令本身的行为,只是确保生成32位指令。详情请参阅:

Thumb-2中的LDR(电脑相关) 可以使用.W宽度说明符强制LDR在Thumb-2代码中生成32位指令。W始终生成32位指令,即使使用16位LDR可以到达目标。 对于正向引用,不带.W的LDR始终以Thumb代码生成16位指令,即使这会导致使用32位Thumb-2 LDR指令可以到达的目标失败

来自:

可以使用.W宽度说明符强制LDR生成32位 Thumb-2代码中的指令。LDR.W始终生成一个32位 指令,即使使用16位LDR可以达到目标


有手臂和拇指的说明。一些处理器对thumb指令进行了thumb2扩展,其好的、坏的或其他方面与ARM指令类似。有时候,你可能想要一个,却得到了另一个。在thumb中,您当然可以加上.w来表示更宽的32位thumb2指令,而不是16位thumb指令。有时,由于thumb2指令与ARM和thumb2指令相比有很大的局限性,因此语法使您可以很明显地选择哪个指令

还要注意的是,thumb2有不同的风格,在ARMv6和ARMv7之间有很大的不同。我想我数了30-40条ARMv6 thumb2指令和100多条ARMv7 thumb2指令。(如果您正在使用cortex-m3并逐渐习惯,现在尝试使用cortex-m0,您将看到这一点)