LOAD : 메모리 -> reg
Store: reg -> 메모리
1 pc 값 0x0000
2 pc 값에 해당하는 명령어를 읽음.
3 lw x2, 4(x5)면 x5에 해당하는 reg의 값에 +4를 해준 주소를 메모리에서 읽어서 메모리의 값을 data_bus를 타고 x2에 써줌.
lw, load기 때문에 memory에서 reg
operation 끗
4 pc값 0x0004가 증가.
5 lw x3, 8(x5)를 가져옴.
6 x5에 해당하는 값에 8을 더해서 0x0018로 만들어줌. data bus를 타고 메모리의 0x0018에 해당하는 겂을 reg x3에 써줌.
7 pc값 0x0008로 증가
8 add x2,x2,x3 가져옴
9 x2, x3를 더해서 x3에 저장하는 process x2의 값에 덮어씀
주소가 8byte마다 1씩 올라감.
32bit로 보면 4씩 올라감.
물리적인게 아니라 가상적인 것임.
word : 32bit를 의미한다..!
CPU가 access한 최소 data의 단위는 1Byte
CPU명령마다 data의 단위가 다름.
Byte(8비트) 단위 LB, SB : char
Half Word(16비트) 단위 (LH, SH) : short , 2Byte
Word 단위 (Lw, SW) : int, 4Byte를 읽어오는 단위
float는 지원안함.
lw rd, address
lw t0, 24(s3)
s3에 저장되어있는 값을 읽어서 걔랑 24를 더한 것이 메모리의 주소
그 메모리 주소의 값을 읽어서 t0에 저장하는 것이 load
t0는 x5, s3는 x19임.
lw는 i type
12bit가 imm : 24
rs1 : 19(x19)라서 // reg source
funct3 : 2 // 이거는 정해짐.
rd : 5 // reg destination
opcode : 3
imm이 24가 rs1의 x19의 값에 더해져서 rd에 값을 써준다.
rs1의 x19의 값은 32bit
imm은 24는 12bit 둘이 더해줘야하는데 bit수 안 맞음
imm의 값에 sing extesion을 진행한다.
s3에 0x0000_0094가 저장되어 있다고 하면, +24해서
0x0000_00ac가 된다. 시작주소가
8bit라고 생각해보면
0x00ac -> 00ad -> 00ae -> 00af
lw가 32bit(4byte)여서 ac에서 af까지 읽음.
af AA
ae BB
ad CC
ae DD
리틀 앤디안, 빅앤디안
보통 리틀 앤디안
MSB
ㅡ
ㅡ
ㅡ
LSB // 이런 스타일임.
12bit -2048에서 2047까지 표현 가능
rs1의 들어있는 값과 imm에 있는 값을 더함.
imm의 표현범위가 -2048~2047까지의 범위 access가능
base addr에서
메모리에 쓰기 위해서 주소와 데이터 필요
sw rs2, address
s type
imm이 나눠져있음
verilog code작성시 concacnation 합쳐야함.
hexadecimal을 보고 표 2개 보고
어셈블리어를 짤 줄 알아야함. 아마 시험
cpp-> complie -> as (assembler) -> linker -> loader
실행파일에는 실행파일이랑 메모리 주소
./add 실행하면
loader에 탁 올라가면서 pc값이 탁탁탁 올라감.
0 + 80 = 80, 80번지에 들어있는 값을 읽어와서 x2라는 reg에 저장
pc값에서 읽어서 명령어가 튀어 나옴.
80은 imm이어서 명령어에 들어있음, 그냥 바로 나옴.
mux가 i type , r type 정해줌.
ALU가 더해서 80이 튀어나옴. 80주소가 들어가면 memory에서 data가 튀어나옴.
readdata에서 튀어나와서 reg file에 다시 저장됨.
1 patch
pc값에 들어가서 명령어를 가져오는 것
2 decode 명령어를 분석해서
ALU로 들어가는 값 대기 시키기
3 ex ALU가 계산해서
4 MEM read data에서 MEM나오는 것
5 WB reg file에 다시 저장됨.
pc값이 나오고
imm에서 84가 나오는데 decode
ALU 계산되는게 exe 84나온느게
store는 쓰는 것 x2에서 data를 가져와서 memory에 써줌. mem
store는 wb가 없음.
add같은 경우는 mem이 없고 store는 wb가 없음
load는 다 있음
single cycle은 문제가 없음
multicycle은 문제가 있음
controller를 fsm으로 설계해야함. 명령어 보고 state machine이 갈 길이 달라짐.
32bit
lw, sw 읽을 수 있는 범위 32bit
2^32 한줄이 8bit, 2^32이니까 4G byte
32g DRAM을 붙여도 4G가만 씀
OS에 맞는 프로그램을 깔아야함.
프로그램을 읽는 주소는 PC
data가 차지하는 영역은 Global과 Dynamic으로 바뀜
Global data는 전역변수
Dynamic은 main 내부, 함수 내부 , stack
GP, Global data
lw x2, 80(GP)
표현가능 범위가 -2048~2047
static 붙이면 전역변수가 댐.
함수 밖으로 나와있는
대부분은 Dynamic으로 들어감.
main, local에 들어가는 애들은 다 stack으로 dynamic data에 들어감.
계산할 data가 많으면 memory에 넣고 다시 끌어와야함.
int, stack에서 위에서부터 저장
malloc은 heap 아래에서 부터 저장
예외 사항이 발생하면 여기있는 코드가 작동 함.