Memory Operands에 대하여
배열, 구조체, 동적 데이터와 같은 복합 데이터 타입은 메인 메모리에서 사용됩니다. 산술 연산을 적용하기 위해서는 메모리에서 값을 레지스터로 로드한 다음 연산을 수행해야 합니다. 연산 결과는 레지스터에서 메모리로 저장됩니다. 메모리는 바이트 주소 지정(Byte-addressed)을 사용합니다.
즉, 각 메모리 주소는 8비트 바이트를 식별합니다. 또한, 메모리에서 워드(Word)는 정렬되어 있습니다. 즉, 주소는 4의 배수여야 합니다. MIPS 아키텍처는 Big Endian 방식을 사용합니다. 이는 워드의 가장 중요한 바이트(Most-significant byte)가 가장 작은 주소에 있음을 의미합니다.반면, Little Endian 방식은 가장 적은 주소에 가장 낮은 바이트(least-significant byte)가 존재합니다.
Memory Operand 예시 1
C 코드에서 변수 g는 변수 h와 배열 A의 9번째 원소를 더한 값입니다.
이때, g는 레지스터 $s1에, h는 레지스터 $s2에, 배열 A의 기본 주소는 레지스터 $s3에 저장됩니다. 이 C 코드는 MIPS 어셈블리어로 컴파일됩니다.
이때, A[8]을 참조하기 위해서는 32바이트의 오프셋(offset)이 필요합니다. 메모리에서 워드는 4바이트이므로, $s3 + 32는 A[8]의 주소를 가리킵니다. 그리고 load word(lw) 명령어를 사용하여 A[8]의 값을 $t0에 로드합니다. 그 후, add 명령어를 사용하여 $s2와 $t0의 값을 더하고, 그 결과를 $s1에 저장합니다.
Memory Operand 예시 2
C 코드에서 배열 A의 13번째 원소는 변수 h와 배열 A의 9번째 원소를 더한 값입니다.
이때, 배열 A의 기본 주소는 레지스터 $s3에, 변수 h는 레지스터 $s2에 저장됩니다. 이 C 코드는 MIPS 어셈블리어로 컴파일됩니다. 이때, A[8]을 참조하기 위해서는 32바이트의 오프셋(offset)이 필요합니다. 메모리에서 워드는 4바이트이므로, $s3 + 32는 A[8]의 주소를 가리킵니다.
그리고 load word(lw) 명령어를 사용하여 A[8]의 값을 $t0에 로드합니다. 그 후, add 명령어를 사용하여 $s2와 $t0의 값을 더하고, 그 결과를 $t0에 저장합니다. 그리고 store word(sw) 명령어를 사용하여 $t0의 값을 배열 A의 13번째 원소에 저장합니다. 이때, 배열 A의 13번째 원소를 가리키기 위해서는 48바이트의 오프셋이 필요합니다. 메모리에서 워드는 4바이트이므로, $s3 + 48은 A[12]의 주소를 가리킵니다.
레지스터 vs 메모리 ?
레지스터는 메모리에 비해 접근 속도가 빠릅니다. 그러나 메모리 데이터를 조작할 때는 로드(load)와 저장(store)가 필요합니다. 이로 인해 더 많은 명령어가 실행되어야 합니다. 따라서 컴파일러는 변수를 가능한 한 많이 레지스터에 저장해야 합니다. 덜 자주 사용되는 변수는 메모리에 저장합니다.
이를 위해 레지스터 최적화(register optimization)가 중요합니다. 레지스터 최적화는 실행 속도를 향상시키고, 메모리 접근을 최소화하여 더 적은 명령어를 실행하도록 합니다. 이를 통해 프로그램 실행 속도를 더욱 향상시킬 수 있습니다.
Immediate Operands
Immediate Operands(즉시 피연산자)는 명령어(instruction) 안에 상수 데이터를 지정하는 것입니다. MIPS 어셈블리어에서는 addi 명령어를 사용하여 레지스터에 상수 값을 더할 수 있습니다.
예를 들어, addi $s3, $s3, 4는 레지스터 $s3에 4를 더합니다. MIPS 어셈블리어에는 뺄셈 즉시 피연산자(subtract immediate instruction)가 없습니다. 따라서 음수 상수를 사용하여 덧셈을 이용하면 됩니다. 예를 들어, addi $s2, $s1, -1은 레지스터 $s1의 값에서 1을 뺀 값을 $s2에 저장합니다. 디자인 원칙 3은 일반적인 경우를 빠르게 처리하는 것입니다. 즉, 작은 상수 값은 자주 사용되므로, 즉시 피연산자를 사용하여 상수 값을 로드하는 명령어를 줄일 수 있습니다. 이를 통해 명령어 실행 속도를 더욱 빠르게 할 수 있습니다.
상수 0 - The Constant Zero
MIPS 레지스터 0($zero)은 상수 0으로 고정되어 있어서 덮어쓸 수 없습니다. $zero 레지스터는 일반적인 연산에서 사용되어 지정된 레지스터로 값을 복사하거나, 레지스터에서 값을 로드하는 데 사용됩니다. 예를 들어, 레지스터 $s1에서 값을 가져와 레지스터 $t2에 저장하려면 add $t2, $s1, $zero 명령어를 사용할 수 있습니다. 이를 통해 레지스터 사이의 값을 쉽게 이동할 수 있습니다. 상수 0은 또한 논리 연산, 비교 연산, 산술 연산을 수행할 때 유용하게 사용됩니다.
결론
1년전에 한 내용 복습하면서 정리하려하니까 머리아프네요... 미리미리 해야지 몸이 모자라면 머리가 고생한다
다음 시간에는 mips에서 사용하는 정수에 대한 내용이 정리 될 것 같습니다 2진수.. 16진수 등등
'컴퓨터.반도체' 카테고리의 다른 글
컴퓨터 구조1 - MIPS 예제 풀이 (Load store shift) (0) | 2023.05.29 |
---|---|
컴퓨터 구조 1 - 보수를 이용한 계산과 MIPS basic (0) | 2023.05.21 |
컴퓨터 구조 1 - MIPS? (1) | 2023.05.17 |
컴퓨터 구조 1 - Reducing Power (0) | 2023.05.16 |
컴퓨터 구조 1 - Instruction Count and CPI (0) | 2023.05.14 |
댓글