我无法破译这个汇编代码块。 r1的价值到底是什么?我将如何到达那里?
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]
答案 0 :(得分:32)
movw
后跟movt
是将32位值加载到寄存器的常用方法。这相当于将这两个立即值进行OR运算,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)