2011-10-17 17 views
6

Ho problemi a decifrare questo blocco di codice assembly. Quale sarebbe il valore di r1 essere alla fine e come potrei arrivare lì?movw e 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] 

risposta

26

movw seguito da un movt è un modo comune per caricare un valore di 32 bit in un registro. È l'equivalente dell'ORIENTAZIONE di questi due valori immediati insieme, con il movt che è il 16-bit superiore. In questo 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

Quindi, in questo caso, quale sarà il valore o r1? – user1000039

+3

In quale parte della spiegazione hai avuto difficoltà? –

+0

Gli ultimi due bit. Quindi aggiungendo r1 al pc e * (r1 + 0). Quale sarebbe il valore del pc? E * significa la stessa cosa di C++ (operatore di deferenza)? – user1000039