본문 바로가기
공부/컴퓨터구조

[6주차]레지스터, 컴퓨터 명령어, 주소 지정 방식, 컴퓨터 시스템의 동작

by IT공부방 2021. 4. 9.

★컴퓨터 명령어 형식

★컴퓨터 시스템의 동작과정

 

1. 레지스터

1) 레지스터 종류

- 프로그램 카운터

- 명령어 레지스터

- 여러가지 레지스터 매우 많이 존재.

 

2) 레지스터 전송

- 3가지 전송 명령

: LOAD->주기억 장치에서 레지스터로 데이터를 '읽음'

STORE->레지스터에서 주기억 장치로 데이터를 '저장'

MOVE(MOV)->레지스터에서 레지스터로 데이터를 '이동'

-인텔 프로세서는 이 3가지 전송 명령을 MOVE(MOV)명령으로 모두 처리함

 

 

2. 컴퓨터 명령어

1) 명령어 형식 

: 연산코드(opcode)와 오퍼랜드(operand, 피연산자)위치, 연산 결과의 저장 위치 등 여러 가지 정보로 구성

- 0주소 명령어 : 연산에 필요한 오퍼랜드 및 결과의 저장 장소가 묵시적으로 지정

opcode

- 1주소 명령어 : 연산 대상이 되는 2개 중 하나만 표현, 나머지는 묵시적으로 지정

opcode addr

- 2주소 명령어

opcode addr1 addr2

- 3주소 명령어

opcode addr1 addr2 addr3

※ 명령어 형식의 특징 한 눈에 보기

0주소 명령어 1주소 명령어 2주소 명령어 3주소 명령어
stack을 갖는 구조
- 데이터 기억 : push
- 데이터 꺼내기 : pop
누산기(AC)사용 연산에 필요한 두 오퍼랜드 중 하나가 결과 값 저장 오퍼랜드 2개와 결과 값의 저장 장소가 모두 다름
연산 결과는 누산기에 저장 ADD R1, R2 : R1<-R1+R2 연산 후에도 입력 데이터 보존
LOAD B : AC<-B
(B를 AC에 저장)
ADD C : AC <- AC+C
(B와 C를 더해 AC에 저장)
=>결과 : B+C
프로그램이 짧아지지만, 명령어 해독 과정이 복잡
ADD R1,R2,R3 : R1<-R2+R3

 

2) 명령어 종류

: 대체로 6개 그룹으로 나누지만 이전 모델과 호환성을 위해 추가된 특이한 명령어가 있거나, 여러 가지 이유로 명령어를 추가할 수 있다.

- 데이터 이동 명령 : 원본과 똑같은 새로운 객체를 만드는 '복사'를 의미함

  + 데이터 복사 이유

     - 변수에 값을 할당하기 위해서

     - 메모리와 레지스터 간에 데이터를 이동하여 프로그램 실행을 효율적으로 수행하기 위해서(LOAD,STORE,MOVE)

     - 메모리 간 이동은 일반적으로 사용하지 않음

 

- 2항 연산 : 오퍼랜드(피연산자) 2개를 결합하여 결과를 생성한다.

  + AND 연산은 주로 워드에서 특정 비트를 추출하는 용도로 사용됨.

     남기고 싶은 문자를 지정하고 AND연산을 통해 나머지 세 문자를 제거한 후, 오른쪽으로 시프트를 해줌

 

- 단항 연산 : 오퍼랜드와 결과가 각각 1개이다.

  + 시프트의 중요한 용도 

     ex) 0100->4 를 왼쪽으로 1비트 시프트한 경우 : 1000->8 (4의 2배)

                         오른쪽으로 1비트 시프트한 경우 : 0010->2 (4를 2로 나눈 결과)

  + 시프트는 특정 산술 연산의 속도를 높이는 데 사용

 

- 비교와 조건 분기 명령 : C언어에서 if문이라고 생각하자

  + 조건이 충족되면 특정 메모리 주소로 분기

  + 오버플로 비트 : 산술 연산의 결과 데이터가 표현 범위를 벗어났을 때 1로 설정

  + 캐리 비트 : 맨 왼쪽 비트에서 데이터가 넘칠 때 세트, 오버플로와 혼동 주의!!

 

- 프로시저 호출 명령 : 특정 작업을 수행하는 명령 그룹이며 프로그램 내 어디서든 호출 가능하다.

  + 어셈블리 '서브루틴', c언어에서 '함수', 자바에서 '메서드'

 

- 루프 제어 명령 : 명령 그룹을 정해진 횟수만큼 실해애야 하는 경우 사용한다.

 

 

