1. Memory Operand
- 보통 메모리는 혼합된 데이터(배열, 구조체, 동적할당 등)을 위해 사용된다.
- Arithmetic Operation을 위해 Register Operand를 사용하려면,
- 가장 먼저 Memory의 데이터를 Register로 Load 해야한다.
- 그리고 Register에서 연산하고, 결과 값을 다시 Memory에 Store한다.
- 이런 구조를 Load - Store 구조라고 한다.
아래 예시를 통해 메모리 오퍼랜드를 사용하는 것에 대해 알아보자.
// C Code :
g = h + A[8];
// MIPS Code :
// g in $s1, h in $s2, A in $3
lw $t0, 32($s3)
add $s1, $s2, $t0
- lw는 Load Word의 준말로 메모리에서 데이터를 가져오는 것을 의미한다.
- 위에서 보다시피 배열 A의 베이스 주소가 $s3에 저장되어있고, A는 integer타입 배열이다.
- 때문에 32($s3)를 사용하는데, 이는 $s3의 베이스 주소에서 32Byte를 더한다는 의미이다.
- 4Byte씩 8번 뒤로 가면 1Word인 A[8]을 얻을 수 있고 이 값을 $t0에 로딩하는 것이다.
// C Code :
A[12] = h + A[8];
// MIPS Code :
lw $t0, 32($s3)
add $t0, $s2, $t0
sw $t0, 48($s3)
- lw는 Load Word, sw는 Store Word이다. sw는 말 그대로 레지스터의 데이터를 메모리에 저장하는 것이다.
- 먼저 A($s3)에서 32만큼 움직여서 A[8]을 $t0에 로드하고, 이 값을 h($s2)와 더해서 다시 $t0에 저장한다.
- 결과 값 $t0를 sw를 통해 48($s3) = A[12]에 저장하는 소스코드이다.
- MIPS는 이렇게 Load - Store Architecture를 따르는 프로세서이다. (Instruction이 직접 Memory 엑세스 X)
- Load Store 방식을 쓰면 lw, sw등 때문에 더 많은 Instruction을 사용하고, 많은 Register를 사용하게 되는데
- Register를 효율적으로 사용(위처럼 다시 $t0 넣어서 공간 절약)하는 것이 굉장히 중요함.
2. 추가적인 명령어
- lb / sb : 메모리에서 1 바이트만 로드 / 저장
- lh / sh : 메모리에서 half word (절반)만 로드 / 저장
- lbu . lhu 등 : Unsigned로 로드 / 저장
- sb나 sh등을 수행하면 right most (오른쪽 끝의) 데이터가 메모리에 저장됨
- lb나 lh등을 수행하면 32비트로 extend하여 저장함 (0000 0011 저장 -> 0000 0000 .... 0000 0011)
3. Reference
'컴퓨터구조' 카테고리의 다른 글
명령어 (7) - 이진 표현법 (0) | 2020.04.08 |
---|---|
명령어 (6) - Immediate 오퍼랜드, 상수 Zero (0) | 2020.04.08 |
명령어 (5) - MIPS 레지스터 (0) | 2020.04.08 |
명령어 (3) - 바이트 주소, 엔디안 (0) | 2020.04.08 |
명령어 (2) - 산술연산, 레지스터 개요 (0) | 2020.04.08 |
명령어 (1) - 개요 (0) | 2020.04.08 |
성능 (4) - 성능 평가의 메트릭 (0) | 2020.02.15 |