문제

저는 현재 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 더 많은 범위를 가질 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top