문제
저는 현재 Cortex-M3 마이크로컨트롤러에서 어셈블러를 가지고 놀고 있습니다.이것이 중요한지 잘 모르겠지만 여기 있습니다.
메모리의 특정 주소에 값을 써야 합니다.내가 시도한 것은 다음과 같습니다.
LDR R4, =__cs3_interrupt_vector_cortex_m
STR R4, [=VTOR]
그런데 PC 레지스터를 기준으로 VTOR 주소를 참조해야 할 것 같습니다.문제는 상대 주소를 참조하지 않고 자동으로 수행하도록 하는 방법이 있는지 여부입니다(기본적으로 내 접근 방식처럼 보이도록).
저는 GNU 어셈블러를 사용하고 있습니다.
해결책
레지스터에 대상 주소를 로드해야 합니다.나는 다음과 같이 가정한다 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/Thumb/Thumb2는 로드 스토어 건축학.로드 및 저장 명령어에는 메모리 피연산자를 사용할 수 없습니다.이는 CPU 설계를 단순화하지만 M68K 및 x86 어셈블러와는 다릅니다.
구문 ldr rX, =val
에 설명되어 있습니다. Gnu 어셈블러 정보 페이지.일반적으로 다음과 같이 변환됩니다.
ldr rX, [pc, #offset]
...
offset: .word val ; your constant is stored here.
그만큼 의사 작전 .ltorg
어셈블러에게 리터럴 테이블을 덤프하라고 지시합니다.그만큼 오프셋 위의 코드 부분.다음을 추가할 수 있습니다. .ltorg
서브루틴 사이 어디든 가능합니다.
구문을 사용할 수 없습니다. str r4,[=VTOR]
으로 같음 구문은 다음과 함께 사용하기 위한 지름길일 뿐입니다. 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]
실제로 그 주소에 글을 쓰려고 합니다.
상수는 명령어 내부에 인코딩되므로 특히 명령어의 경우 상수 범위가 매우 제한됩니다. 무지 방법.사용하고 계신 것 같아요 엄지2 더 많은 범위를 가질 수 있습니다.