보근은 참고 있다
2.3 피연산자 본문
상위 수준 언어 프로그램과는 달리 산술 명령어의 피연산자에는 제약이 있다. 레지스터(register)라고 하는 하드웨어로 직접 구현된 특수 위치 몇 곳에 있는 것만을 사용할 수 있다. MIPS 구조에서 레지스터의 크기는 32비트이다. MIPS에서는 32비트가 한 덩어리로 처리되는 일이 매우 빈번하므로 이것을 워드(word)라고 부른다.
프로그래밍 언어에서 사용하는 변수와 레지스터의 큰 차이점 하나는 레지스터는 개수가 한정되어 있다는 점이다. 현대 컴퓨터에는 MIPS에서처럼 보통 32개의 레지스터가 있다. 산술 명령어의 각 피연산자는 32개의 32비트 레지스터 중 하나이어야 한다는 제약이 추가된다.
설계 원칙 2 : 작은 것이 더 빠르다.
레지스터 개수가 많아지면 전기 신호가 더 멀리까지 전달되어야 하므로 클럭 사이클 시간이 길어진다. 하지만, 작은 것이 빠르다는 말은 절대적인 것이 아니다. 그 예로 레지스터가 31개로 줄어든다고 32개보다 빨라지지는 않는다.
메모리 피연산자
프로그래밍 언어에는 단순 변수 외에도 배열, 구조체 등의 복잡한 자료구조가 있다. 프로세서는 소량의 데이터만을 레지스터에 저장할 수 있으므로 대량의 데이터를 저장해야하는 자료구조 등은 메모리에 저장한다.
MIPS의 산술연산은 레지스터에서만 실행되므로 메모리와 레지스터 간에 데이터를 주고받는 명령어가 필요하다. 그런 명령어를 데이터 전송 명령어(data transfer instruction)이라고 한다. 메모리에 기억된 데이터 워드에 접근하려면 명령어가 메모리 주소를 지정해야 한다. 메모리는 주소가 인덱스 역할을 하는 큰 일차원 배열이다. 주소는 0부터 시작된다.
메모리로부터 레지스터로 데이터를 복사해오는 데이터 전송 명령을 적재(load)라고 한다. 실제 이름은 load word(lw)이다. 피연산자는 적재할 위치의 레지스터, 변위(offset), 주소 계산을 위해 더해지는 레지스터이다.
ex) lw $t0, 8($s3) // $t0 레지스터에 $s3에 저장된 주소 + 8의 위치에 있는 데이터를 적재한다.
반대로 레지스터에서 메모리로 데이터를 저장하는 명령어를 저장(store)라고 한다. 실제 이름은 store word(sw)이다. 피연산자는 메모리에 저장할 값이 있는 레지스터, 변위, 주소 계산을 위해 더해지는 레지스터이다.
ex) sw $t0, 16($s3) // $t0 레지스터에 저장된 값을 $s3에 저장된 주소 + 16의 위치의 메모리 배열에 저장한다.
프로그램에서 8비트로 구성된 바이트를 많이 사용하므로 대부분의 컴퓨터는 바이트 단위로 주소를 지정한다. 워드 주소는 워드를 구성하는 4바이트 주소 중 하나를 사용한다. 그러므로 연속된 워드의 주소는 4씩 차이가 난다.
MIPS에서 워드의 시작 주소는 항상 4의 배수이어야 한다. 이러한 요구 사항을 정렬 제약(alignment restriction)이라고 하며, 많은 컴퓨터에서 이 방법을 사용한다.
컴퓨터가 갖고 있는 레지스터보다 프로그램에서 사용하는 변수가 더 많은 경우가 자주 있다. 그러므로 컴파일러는 자주 사용되는 변수를 가능한 한 많이 레지스터에 넣고 자주 사용하지 않는 변수는 메모리에 저장했다가 필요할 때 꺼내서 레지스터에 넣는다. 자주 사용하지 않는 변수를 메모리에 넣는 것을 스필링(spilling)이라고 한다.
상수 또는 수치 피연산자
프로그램의 연산에서 상수를 사용하는 경우는 많이 있다. 그러한 상황을 위해 피연산자 중 하나가 상수인 산술연산 명령어를 지원한다. 상수 피연잔사를 수치(immediate) 피연산자라고 한다.
ex) addi $s3, $s3, 4 // $s3 = $s3 + 4
상수 필드를 갖는 산술 명령어를 사용하면 매번 메모리에서 상수를 가져오는 것보다 연산이 훨씬 빨라지고 에너지 소모가 줄어든다.
상수 0은 또 다른 역할을 하는데 유용한 여러 변형을 제공함으로써 단순한 명령어 집합을 가능케 한다.
ex) add $s1, $t0, $zero // $t0 값을 $s1에 복사. move 명령어를 대신함.
'CS > 컴퓨터 구조' 카테고리의 다른 글
2.6 논리연산 명령어 (1) | 2020.10.14 |
---|---|
2.5 명령어의 컴퓨터 내부 표현 (0) | 2020.10.14 |
2.4 부호있는 수와 부호없는 수 (0) | 2020.10.14 |
2.2 하드웨어 연산 (0) | 2020.10.14 |
2.1 서론 (0) | 2020.10.14 |