2011-10-17 15 views
6

Tengo problemas para descifrar este bloque de código de ensamblaje. ¿Cuál sería el valor de r1 para el final y cómo llegaría allí?movw y movt in arm assembly

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] 

Respuesta

26

movw seguido de un movt es una forma común para cargar un valor de 32 bits en un registro. Es el equivalente de OR-ing esos dos valores inmediatos juntos, siendo el movt el superior de 16 bits. En este caso, 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

Entonces, en este caso, ¿cuál es ese valor o r1? – user1000039

+3

¿Con qué parte de la explicación estás teniendo problemas? –

+0

Los dos últimos bits. Entonces agregando r1 a pc y el * (r1 + 0). ¿Cuál sería el valor de la PC? ¿Y el * significa lo mismo que en C++ (operador de deferencia)? – user1000039