2011-10-17 1 views
6

이 어셈블리 코드 블록을 해독하는 데 문제가 있습니다. r1의 가치는 결국 무엇이며 어떻게 될까요? movt 다음팔 어셈블리의 movw 및 movt

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 레지스터에 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) 
+0

이 경우 해당 값 또는 r1은 무엇이 될 것입니까? – user1000039

+3

설명의 어떤 부분에 어려움이 있습니까? –

+0

마지막 두 비트. 그래서 pc에 r1을 추가하고 * (r1 + 0). PC의 가치는 무엇입니까? 그리고 *는 C++ (deference 연산자)에서와 같은 것을 의미합니까? – user1000039