2.6.1. ADR 및 ADRL을 통한 직접 로드

ADR 명령어 및 ADRL 의사 명령어를 사용하여 데이터 로드를 수행하지 않고 특정 범위 내에 주소를 생성할 수 있습니다. ADRADRL은 프로그램 상대 식, 즉 레이블 주소가 현재 PC에 상대적인 선택적 오프셋이 있는 레이블을 허용합니다.

Note

ADR 또는 ADRL에 사용된 레이블은 동일한 코드 섹션 내에 있어야 합니다. 어셈블러에서는 동일한 섹션의 범위를 벗어난 레이블에 대한 참조에 대해 오류를 발생시킵니다.

Thumb 상태에서 16비트 ADR 명령어는 워드로 정렬된 주소만 생성할 수 있습니다.

ADRL은 Thumb-2 이전 프로세서의 Thumb 상태에서 사용할 수 없습니다.

ADR

사용 가능한 범위는 다음과 같은 명령어 세트에 따라 달라집니다.

ARM

바이트 또는 하프워드로 정렬된 주소의 경우, 255바이트

워드로 정렬된 주소의 경우, 1020바이트

32비트 Thumb-2

바이트, 하프워드 또는 워드로 정렬된 주소의 경우, 4095바이트

16비트 Thumb

0 ~ 1020바이트. label는 워드로 정렬되어야 합니다. 이렇게 하려면 ALIGN 지시어를 사용하면 됩니다.

자세한 내용은 ADR을 참조하십시오.

ADRL

어셈블러는 다음을 생성하여 ADRL rn,label 의사 명령어를 변환합니다.

  • 범위 내에 있는 경우 주소를 로드하는 두 개의 데이터 처리 명령어

  • 두 개의 명령어로 주소를 생성할 수 없는 경우 오류 메시지

사용 가능한 범위는 다음과 같이 사용 중인 명령어 세트에 따라 달라집니다.

ARM

바이트 또는 하프워드로 정렬된 주소의 경우, 64KB

워드로 정렬된 주소의 경우 256KB

32비트 Thumb-2

바이트, 하프워드 또는 워드로 정렬된 주소의 경우 1MB

16비트 Thumb

ADRL을 사용할 수 없음

ADRL 의사 명령어 범위를 벗어난 주소를 로드하는 방법에 대한 자세한 내용은 LDR Rd, =label을 통한 주소 로드를 참조하십시오.

ADR을 통한 점프 테이블 구현

Example 2.5에서는 점프 테이블을 구현하는 ARM 코드를 보여 줍니다. 이 예제에서 ADR 의사 명령어는 점프 테이블의 주소를 로드합니다. 이 예제는 주 예제 디렉토리인 install_directory\RVDS\Examplesjump.s로 제공되어 있습니다. 이 예제를 어셈블, 링크 및 실행하는 방법에 대한 자세한 내용은 코드 예제를 참조하십시오.

Example 2.5. 이동 테이블 구현 (ARM)

        AREA    Jump, CODE, READONLY     ; Name this block of code
        ARM                              ; Following code is ARM code
num     EQU     2                        ; Number of entries in jump table
        ENTRY                            ; Mark first instruction to execute
start                                    ; First instruction to call
        MOV     r0, #0                   ; Set up the three parameters
        MOV     r1, #3
        MOV     r2, #2
        BL      arithfunc                ; Call the function
stop
        MOV     r0, #0x18                ; angel_SWIreason_ReportException
        LDR     r1, =0x20026             ; ADP_Stopped_ApplicationExit
        SVC     #0x123456                ; ARM semihosting (formerly SWI) 
arithfunc                                ; Label the function
        CMP     r0, #num                 ; Treat function code as unsigned integer
        BXHS    lr                       ; If code is >= num then simply return
        ADR     r3, JumpTable            ; Load address of jump table
        LDR     pc, [r3,r0,LSL#2]        ; Jump to the appropriate routine
JumpTable
        DCD     DoAdd
        DCD     DoSub
DoAdd
        ADD     r0, r1, r2               ; Operation 0
        BX      lr                       ; Return
DoSub
        SUB     r0, r1, r2               ; Operation 1
        BX      lr                       ; Return
        END                              ; Mark the end of this file

Example 2.5에서 함수 arithfunc는 세 개의 인수를 사용하고 결과를 r0에 반환합니다. 첫 번째 인수는 두 번째 및 세 번째 인수에서 수행되는 연산을 결정합니다.

argument1=0

Result = argument2 + argument3.

argument1=1

Result = argument2 – argument3.

점프 테이블은 다음 명령어와 어셈블러 지시어를 사용하여 구현합니다.

EQU

어셈블러 지시어입니다. 심볼에 값을 제공하는 데 사용됩니다. Example 2.5에서 이 지시어는 값 2를 num에 할당합니다. 표준의 요구 사항에 따라 num이 코드에 사용되면 값 2를 대체합니다. 이 방법으로 EQU를 사용하는 것은 #define을 사용하여 C에서 상수를 정의하는 것과 비슷합니다.

DCD

저장소에 하나 이상의 워드를 선언합니다. Example 2.5에서 각 DCD는 이동 테이블의 특정 절을 처리하는 루틴의 주소를 저장합니다.

LDR

LDR pc,[r3,r0,LSL#2] 명령어는 점프 테이블의 필수 절 주소를 PC로 로드합니다. 이 명령어는 다음을 수행합니다.

  • r0의 절 번호에 4를 곱해 워드 오프셋을 제공합니다.

  • 결과에 점프 테이블 주소를 더합니다.

  • 결합된 주소 내용을 PC로 로드합니다.

Copyright © 2002-2008 ARM Limited. All rights reserved.ARM DUI 0204IK
Non-Confidential