일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- programmers
- 컴퓨터구조
- 자동차 대여 기록에서 장기/단기 대여 구분하기 #프로그래머스 #DB #SQL #Mysql #DATE_ADD #TIMESTAMPDIFF
- 산술연산
- 무조건 분기
- SQL #MySQL #데이터베이스 #database #프로그래밍 #DDL #DML #TCL #DB #DBMS #RDBMS
- pseudo
- 특정 옵션이 포함된 자동차 리스트 구하기 #programmers #프로그래머스 #SQL #Mysql
- RV32I
- 명령어
- git bash
- SQL 문법 #SQL #테이블 #스키마 #스키마스 #데이테베이스 #공부
- instruction
- 프로그래머스 #
- 네트워크 #network #운영체제 #OS #면접대비 #대학원 #
- SQL #RDBMS #테이블 #table #row #column #문자형 데이터 #숫자형 데이터 #날짜형 데이터 #관계형 데이터베이스 #DB #데이터베이스 #database #MYSQL #MYSQL 설치 #MYSQL 접속
- programmers #프로그래머스 #C언어
- 조건부 분기
- shift연산
- J-type
- 프로세스 #스레드 #컨텍스트스위칭 #프로그램기초 #IT
- Computer Architecture
- 조건에 부합하는 중고거래 댓글 조회하기 #SQL #Mysql
- 비교연산
- RISC-V
- instrction
- Git 초보
- 메모리접근
- git error 해결
- 분기 명령어
- Today
- Total
juniverse
[RISC-V] RV32I 메모리접근 명령어 본문
[RISC-V] RV32I 메모리접근 명령어
iamjunis 2022. 7. 20. 23:26RISC-V에서 데이터처리 명령어는 source 레지스터를 읽어 연산을 하고, 그 결과를 destination 레지스터에 저장한다.
그런데 컴퓨터를 켜면 CPU 레지스터 파일에는 아무런 데이터도 없는 상태이다. 그래서 메모리에서 데이터를 가져와야 하고 후속 연산을 위해 연산 후 레지스터에 저장된 값을 메모리로 저장하기도 해야 한다.
이렇게 메모리에 있는 데이터를 CPU 레지스터로 읽어오고, CPU 레지스터에 있는 데이터를 메모리로 저장하기 위해 CPU는 메모리접근 명령어를 제공한다.
메모리접근 명령어는 I-type과 S-type 형태로 구성되어 있다.
메모리를 읽을 때, load 명령어를 사용해야 하고 이때 I-type 형태를 사용하고
메모리를 쓸 때는 store 명령어를 사용해야 하고 이때 S-type 형태를 사용해야 한다.
# 메모리 접근 명령어
1) Memory Read(Load) / I-type
- lb rd, imm[11:0](rs1) // load byte
lb x10, 4(x7) // x10 ← mem[x7 + 4]
메모리에서 1-byte를 읽은 후, 32-bit로 sign-extension하고 x10에 저장한다.
- lbu rd, imm[11:0](rs1) // load byte unsigned
lbu x10, 4(x7) // x10 ← mem[x7 + 4]
메모리에서 1-byte를 읽은 후, 32-bit로 zero-extension하고 x10에 저장한다.
signed일 때, sign-extension하고 unsigned일 때, zero-extension해야 읽어온 byte 값의 의미가 그대로 유지된다.
- lh rd, imm[11:0](rs1) // load half-word(1-word = 32-bit = 4-byte이므로 2-byte = 16-bit = half-word)
lh x10, -4(x7) // x10 ← mem[x7 + (-4)]
메모리에서 2-byte(half-word)를 읽은 후, 32-bit로 sign-extension하고 x10에 저장한다.
- lhu rd, imm[11:0](rs1) // load half-word unsigned
lhu x10, -4(x7) // x10 ← mem[x7 + (-4)]
메모리에서 2-byte(half-word)를 읽은 후, 32-bit로 zero-extension하고 x10에 저장한다.
- lw rd, imm[11:0](rs1) // load word
lw x10, -16(x7) // x10 ← mem[x7 + (-16)]
메모리에서 4-byte(word)를 읽은 후, x10에 저장한다.
2) Memory Write(Store) / S-type
- sb rs2, imm[11:0](rs1) // store byte
sb x10, -3(x7) // mem[x7 + (-3)] ← x10[7:0]
x10[7:0] 즉 레지스터 마지막 1-byte를 메모리에 저장한다.
- sh rs2, imm[11:0](rs1) // store half-word
sh x10, -2(x7) // mem[x7 + (-2)] ← x10[15:0]
x10[15:0] 즉 레지스터 하위 2-byte(half-word)를 메모리에 저장한다.
- sw rs2, imm[11:0](rs1) // store word
sw x10, -8(x7) // mem[x7 + (-8)] ← x10[31:0]
레지스터에 있는 4-byte(word)를 메모리에 저장한다.
# Reference
원리부터 설계까지 쉽고 명확한 컴퓨터구조 RISC-V 중심으로 - 서태원 지음 - 도서출판 홍릉
'컴퓨터구조 computer organization and design > RISC-V edition' 카테고리의 다른 글
[RISC-V] Pseudo Instruction (0) | 2022.07.21 |
---|---|
[RISC-V] RV32I 분기 명령어 (0) | 2022.07.21 |
[RISC-V] RV32I 데이터처리 명령어 (0) | 2022.07.20 |
[RISC-V] RV32I Instruction Set (0) | 2022.07.20 |