2011-10-17 5 views
6

Mam problem z odczytaniem tego bloku kodu zespołu. Jaka byłaby wartość r1 na końcu i jak się tam dostanę?movw i movt w zespole ramienia

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] 

Odpowiedz

26

movw następnie movt jest powszechnym sposobem aby załadować wartość 32 bitów w rejestrze. Jest to równoważnik OR-owania tych dwóch bezpośrednich wartości razem, przy czym movt jest górną 16-bitową. W tym przypadku, 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

Jaka jest w takim razie wartość lub r1? – user1000039

+3

Z jaką częścią wyjaśnienia masz problemy? –

+0

Ostatnie dwa bity. Więc dodajemy r1 do pc i * (r1 + 0). Jaka byłaby wartość PC? A czy * oznacza to samo, co w C++ (operator szacunku)? – user1000039