3. 주소 지정 방식 : 오퍼랜드의 위치를 지정하는 것

1) 즉시 주소 지정

: 명령어 자체에 오퍼랜드를 포함하여 명령어가 인출될 때 오퍼랜드도 자동으로 인출하는 방법으로 주로 작은 값의 정수를 지정하는 데 사용

- MOVE R1 4 : 4를 R1에 즉시 저장

- 장점 : 오퍼랜드 인출을 위한 메모리 참조가 필요 없음

- 단점 : 상수만 가능하고 상수 값의 크기가 필드 크기로 제한

 

2) 직접 주소 지정

: 메모리에 위치한 오퍼랜드의 전체 주소를 지정함

- 명령어는 항상 정확히 동일한 메모리 위치에 액세스

- 값이 변할 수 있지만 위치는 변화 불가

- 컴파일할 때 알려진 주소의 전역 변수에 액세스하는 데만 사용 가능

 

3) 레지스터 주소 지정

: 1)즉시 주소 지정과 개념은 같고 위치가 메모리가 아닌 레지스터

- 가장 일반적인 주소 지정 방식

 

4) 레지스터 간접 주소 지정

: 직접 주소를 명령어에 포함하지 않으며, 포인터를 통해서 메모리의 주소를 레지스터에 저장한다. 즉 레지스터에서 참조를 해서 주기억장치로 간다.

- 가장 큰 장점은 전체 메모리 주소가 없어도 메모리를 참조할 수 있음

 

5) 변위 주소 지정

: 특정 레지스터에 저장된 주소에 변위를 더해 실제 오퍼랜드가 저장된 메모리 위치를 지정, 특정 레지스터가 무엇인지에 따라 여러 주소 지정 방식 가능

- 인덱스 주소 지정 : 레지스터에 일정한 변위를 더해 메모리 주소를 참조

- 상대 주소 지정, 베이스 주소 지정

 

6) 간접 주소 지정

: 메모리 참조가 두 번 이상 일어나는 경우 사용

- 데이터를 가져오는 데 시간이 많이 걸리며 프로그램 수행 시간이 길어짐

- 현재 간접 주소 지정을 지원하는 프로세스는 거의 없음

 

7) 묵시적 주소 지정

: 오퍼랜드의 소스나 목적지를 명시하지 않아도 암묵적으로 그 위치를 알 수 있는 방식

- PUSH R1 : 레지스터 R1의 값을 스택에 저장하라

- POP : 스택의 TOP에 있는 값을 누산기로 가져와라

- 누산기를 소스나 목적지로 사용하는 경우도 생략 가능

 

 

4. 컴퓨터 시스템의 동작--> 프로그램 실행

MOV     변수a         20                  //상수 20을 변수a에 이동하여 저장
MOV     레지스터A  변수a              //변수 a의 값을 레지스터 A에 이동하여 저장
ADD     레지스터A   1                   //레지스터 A의 값과 1을 더한 결과를 레지스터 A에 저장
MOV     변수a        레지스터A       //레지스터 A의 값을 변수 a에 이동하여 저장

보조기억장치의 내용은 cpu가 읽을 수 없어서 내용을 주기억장치로 가져와서 한줄씩 주기억장치에 다른 주소에 저장한다.

 

중앙처리장치의 주소 레지스터에 101이 저장되어있음

 

 

 

주기억장치 101이라는 주소에 저장되어 있는 데이터를 읽기 모드로 가져와 중앙처리장치의 명령어 레지스터에 일시적 저장

 

주소 레지스터의 값을 1 증가시킨다. 20을 변수a에 가서 넣어야 한다. 이때 변수 a는 주소 105인 주기억장치에 있으므로 주소버스는 105로 향하고 데이터 버스는 20을 가진다.

 

 

주소가 102인 주기억장치에서 명령어 MOV 레지스터A 변수a를 읽어온다.

 

변수a의 값을 가져와 레지스터A에 저장해야 하므로 변수a에 들어있는 값인 20을 가져와서 레지스터A에 넣었다.

 

103이라는 주소를 가진 주기억장치에서 명령어를 가져온다.

 

ADD 레지스터A 1의 과정을 보여준다. 이전 과정에서 레지스터A에는 20이었는데 20+1을 해줘서 21이 되었다.

 

주소 104에서 명령어를 읽어온다.

 

레지스터A의 값을 변수a에 저장해야한다. 따라서 레지스터A에 있는 21이라는 값을 쓰기모드로 변수a에 저장한다.