la의사

la

의사
RISC-V 어셈블리 참조

lyszt.net은 la 및 기타 RISC-V 명령어를 더 자세히 다룹니다.

설명

la는 어떤 것의 주소를 레지스터에 로드합니다. 그 주소는 메모리 위치이며, 그 위치에 저장된 값은 별개의 것입니다. 이 이름은 load address를 나타냅니다.

메모리에 데이터를 예약할 때는 arr이나 msg 같은 이름을 붙이는데, 이렇게 하면 원시 주소 숫자를 추적하지 않아도 됩니다. 그 이름은 레이블, 즉 메모리 주소를 대신하는 읽기 쉬운 표현입니다. 다음 줄은 레이블 arr이 표시하는 주소를 t0에 로드합니다. 배열이 시작되는 위치를 제공할 뿐, 배열의 내용을 읽지는 않습니다.

la t0, arr

로드 및 저장 명령어(lw, sw 그리고 나머지)는 레지스터에 담긴 주소를 받습니다. 이름이 붙은 데이터를 읽거나 쓰려면 먼저 그 주소가 레지스터에 있어야 하며, la가 그것을 그곳에 넣습니다. 값을 읽는 데는 두 개의 명령어가 필요합니다. la는 데이터가 어디에 있는지 찾고, lw는 그곳에 있는 것을 읽습니다.

RISC-V 매뉴얼은 auipc를 pc 상대 주소를 만드는 명령어로 설명합니다. 12비트 오프셋을 가진 로드나 저장이 뒤따르는 auipc는 어떤 32비트 pc 상대 데이터 주소에도 도달할 수 있다고 명시합니다.

주소와 그 내용은 포인터와 값이 다른 것과 같은 방식으로 다릅니다. 주소가 레지스터에 들어간 뒤에는 거기에 오프셋을 더하여 개별 요소에 접근합니다. 예제는 텍스트 조각의 주소를 a0에 로드하는데, 이것이 print-string 서비스가 요구하는 것입니다. 그 서비스는 텍스트가 어디에 있는지 알려주어야 하며, 그곳에서 텍스트를 읽습니다. la는 어셈블러가 실제 명령어 몇 개로 만들어 내는 의사 명령어입니다.

확장 대상

auipc rd, hi(label)
addi  rd, rd, lo(label)

어셈블러는 이 의사 명령을 위에 나열된 실제 명령 또는 명령들로 대체합니다.

예시

.data
msg: .string "hi"
.text
la a0, msg     # a0 = address of msg