오늘도 알고리즘 세션 1시간 하고 알고리즘 카타 1시간 하고
CS 강의 듣기 시작~
4주차 과제 요구사항대로 다시 해야 되는데 외면중
고급 언어와 저급 언어
고급 언어
컴파일 언어 | 인터프리터 언어 |
---|
컴파일러에 의해 저급 언어로 변환 | 인터프리터에 의해 한 줄씩 실행 |
소스 코드 컴파일 중 오류가 발생하면 소스 코드 전체가 실행되지 않음 | 소스 코드 인터프리트 중 오류가 발생하면 오류 발생 전까지의 코드는 실행 |
- 컴파일 결과로 저급 언어인 목적 코드(오브젝트 코드)가 생성됨
저급 언어
- 컴퓨터가 이해하고 실행하는 언어
- 기계어
- 어셈블리어
- 0과 1로 이루어진 기계어를 읽기 편한 형태로 번역한 저급 언어
명령어 구조
구조
- 연산 코드와 오퍼랜드로 이루어짐
- 연산 코드 : 수행할 연산
- 오퍼랜드 :연산에 사용될 데이터 혹은 연산에 사용될 데이터가 저장된 위치
오퍼랜드
- 오퍼랜드 필드(주소 필드)
- 오퍼랜드에는 연산에 저장될 데이터가 저장된 위치가 훨씬 자주 담기게 됨
- 위치 값을 쓰는 이유 : 명령어 내에서 표현 가능한 데이터 크기가 제한되기 때문
- 오퍼랜드는 없을 수도 있고, 여러 개가 될 수 있음
연산 코드
- 종류
- 데이터 전송
- 산술/논리 연산
- 제어 흐름 변경
- 입출력 변경
- 데이터 전송
- MOVE : 데이터를 옮겨라
- STORE : 메모리에 저장하라
- LOAD(FETCH) : 메모리에서 CPU로 데이터를 가져와라
- PUSH : 스택에 데이터를 저장하라
- POP : 스택의 최상단 데이터를 가져와라
- 산술/논리 연산
- ADD / SUBTRACT / MULTIPLY / DIVIDE : 덧셈 / 뺄셈 / 곱셈 / 나눗셈
- INCREMENT / DECREMENT : 오퍼랜드에 1을 더하라 / 빼라
- AND / OR / NOT
- COMPARE : 두 개의 숫자 또는 TRUE/FALSE 값을 비교하라
- 제어 흐름 변경
- JUMP : 특정 주소로 실행 순서를 옮겨라
- CONDITIONAL JUMP : 조건에 부합할 때 특정 주소로 실행 순서를 옮겨라
- HALT : 프로그램의 실행을 멈춰라
- CALL : 되돌아올 주소를 저장한 채 특정 주소로 실행 순서를 옮겨라
- RETURN : CALL을 호출할 때 저장했던 주소로 돌아가라
- 입출력 제어
- READ(INPUT) : 특정 입출력 장치로부터 데이터를 읽어라
- WRITE(OUTPUT) : 특정 입출력 장치로 데이터를 써라
- START IO : 입출력 장치를 시작하라
- TEST IO : 입출력 장치의 상태를 확인하라
명령어 주소 지정 방식
유효 주소 (effective address)
명령어 주소 지정 방식 (addressing modes)
- 연산에 사용할 데이터가 저장된 위치를 찾는 방법
- 유효 주소를 찾는 방법
- 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시
- 가장 간단한 형태
- 연산에 사용할 데이터의 크기는 작아지지만 빠름
직접 주소 지정 방식 (direct addressing mode)
- 오퍼랜드 필드에 유효 주소를 직접적으로 명시
- 유효 주소를 표현할 수 있는 크기가 연산 코드만큼 줄어듦
간접 주소 지정 방식 (indirect addressing mode)
- 오퍼랜드 필드에 유효 주소의 주소를 명시
- 다른 방식에 비해 속도가 느림
레지스터 주소 지정 방식 (register addressing mode)
- 연산에 사용할 데이터가 저장된 레지스터 명시
- CPU의 메모리 접근 속도 < CPU의 레지스터 접근 속도
레지스터 간접 주소 지정 방식 (register indirect addressing mode)
- 연산에 사용할 데이터를 메모리에 저장
- 주소를 저장한 레지스터를 오퍼랜드 필드에 명시
C언어 컴파일 과정
과정
- 전처리기(preprocessor) -> 컴파일러(compiler) -> 어셈블러(assembler) -> 링커(linker)
전처리 과정 (preprocessing)
- 본격적으로 컴파일하기 전 처리할 작업들
- 외부에 선언된 다양한 소스 코드, 라이브러리 포함 (#include)
- 프로그래밍 편의를 위해 작성된 매크로 변환 (#define)
- 컴파일할 영역 명시 (#if, #ifdef...)
컴파일 과정 (compiling)
- 전처리가 완료 되어도 여전히 소스 코드
- 전처리가 완료된 소스 코드를 저급 언어(어셈블리 언어)로 변환
어셈블 과정 (assembling)
- 어셈블리어를 기계어로 변환
- 목적 코드(object file)를 포함하는 목적 파일이 됨
- 목적 파일 vs 실행 파일
- 둘 다 기계어로 이루어진 파일
- 목적 파일은 링킹(linking)을 거친 이후에 실행 파일이 됨
링킹 (linking)
- 각기 다른 목적 코드를 하나의 실행 파일로 묶어주는 작업
- 실행 파일이 만들어짐
ALU
개념
제어장치
- 클럭 신호 : 컴퓨터의 모든 부품들을 움직일 수 있게 하는 시간 단위
- 플래그 : 명령 연산에 필요함
- 외부로부터 제어 신호가 들어오면 CPU가 어떤 신호인지 제어 장치가
레지스터
정의
- CPU 내부의 작은 임시 저장 장치
- 프로그램 속 명령어와 데이터는 실행 전후로 레지스터에 저장
종류
- 프로그램 카운터 : 메모리에서 가져올 명령어의 주소 (메모리에서 읽어 들일 명령어의 주소)
- 명령어 레지스터 : 해석할 명령어 (방금 메모리에서 읽어 들인 명령어)
- 메모리 주소 레지스터 : 메모리의 주소 (CPU가 읽어들이고자 하는 주소를 주소 버스로 보낼 때 거치는 레지스터)
- 메모리 버퍼 레지스터 : 메모리와 주고받을 값(데이터와 명령어)
- 플래그 레지스터 : 연산 결과 또는 CPU 상태에 대한 부가적인 정보
- 범용 레지스터 : 다양하고 일반적인 상황에서 자유롭게 사용
- 스택 포인터 : 스택의 꼭대기를 가리킴
- 베이스 레지스터 : 베이스 레지스터 주소 지정 방식의 기준 주소 저장
명령어 실행 과정
- CPU 프로그램 카운터에 1000(주소 값)이 담김
-> 다음에 1000번지의 명령어를 실행하겠다는 말
- 메모리 주소 레지스터에 읽고자 하는 주소 1000을 복사
- 제어장치에서 보낸 메모리 읽기 신호와 함께 주소 버스로 1000번지 주소를 메모리로 보냄
- 메모리는 1000번지에 저장된 값을 데이터 버스를 통해 메모리 버퍼 레지스터로 보내줌
- 프로그램 카운터 값을 1001로 증가
- 메모리 버퍼 레지스터에 담긴 값을 명령어 레지스터에 복사
- 순차적인 실행 흐름이 끊기는 경우
- 특정 메모리 주소로 실행 흐름을 이동하는 명령어 실행 시
(JUMP, CONDITIONAL JUMP, CALL, RET)
- 인터럽트 발생 시
특정 레지스터를 이용한 주소 지정 방식
- 스택 주소 지정 방식 : 스택과 스택 포인터를 이용한 주소 지정 방식
- 스택 포인터 : 스택의 꼭대기를 가리키는 레지스터
- 변위 주소 지정 방식 : 오퍼랜드 필드의 값(변위)과 특정 레지스터의 값을 더하여 유효 주소를 얻는 방식
- 변위 주소 지정을 사용하는 명령어는 연산 코드(명령의 내용), 레지스터(값을 더할 레지스터 지정), 오퍼랜드(주소 값)을 포함
- 상대 주소 지정 방식 : 오퍼랜드 필드 값 + PC 값
- 베이스 레지스터 주소 지정 방식 : 오퍼랜드 필드 값 + 베이스 레지스터
명령어 사이클
정의
- 프로그램 속 명령어들은 일정한 주기가 반복되며 실행되는데, 이 주기를 명령어 사이클이라고 함
종류
- 인출 사이클 : 메모리에 저장된 값을 CPU 내부로 가져오는 작업의 주기
- 실행 사이클 : 명령어를 실행하는 주기
- 간접 사이클 : 인출 후 메모리 접근이 추가로 필요한 경우
- 인출을 해도 바로 실행이 불가능할 수 있음 (간접 주소 지정 방식)
- 보통 인출-실행의 반복
- 인터럽트 사이클 : 인터럽트가 발생했을 때
인터럽트(interrupt)
정의
- CPU의 명령어 흐름을 방해하는 신호
- CPU가 바로 처리해야 하는 다른 작업이 생겼을 때 발생
종류
- 동기 인터럽트(예외) : CPU가 예기치 못한 상황을 접했을 때 발생
- 주소에 접근했는데 값이 없을 때, 디버깅, 0으로 나누기, 실행할 수 없는 명령어 등
- 종류 : 폴트, 트랩, 중단, 소프트웨어 인터럽트
- 비동기 인터럽트(하드웨어 인터럽트) : 주로 입출력 장치에 의해 발생
- 막을 수 있는 인터럽트(maskable interrupt)
- 막을 수 없는 인터럽트(non maskable interrupt)
하드웨어 인터럽트
- 입출력 작업 도중에도 효율적으로 명령어를 처리하기 위해 사용
- 입출력 장치는 CPU에 비해 느림
- 인터럽트가 없다면 CPU는 프린트 완료 여부를 주기적으로 확인해야 함
- 인터럽트가 있다면 입출력 작업 동안 CPU가 다른 작업을 할 수 있음
하드웨어 인터럽트 처리 순서
- 입출력 장치는 CPU에 인터럽트 요청 신호를 보냄
- CPU는 실행 사이클이 끝나고 명령어 인출 전에 인터럽트 여부 확인
- CPU는 인터럽트 요청을 확인하고 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는지 확인
- 모든 인터럽트를 인터럽트 플래그로 막을 수 있는 것은 아님
(대부분의 입출력 장치가 보내는 인터럽트는 웬만하면 막을 수 있음)
- 인터럽트를 받아들일 수 있다면 CPU는 지금까지의 작업을 백업
- CPU는 인터럽트 벡터를 참조해 인터럽트 서비스 루틴을 실행
- 인터럽트 서비스 루틴 : 인터럽트 발생 시 해당 인터럽트를 처리하기 위한 프로그램
- 인터럽트 서비스 루틴도 메모리에 저장됨
- 인터럽트를 보내는 주체에 따라 각기 다른 인터럽트 서비스 루틴의 시작 주소를 가짐
- 인터럽트 벡터 : 각각 인터럽트 정보를 구분하기 위한 정보
- 인터럽트의 시작 주소는 인터럽트 벡터를 통해 알 수 있음
- 보통 인터럽트를 보내는 주체는 인터럽트와 함께 인터럽트 벡터를 데이터 버스를 통해 보냄
- 인터럽트 서비스 루틴 실행이 끝나면 4에서 백업한 작업을 복구해 실행 재개
- 인터럽트 발생 전 작업하던 내용은 스택에 백업
오늘은 여기까지!!!!
끗!