12/21 월 ~ 12/27 일 : 2시간 52분
이번주 계획
1. 10시간 채우려고 했지
이번주 정리
1. 책 내용은 재밌음
2. 목요일부터 열심히 하려했는데 아파버렸음
12/22 화 : 2시간 2분
[ 이 장에서 소개할 MIPS 어셈블리 언어 ]
MIPS operands
- 32 registers, 230 memory words
MIPS assembly language
- Arithmetic, Data transfer, Logical, Conditional branch, Unconditional jump
2.3 피연산자
상위 수준 언어 프로그램과는 달리 산술 명령어의 피연산자에는 제약이 있다.
레지스터(register)라고 하는 하드웨어로 직접 구현된 특수 위치 몇 곳에 있는 것만을 사용할 수 있다.
MIPS 구조에서 레지스터의 크기는 32비트, 개수는 32개
레지스터 개수를 32개로 제한하는 이유는
하드웨어 기술의 바탕이 되는 세 가지 설계 원칙 중 두 번째 원칙에서 찾을 수 있다.
- 설계 원칙 2 : 작은 것이 더 빠르다.
레지스터가 아주 많아지면 전기 신호가 더 멀리까지 전달되어야 하므로 클럭 사이클 시간이 길어진다.
[ 메모리 피연산자 ]
배열이나 구조체같은 복잡한 자료구조에는
레지스터 개수보다 훨씬 많은 데이터 원소가 있을 수 있다.
그렇다면 이런 큰 구조는 컴퓨터 내에서 어떻게 표현되고 또 사용되는가?
프로세서는 소량의 데이터만을 레지스터에 저장할 수 있지만,
컴퓨터 메모리는 수십억 개의 데이터를 저장할 수 있다.
그러므로 배열이나 구조체 같은 자료구조는 메모리에 보관한다.
MIPS의 산술연산은 레지스터에만 실행되므로
메모리와 레지스터 간에 데이터를 주고받는 명령어가 있어야 한다.
이런 명령어를 데이터 전송 명령어 (data transfer instruction)라 한다.
메모리에 기억된 데이터 워드에 접근하려면 명령어가 메모리 주소 (address)를 지정해야 한다.
메모리는 주소가 인덱스 역할을 하는 큰 일차원 배열이다.
메모리에서 레지스터로 데이터를 복사해 오는 데이터 전송 명령을 적재 (load)라 한다.
MIPS에서 이 명령어의 실제 이름은 lw (load word) 이다.
[ 하드웨어 소프트웨어 인터페이스 ]
변수를 레지스터와 연관 짓는 일뿐 아니라
배열이나 구조체 같은 자료구조를 메모리에 할당하는 것도 컴파일러의 임무이다.
프로그램에서 8비트로 구성된 바이트를 많이 사용하므로
대부분의 컴퓨터는 바이트 단위로 주소를 지정한다.
MIPS에서 워드의 시작 주소는 항상 4의 배수이어야 한다.
이러한 요구 사항을 정렬 제약 (alignment restriction) 이라 한다.
정렬 제약 (alignment restriction)
- 메모리 내에서 데이터는 자연스러운 경계를 지켜서 정렬되어야 한다는 요구 조건.
적재와 반대로 레지스터에서 메모리로 데이터를 보내는 명령을 저장 (store) 이라 한다.
저장 명령의 생김새는 적재와 같다.
즉 연산자 이름, 저장할 데이터를 갖고 있는 레지스터, 배열 원소 선택에 사용할 변위, 베이스 레지스터로 구성된다.
MIPS에서 이 명령어의 실제 이름은 sw (store word) 이다.
[ 적재와 저장을 사용한 번역 ]
다음 C 문장을 MIPS 어셈블리 프로그램으로 바꾸어라.
변수 h는 $s2에 할당, 배열 A의 시작 주소는 $s3에 들어있다.
A[12] = h + A[8];
lw $t0, 32($s3) # Temporary reg $t0 gets A[8]
add $t0, $s2, $t0 # Temporary reg $t0 gets h + A[8]
sw $t0, 48($s3) # Stores h + A[8] back into A[12]
[ 하드웨어 소프트웨어 인터페이스]
컴퓨터가 갖고 있는 레지스터보다 프로그램에서 사용하는 변수가 더 많은 경우가 자주 있다.
그러므로 컴파일러는 자주 사용되는 변수를 가능한 한 많이 레지스터에 넣고
나머지 변수는 메모리에 저장했다가 필요할 때 꺼내서 레지스터에 넣는다.
자주 사용하지 않는(또는 한참 후에 사용할) 변수를 메모리에 넣는 일을
레지스터 스필링 (spilling) 이라고 말한다.
좋은 성능을 얻고 에너지를 절약하기 위해서는 컴파일러가 레지스터를 효율적으로 사용하여야 한다.
- 레지스터는 메모리보다 접근시간이 짧고 처리량도 많으므로,
레지스터에 저장된 데이터를 사용하면 시간이 절약되고 사용하기도 간편하다.
- 레지스터 접근은 메모리 접근보다 에너지도 적게 든다.
[ 상수 또는 수치 피연산자 ]
수치 (immediate) 피연산자
- addi $s3, s3, 4 # $s3 = $s3 + 4
2.4 부호있는 수와 부호없는 수
LSB (least significant bit)
- MIPS 워드에서 가장 오른쪽 비트.
MSB (most significant bit)
- MIPS 워드에서 가장 왼쪽 비트.
부호없는 수
- 32비트 이진수는 비트 값과 2의 멱수를 곱한 값으로 표현할 수 있다.
(여기서 xi는 x의 i번째 비트를 의미한다.)
- (x31×231) + (x30×230) + (x29×229) + ... + (x1×21) + (x0×20)
오버플로 (overflow)
- 연산 결과가 하드웨어에 구현된 오른쪽 브트들만으로는 표현이 불가능 할 때.
2의 보수 (two's complement)
- 부호있는 이진수를 표현하는 방식
- 2의 보수 표현에서 모든 음수는 MSB가 1이라는 장점이 있다.
- MSB를 부호 비트 (sign bit)라고 부른다.
- (x31×-231) + (x30×230) + (x29×229) + ... + (x1×21) + (x0×20)
12/25 금 : 50분
[ 하드웨어 소프트웨어 인터페이스 ]
부호 확장 (sign extension)
- 부호있는 적재의 경우 레지스터의 남는 곳을 채우기 위해 부호를 반복하여 복사
- 레지스터 내부에 정확한 값을 적재하기 위해
MIPS의 바이트 적재 명령어
- lb (load byte) : 바이트를 부호있는 수로 간주하고 남은 24비트를 부호확장하여 채운다.
- lbu (load byte unsigned) : 부호없는 정수를 다룬다.
[ 2의 보수 연산에서 사용하는 계산법 ]
역부호화
- 기존 비트를 역전시킨 후 1을 더함
부호확장
- n비트로 표현된 이진수를 n비트보다 큰 수로 바꾸는 방법
- 비어 있는 왼쪽 부분에 부호 비트를 채움