Register Address: [Xn | sp]
이 방법은 레지스터 Xn or sp에 포함되는 메모리 주소에 접근하는데 사용된다. [Xn]은 메모리 안의 주소처럼 레지스터의 내용을 사용하는 메모리 접근 표기이다. 즉, 오퍼랜드로 레지스터 값을 사용하는 방법이다.
ldr x3, [x2]
메모리 주소처럼 레지스터 x2의 내용을 사용하여 그 주소에서 시작하여 8바이트 데이터를 레지스터 x3에 적재한다.
([X2]는 메모리 주소를 가리키며 메모리 접근에 사용된)
ldr x3, x2
단순히 레지스터 X2의 값을 X3에 적재한다
Signed Immediate Offset: [Xn | sp, <±imm9>]
Signed Immediate offset은 Xn 이나 sp의 내용에 더해지거나 빼진다. 결과는 적재되거나 저장되는 항목의 주소처럼 사용된다. 이 방법은 상대적인 주소 계산을 수행하는 데 유용하며 오프셋 값을 양수와 음수로 표현할 수 있어 프로그램 흐름 제어나 메모리 접근과 같은 작업에 유연성을 제공한다.
ldur x0, [x1, #0x50]
레지스터 x1의 내용에 0x50을 더하여 메모리 주소를 계산한다. 그런 다음 계산된 메모리 주소에서 시작하여 8바이트 데이터를 레지스터 x0에 로드한다.
Unsigned Immediate Scaled Offset: [Xn | sp, <±imm9>]
오퍼랜드에 부호 없는(unsigned) 오프셋 값을 사용하고, 해당 오프셋 값을 정해진 비트 수만큼 좌측 시프트한 결과를 사용하여 주소를 계산한다. scaled는 주소 지정 모드에서 사용되는 용어로, 오프셋 값을 비례적으로 확장하거나 축소하는 데 사용된다. scaled offset은 오프셋 값을 정해진 비율로 확장하거나 축소하는 것을 의미한다.
또한 이 방법은 Signed Immediate Offset의 구문과 동일하다. 하지만 immediate 값의 가능한 범위가 다르다. 프로그래머는 이 모드를 사용하는 것에 걱정할 필요가 없는데, 프로그래머는 단순히 immediate 값처럼 오프셋을 지정한다. 어셈블러는 지정된 immediate 오프셋 값에 따라 signed immediate offset인지 unsigned immediate scaled offset인지 자동으로 선택할 것이다.
Pre-indexed Immediate Offset: [Xn | sp, #±<imm9>]!
메모리 주소는 Xn 또는 sp에 저장된 숫자에 unshifted signed 9비트 immediate를 추가하여 계산한다. Xn은 메모리 주소를 포함하도록 설정된다. 이 방법은 각 요소에 접근하기 전에 다음 배열의 요소의 포인터를 업데이트하여, 배열의 요소를 단계별로 실행하는데 사용된다.
ldr x0, [x1, #5]!
1. 레지스터 x1에 저장된 주소에서 오프셋 값 5를 더하여 주소를 계산한다
2. 계산된 주소에 있는 데이터를 메모리에서 로드하여 레지스터 x0에 저장한다.
3. 주소 계산의 결과는 레지스터 x1에 반영되어 이후의 명령어에 사용할 수 있다.
(!이 없는 "ldr x0, [x1, #5]"는 주소 계산 결과가 x1에 반영되지 않는다)
Post-indexed Immediate Offset: [Xn | sp], #±<imm9>
레지스터 Xn 또는 sp는 적재되거나 저장되는 값의 주소처럼 사용된다. 값이 적재되거나 저장된 후에 Xn의 값은 ± unshifted immediate offset을 더하여 업데이트한다. 이 방법은 Pre-indexed Immediate offset처럼 배열에서 사용할 수 있다.
Register Offset: [Xn | sp, Rm, <option>]
Rm은 확장되거나 이동된 다음 Xn 혹은 sp에 더해진다. 결과는 적재되거나 저장되는 항목의 주소처럼 사용된다.<Option의 종류>
1. LSL(Logical Shift Left): 왼쪽 시프트 연산 수행. ex) LSL #2는 2비트 좌측 시프트(곱하기 4)
2. LSR(Logical Shift Right): 오른쪽 시프트 연산 수행. ex) LSR #2는 2비트 우측 시프트(나누기 4)
3. ASR(Arithmetic Shift Right): 부호를 유지하며 오른쪽 시프트 연산 수행(즉 맨 왼쪽의 부호는 유지됨)
4. ROR(Rotate Right): 주어진 값을 오른쪽으로 순환 시프트. ex) ABCD일 때 ROR #2이면 CDAB가
ldr x3, [x2, x1, lsl, #3]
x1의 내용을 왼쪽으로 3비트 이동한다(곱하기 8). 또한 x2의 내용에 결과를 더하고 x3에 8바이트를 적재하는 메모리 안의 주소처럼 합으로 사용한다.
Literal: label
literal load instruction을 사용할 때, 프로그램 카운터(PC)의 1MB 내에 메모리 주소를 계산할 수 있다. 명령의 길이가 4바이트이므로 레이블은 4바이트의 배수인 주소에 있다.
Pseudo load: =<immediate | symbol>
실제로 로드 명령어가 아니며, 어셈블러에 의해 해당 구문이 다른 유효한 로드 명령어로 변환된다. 코드 작성을 단순화하고 가독성을 향상시킬 수 있다. 어셈블러는 가능하다면 mov 명령어를 생성할 것이다. 마찬가지로 immediate 값이나 심볼의 주소는 literal pool이나 literal tabel에 저장될 것이다.
ldr x0, =123
상수 값 123을 로드하여 레지스터 x0에 저장