대상 주소를 레지스터에로드해야합니다. 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, =val
은 Gnu 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을 사용하고있는 것으로 추측합니다.