어셈블러 소스의 절대 주소에 배치
기술노트 17934
아키텍처:
ARM
컴포넌트:
assembler
업데이트:
2021-05-03 오후 2:17
소개
본 기술 노트는 어셈블러 기호를 메모리 절대주소에 배치하는 방법을 설명합니다.
논의
어셈블러 기호를 메모리 절대주소에 두 가지 방법으로 배치할 수 있습니다:
IAR Embedded Workbench for Arm 버전 7.40 (혹은 상위버전)을 통해, ASEGN 지시어를 사용하여 어셈블러 데이터를 배치합니다.
링킹 과정에서 지정된 섹션을 통해 기호 배치.
어셈블러 코드를 배치하려면 다음의 작업이 필요합니다.
- 첫 번째, 어셈블러 소스 코드에서 코드 레이블을 지정된 섹션과 연결합니다.
- 두 번째, 링킹 과정에서 그 지정된 섹션을 메모리 절대주소에 배치합니다.
본 기술노트의 예제 프로젝트
TN_17934_test_project_IAR_Embedded_Workbench_for Arm_8_50_1.zip
ASEGN 지시어를 사용한 데이터 배치:
메모리 주소에 위치한 지정된 절대 섹션의 주소를 ASEGN 지시어를 사용해 시작. 아래 소스 예제와 같이 상수 데이터와 읽기/쓰기 데이터 모두에 사용할 수 있습니다.
ASEGN `.rodata`:CONST:NOROOT,08000H
DATA
my_const:
DC32 42
ASEGN `.bss`:DATA:NOROOT,020008000H
DATA
my_var:
DS8 4
결과적으로 my_const
는 0x8000에 배치되고 my_var는 0x20008000에 배치됩니다.
링킹 과정에서 지정된 섹션을 통해 기호 배치:
다음의 작업을 수행하세요:
- 어셈블러 소스 코드 상 : 어셈블러 기호를 지정된 섹션과 연결한다.
- 링커 설정파일 (.icf) 상 : 지정된 섹션을 메모리 절대주소에 배치.
다음 예제에서 기호 my_func는 섹션 .my_func_section와 연결됩니다.
PUBLIC my_func
SECTION .my_func_section:CODE:NOROOT(1)
THUMB
my_func:
MOV R0,#+32768
LDR R0,[R0, #+0]
BX LR ;; return
REQUIRE my_const
링커 설정파일에 다음의 라인을 추가하면, 지정된 섹션은 (링킹 과정에서) 메모리 절대주소 0x00010000에 배치됩니다.
define symbol __MY_CODE__ = 0x00010000;
place at address mem:__MY_CODE__ { readonly section .my_func_section };
결론
- ASEGN 지시어를 통해 데이터의 절대 배치를 수행할 수 있습니다.
- 코드의 절대배치 (데이터에도 사용할 수 있음)는 두 단계로 수행됩니다.
모든 제품 이름은 해당 소유자의 상표 또는 등록 상표입니다.