4.1.3. 가상 레지스터

인라인 어셈블러에서 ARM 프로세서의 물리 레지스터에 직접 액세스할 수 없습니다. 인라인 어셈블러 명령에서 ARM 레지스터 이름이 피연산자로 사용되는 경우 물리 ARM 레지스터가 아니라 이름이 같은 가상 레지스터에 대한 참조가 됩니다.

컴파일러는 최적화 및 코드 생성 중에 각 가상 레지스터에 물리 레지스터를 적절히 할당합니다. 그러나 어셈블된 코드에 사용된 물리 레지스터는 명령어에 지정된 것과 다를 수 있습니다. 이러한 가상 레지스터는 명시적으로 기본 C 또는 C++ 변수로 정의할 수 있습니다. 가상 레지스터가 정의되지 않으면 컴파일러에서 가상 레지스터에 대한 암시적 정의를 제공합니다.

컴파일러에서 정의한 가상 레지스터에는 함수 지역 범위가 있습니다. 즉, 단일 함수 내에서는 같은 가상 레지스터 이름을 참조하는 여러 개의 asm 문이나 선언이 해당 가상 레지스터에 액세스합니다.

가상 레지스터는 sp (r13), lr (r14) 및 pc (r15) 레지스터에 대해 생성되지 않으며 인라인 어셈블리 코드에서 읽거나 직접 수정할 수 없습니다. 소스 코드를 수정할 수 있는 방법에 대한 자세한 내용은 sp, lr 또는 pc에 액세스하는 레거시 인라인 어셈블러를 참조하십시오.

가상 PSR(프로세서 상태 레지스터)은 존재하지 않습니다. PSR에 대한 참조는 언제나 물리 PSR에 대한 참조가 됩니다.

각 명령어에 사용된 실제 레지스터는 이전 버전의 컴파일러와 다를 수 있지만 이전에 문서화된 가이드라인을 따르는 기존 인라인 어셈블러 코드는 계속 이전과 같은 함수를 실행합니다.

각 가상 레지스터의 초기 값은 예측할 수 없습니다. 가상 레지스터는 먼저 작성한 다음 읽어야 합니다. 가상 레지스터를 작성하기 전에 읽으려고 시도하면 컴파일러에서 오류 메시지가 생성됩니다. 변수 r1과 연관된 가상 레지스터를 읽으려고 시도하는 경우를 예로 들 수 있습니다.

오류:  #549: 값을 설정하기 전에 변수 "r1"을 사용했습니다.

또한 C 또는 C++ 코드에서 변수 이름을 명시적으로 선언해야 합니다. C 또는 C++ 변수를 명령어 피연산자로 사용하는 것이 좋습니다. 가상 또는 물리 레지스터 이름을 처음 사용할 때 경고가 나타납니다. 각 변환 단위에 한 번만 나타납니다. 예를 들어 레지스터 r3을 지정하면 다음 경고가 표시됩니다.

경고 #1267-D: 암시적 물리 레지스터 R3은 변수로 정의해야 합니다.
Copyright © 2002-2006 ARM Limited. All rights reserved.ARM DUI 0205GK
Non-Confidential