2011-10-17 362 views
6

我无法破译这个汇编代码块。 r1的价值到底是什么,我将如何到达那里?movw和movt在arm程序集中

3242ba66 f6454118 movw r1, 0x5c18 
3242ba6a  466f mov  r7, sp 
3242ba6c f6c0415a movt r1, 0xc5a 
3242ba70 f2460002 movw r0, 0x6002 
3242ba74 f6c0405a movt r0, 0xc5a 
3242ba78  4479 add  r1, pc 
3242ba7a  4478 add  r0, pc 
3242ba7c  6809 ldr  r1, [r1, #0] 

回答

26

movw后跟一个movt是一个32位值加载到寄存器中的常用方法。这相当于将这两个立即数值或在一起,movt是高16位。在这种情况下,r1 = (movt immediate value << 16) | (movw immediate value))

3242ba66 f6454118 movw r1, 0x5c18 // r1 = 0x5c18 
3242ba6a  466f mov  r7, sp 
3242ba6c f6c0415a movt r1, 0xc5a // r1 = (r1 & 0xffff) | (0xc5a << 16) 
3242ba70 f2460002 movw r0, 0x6002 
3242ba74 f6c0405a movt r0, 0xc5a 
3242ba78  4479 add  r1, pc  // r1 = r1 + pc 
3242ba7a  4478 add  r0, pc 
3242ba7c  6809 ldr  r1, [r1, #0] // r1 = *(r1 + 0) 
+0

那么在这种情况下,这个值或r1是什么? – user1000039

+3

解释的哪一部分是你有困难? –

+0

最后两位。所以将r1添加到pc和*(r1 + 0)。 PC的价值是什么? *是否和C++(deference operator)一样? – user1000039