2013-11-15 4 views
2

현재 Cortex-M3 마이크로 컨트롤러에서 어셈블러를 사용하고 있습니다. 이것이 중요한지 나는 확신하지 못하지만 여기에 간다.절대 주소에 데이터 쓰기

메모리의 특정 주소에 값을 써야합니다.

LDR  R4, =__cs3_interrupt_vector_cortex_m 
STR  R4, [=VTOR] 

하지만이 PC 레지스터에 VTOR 주소 상대를 참조 할 필요가처럼 보인다 : 여기에 내가 시도하는 것이다. 질문은 주소 상대를 참조하지 않는 방법이 있고 이것이 자동적으로하도록 내버려 두는 것입니다 (기본적으로 접근 방법과 비슷할 것입니다).

저는 GNU 어셈블러를 사용하고 있습니다.

답변

4

대상 주소를 레지스터에로드해야합니다. VTOR은 메모리 주소 또는 'C'포인터이고 __cs3_interrupt_vector_cortex_m은 상수라고 가정합니다. 즉, 주소에 32 비트 상수를 쓰려고합니다. 이 다음의 경우 경우,

; Get value __cs3_interrupt_vector_cortex_m to r4 
ldr r4, =__cs3_interrupt_vector_cortex_m 
ldr r5, =VTOR ; address 'VTOR' to r5. 
str r4, [r5] ; write the constant to 'VTOR' address. 

는 ARM은/엄지/Thumb2는 로드 매장 아키텍처입니다. 로드 및 저장 명령어에는 메모리 피연산자를 사용할 수 없습니다. 이는 CPU 설계를 단순화하지만 M68K 및 x86 어셈블러와 다릅니다.

구문 ldr rX, =valGnu assembler info pages에 설명되어 있습니다. 일반적으로는

ldr rX, [pc, #offset] 
... 
offset: .word val ; your constant is stored here. 

의사 연산 .ltorg는 문자 테이블을 덤프하도록 어셈블러에 지시, 다음으로 변환됩니다; 오프셋 코드 부분. 당신은 당신은 같은 구문 str r4,[=VTOR]을 사용할 수 없습니다 등

, 서브 루틴 사이에 어디 .ltorg을 추가 할 수 있습니다 구문은 ldr와 함께 사용하기위한 짧은 컷 같습니다. 예를 들어,

ldr rX,=7   ; is really 'mov rx,#7' in all modes. 
ldr rX,=0xff  ; is 'mov rx,#0xff' for ARM and '[pc,#offset]' for thumb. 
ldr rx,=0x12345678 ; will use the [pc, #offset] for all modes. 

당신은 레지스터에 주소를 얻기 위해 ldr rX,=VTOR 구문을 사용할 수 있습니다. 그런 다음 실제로 주소에 쓰려면 str rY, [rX]과 같은 다른 명령어를 사용합니다.

상수는 명령어 내에서 인코딩되므로 상수 범위는 특히 손가락 모드에서 매우 제한됩니다. 나는 당신이 thumb2을 사용하고있는 것으로 추측합니다.