sw

sw

RISC-V 어셈블리 참조

lyszt.net은 sw 및 기타 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

설명

sw는 레지스터에서 값을 가져와 메모리에 씁니다. 이는 lw의 반대입니다. 이름은 store word를 뜻하며, word는 32비트입니다. 로드는 메모리의 데이터를 레지스터로 옮겨 연산할 수 있게 하고, 스토어는 결과를 다시 밖으로 내보냅니다. 산술 연산은 레지스터에서만 일어나므로 이 두 명령어가 RISC-V의 로드, 계산, 스토어 주기를 구성합니다.

sw의 구문은 아래와 같습니다. 피연산자 순서가 대부분의 명령어와 다릅니다.

sw rs2, offset(rs1)

rs2는 쓸 값을 담습니다. 두 번째 피연산자인 offset(rs1)은 메모리 내 목적지 주소, 즉 베이스 레지스터 rs1의 주소에 작은 상수 오프셋을 더한 값을 제공하며, 이는 lw가 사용하는 것과 같은 주소 지정 방식입니다. 아래 줄은 t1의 값을 t0가 가진 주소에 씁니다.

sw t1, 0(t0)

sw는 어떤 레지스터도 변경하지 않습니다. 그 효과는 전적으로 메모리에 미치며, 거의 다른 모든 명령어는 레지스터에 씁니다.

RISC-V 매뉴얼은 sw, sh, sb가 레지스터 rs2의 하위 비트에서 32비트, 16비트, 8비트 값을 메모리에 저장한다고 명시합니다. 유효 주소는 레지스터 rs1에 부호 확장된 12비트 오프셋을 더한 값입니다. 자연스럽게 정렬된 주소에서의 로드와 스토어는 정렬 오류를 결코 일으키지 않으며, 매뉴얼은 이들이 하나의 분할할 수 없는 단계로서 원자적으로 실행됨을 보장합니다.

스토어는 결과를 배열과 변수에 저장하며, 함수는 이를 사용해 스택의 스크래치 공간에 값을 배치합니다. 스토어는 대상 주소의 4바이트 전부를 덮어씁니다. 예제는 99를 메모리의 레이블이 붙은 위치에 쓰고, 그곳에 있던 것을 대체합니다. 레지스터와 달리 메모리는 다른 스토어가 덮어쓸 때까지 그 값을 유지합니다.

예시

la t0, slot
li t1, 99
sw t1, 0(t0)   # memory at slot now holds 99