lw

lw

RISC-V 어셈블리 참조

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

인코딩 형식

R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode

설명

lw는 메모리에서 레지스터로 값을 복사합니다. 32개의 레지스터는 프로세서의 작고 빠른 작업 영역을 형성합니다. 메모리는 그 옆에 큰 저장소로 자리합니다. 즉, 배열, 텍스트, 변수를 담는 번호가 매겨진 슬롯의 긴 행입니다. 슬롯의 번호가 그 주소입니다. 계산은 레지스터에서 이루어지고, 데이터는 사용 사이에 메모리에서 대기합니다.

RISC-V는 레지스터에 대해서만 산술 연산을 수행하고 메모리에 직접 수행하지 않으므로, 값은 사용 전에 레지스터에 로드되고 사용 후에 다시 저장되어야 합니다. lw가 그 로드를 수행합니다. 이름은 load word를 의미하며, 워드는 32비트 값으로 레지스터 하나의 너비입니다.

lw의 형식은 아래에 나타나 있습니다. rs1의 값, 즉 베이스라고 불리는 메모리 주소를 담은 레지스터의 값을 취하고, offset이라는 작은 상수를 더한 다음, 결과 주소에 있는 값을 목적지 레지스터 rd로 읽어들입니다.

lw rd, offset(rs1)

다음 줄은 t0의 주소에서 8바이트 떨어진 값 8을 로드합니다.

lw t1, 8(t0)

RISC-V 매뉴얼은 RISC-V를 로드-스토어 아키텍처라고 부릅니다. 메모리에 도달하는 명령어는 로드와 스토어뿐이며, 산술 명령어는 레지스터만을 대상으로 작동합니다. 주소 공간은 32비트이고 바이트 주소 지정 방식이며, 로드의 유효 주소는 레지스터 rs1에 부호 확장된 12비트 오프셋을 더한 것입니다. 실행 환경, 즉 프로그램이 실행되는 시스템은 메모리가 최하위 바이트를 먼저 저장하는지(리틀 엔디언이라고 함) 또는 최상위 바이트를 먼저 저장하는지(빅 엔디언이라고 함)를 결정합니다. 접근의 주소가 접근의 크기(워드의 경우 4바이트)로 균등하게 나누어질 때 그 접근은 자연 정렬되어 있습니다. 자연 정렬된 접근은 정렬 오류를 발생시키지 않습니다. 정렬되지 않은 접근은 환경이 정의하는 대로 동작하며 매우 느리게 실행될 수 있습니다.

오프셋이 존재하는 이유는 메모리 내의 항목들이 규칙적인 간격으로 위치하기 때문입니다. 워드는 4바이트이므로 배열의 연속된 요소들은 4바이트 떨어져서 오프셋 0, 4, 8 등에 위치합니다. la는 배열의 시작 주소를 레지스터에 배치하고, 오프셋을 변경하면 서로 다른 요소를 읽습니다. 예제는 배열의 이웃한 두 값을 로드합니다. 오프셋 0은 첫 번째 값 10을 주고, 오프셋 4는 다음 값 20을 줍니다.

예시

.data
arr: .word 10, 20
.text
la t0, arr
lw t1, 0(t0)   # t1 = 10
lw t2, 4(t0)   # t2 = 20