어셈블러 소스의 절대 주소에 배치

기술노트 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_var0x20008000에 배치됩니다. 

링킹 과정에서 지정된 섹션을 통해 기호 배치:

다음의 작업을 수행하세요:

  • 어셈블러 소스 코드 상 : 어셈블러 기호를 지정된 섹션과 연결한다.
  • 링커 설정파일 (.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 지시어를 통해 데이터의 절대 배치를 수행할 수 있습니다.
  • 코드의 절대배치 (데이터에도 사용할 수 있음)는 두 단계로 수행됩니다.

모든 제품 이름은 해당 소유자의 상표 또는 등록 상표입니다.

죄송하지만, 당사 사이트에서는 Internet Explorer를 지원하지 않습니다.보다 편안한 사이트를 위해 Chrome, Edge, Firefox 등과 같은 최신 브라우저를 사용해 주시길 부탁드립니다.