- Published on
명령어와 CPU의 작동원리
- Authors
- Name
- 손예지(Liv)
본 시리즈는 혼자 공부하는 컴퓨터 구조 책을 스터디 하며 남기는 기록 중 두번째 시리즈 입니다. 이전 시리즈 보러가기
명령어
03-1 소스코드와 명령어
- 컴퓨터가 이해할 수 있는 언어는 저급언어
- 고급언어는 저급언어로의 변환 필요
- 저급 언어의 종류는 기계어와 어셈블리어
- 기계어는 0, 1로만 이루어진 언어, 혹은 16진수로 표현된 언어
- 어셈블리어는 기계어를 읽기 쉽게 번역한 언어
- 어셈블리어로만 복잡한 프로그램을 만들기 어려움 -> 고급언어의 필요성
- 고급언어를 변환하는 방식 : 컴파일 언어, 인터프리터 언어
- 컴파일 언어
- 컴파일러 통해 소스코드 전체 변환 -> 변환된 코드는 목적코드(object code)
- 오류가 있으면 전체 소스코드 컴파일 실패해 실행되지 않음
- 인터프리터 언어
- 인터프리터 통해 한 줄씩 변환
- 한 줄씩 해석하고 실행해 컴파일 언어보다 느림
- 컴파일 언어
- 목적 파일 -> 실행 파일 되기 위해서 linking(링킹) 작업 필요
03-2 명령어의 구조
- 명령어 구성
- 연산코드(= 연산자) : 명령어가 수행 할 연산
- 오퍼랜드(= 피연산자) : 연산에 사용할 데이터 혹은 연산에 사용할 데이터가 저장된 위치
- 연산코드 종류
- 데이터 전송
- 산술/논리 연산
- 제어흐름변경
- 특정 메모리 주소로 옮기는 것
- 입출력 제어
- 오퍼랜드 필드에 주소를 저장하는 이유 ? -> 명령어에 저장하는 데이터의 크기가 정해져 있기 때문
- 명령어 주소 지정 방식
- 유효 주소 : 연산에 사용할 데이터가 저장된 위치
- 명령어 주소 지정 방식
- 즉시 주소 지정 방식(Immediate addressing mode)
- 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시
- 직접 주소 지정 방식(Direct addressing mode)
- 오퍼랜드 필드에 유효주소를 직접 명시
- 간접 주소 지정 방식(Indirect addressing mode)
- 유효 주소의 주소를 오퍼랜드 필드에 명시(속도 느림)
- 레지스터 주소 지정 방식
- 유효 주소를 저장한 레지스터를 오퍼랜드 필드에 직접 명시
- 레지스터 간접 주소 지정 방식
- 유효 주소를 저장한 레지스터
- 즉시 주소 지정 방식(Immediate addressing mode)
CPU의 작동원리
04-1 ALU와 제어장치
- CPU는 ALU, 제어장치, 레지스터로 구성
- ALU : 계산하는 장치
- 계산하기 위해 필요한 정보를 받아들인다
- 내보내는 정보: 계산한 값, 플래그
- 메모리가 아닌 ALU에 저장하는 이유 ?
- CPU가 레지스터에 접근하는 속도가 메모리에 접근하는 속도보다 빠르기 때문
- 메모리가 아닌 ALU에 저장하는 이유 ?
- 플래그 : 연산 결과에 대한 부가정보
- 연산 결과가 레지스터 보다 크면 ALU가 결과값이 크다는 정보 -> overflow
- 제어장치
- 제어신호 받아들이기
- clock 신호를 받아들임
- 해석해야 할 명령어를 받아들임
- 플래그 레지스터 속 플래그 값 받아들임
- 제어버스로 전달된 제어신호 받아들이기
- 제어신호 내보내기
- CPU 내부, 외부로 제어신호를 보낸다
- 제어신호 받아들이기
04-2 레지스터
- 상용화된 CPU 내 레지스터 중 가장 많은 CPU가 포함하고 있는 레지스터
- 프로그램 카운터(Program Counter) = 명령어 포인터
- 메모리에서 읽어 들일 명령어의 주소 저장
- 명령어 레지스터(Instruction Register)
- 해석할 명령어를 저장하는 레지스터
- 메모리 주소 레지스터(Memory Address Register)
- 메모리의 주소를 저장하는 레지스터
- 메모리 버퍼 레지스터
- 메모리와 주고받을 값을 저장하는 레지스터
- 범용 레지스터
- 다양한 상황에서 사용할 수 있는 레지스터
04-3 명령어 사이클과 인터럽트
- 명령어 사이클
- 프로그램 명령어가 일정한 사이클로 반복
- 인터럽트
- CPU가 처리해야 할 다른 작업이 생겼을때 발생
- 동기 인터럽트(예외)
- CPU가 예상하지 못한 상황 접했을 때 발생
- 하드웨어 인터럽트
- 사용이유?
- 입출력 작업 도중에도 명령어 처리 가능 -> 인터럽트 있으면 입출력 작업 하는 동안 CPU 다른 일 할 수 있다
- 처리 순서
- 인터럽트 요청 신호(처리 전)
- 입출력장치 -> CPU 에게 인터럽트 실행 가능여부 확인
- 인터럽트 요청 신호(처리 전)
- CPU가 인터럽트를 처리한다 == 인터럽트 서비스 루틴을 실행하고 수행하던 작업으로 다시 되돌아온다
- 인터럽트 시작 주소는 인터럽트 백터를 통해 알 수 있다
- 실행했을때 현재 CPU, 레지스터에 수행중인 작업을 유지해야함(백업)
- 사용이유?
알게된점
하드웨어 레벨에서 명령어가 어떻게 동작하고 입출력 장치와 어떻게 소통하는지에 대해서 알 수 있었습니다. 오버플로우의 경우 JVM에서 주는것만 알았는데 CPU단에서 ALU가 계산하면서 발생하는 부분도 있다는 것을 알게되었습니다.ㄴ