ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 3장. 명령어
    CS/컴퓨터구조 2023. 8. 24. 23:57

    3-1. 소스 코드와 명령어

    명령어: 컴퓨터를 실질적으로 작동시키는 중요한 정보

    프로그램을 만들 때 사용되는 언어의 2가지 타입

    고급 언어: 사람이 이해할 수 있도록 작성된 언어 ex) C, C++, Java, Python 등…

    저급 언어: 컴퓨터가 이해할 수 있는 언어. 0과 1로 구성된 기계어와 기계어를 사람이 이해할 수 있게 번역한 어셈블리어로 나뉜다.

     

    고급 언어를 저급 언어로 변환하는 방식 2가지

    컴파일: 고급 언어로 작성된 소스 코드 전체를 저급 언어로 변환하는 과정. 컴파일을 수행하는 주체를 컴파일러라고 한다. 대표적으로 C나 C++이 컴파일 언어이다.

    목적 파일: 목적 코드로 이루어진 파일. 컴파일을 통해 저급 언어로 변환된 코드를 목적 코드라고 함. main.c 를 컴파일하면 목적 파일인 main.o 가 생성된다.

    실행 파일: 실행 코드로 작성된 파일. 목적 파일과는 다른 별개의 파일임. ex) .exe

    링킹: 목적 파일이 실행 파일이 되기 위해 거쳐야 하는 작업. 원본인 소스 파일 간 참조 관계가 존재할 때, 목적 파일에는 이러한 논리적 관계에 대한 설명이 포함되어 있지 않음. 이처럼 서로 다른 파일 간 연결 관계를 이어주는 작업을 링킹이라고 함.

    ex) main.c 가 hello.c 에 구현된 함수를 호출하고 있을 때, 각 파일의 목적 파일인 main.o와 hello.o 만으로는 연결 관계를 알 수 없음. 이 때 main.o에서 호출되는 함수를 hello.o에서 찾도록 해주는 작업이 링킹임.

     

    인터프리트: 소스 코드를 한 줄 씩 저급 언어로 변환하고 바로 실행하는 방법. 인터프리트를 수행하는 것을 인터프리터라고 함. 인터프리터 언어와 컴파일 언어 중 프로그램 실행 시간이 짧은 언어는 컴파일 언어. 인터프리트 언어의 실행 시간에는 인터프리트 작업 시간까지 포함되어 있는 꼴이므로. ex) Python

     

    ※ 컴파일과 인터프리트는 완전히 상반된 개념이 아님을 주의! Python도 컴파일 과정이 아예 없는 것은 아니므로. 그저 고급 언어를 저급 언어로 변환하는 대표적인 방법으로 두 방식을 이해하면 됨!

     

    C언어 컴파일 과정

    test.c  -> test.i -> test.s -> test.o -> test.exe
    고급 언어
    소스코드
    전처리 된
    소스코드
    어셈블리어파일 목적 파일 실행파일

    전처리 과정 preprocessing

    • 외부에 선언된 소스 코드, 라이브러리의 내용을 소스 코드 파일에 그대로 가져옴. ex) 결과물인 test.i를 열면 #include 줄 대신 해당 라이브러리 내용이 그대로 포함되어 있음.
    • 매크로 변환-매크로가 뭐지?
    • 컴파일 영역 명시…?
    • gcc -E test.c -o test.i

     

    컴파일

    • 고급 언어 → 어셈블리어 (어셈블리어 파일은 목적 파일이 아닌게 되나…?)
    • gcc -S test.i -o test.s

     

    어셈블

    • 어셈블리어 → 기계어 (목적 코드)
    • 어셈블 결과물(=목적 파일)의 내용은 CPU마다 달라질 수 있음.
    • gcc

     

    링킹

    각기 다른 목적 파일을 하나의 실행 파일로 묶는 과정

     

     

    3-2. 소스 코드와 명령어

    명령어 = 연산 코드 + 오퍼랜드

    명령어의 크기는 각 명령어마다, CPU마다 다를 수 있다.

     

    오퍼랜드 = 피연산자

    명령어 수행에 사용되는 데이터 or 데이터가 저장된 메모리/레지스터 주소

    오퍼랜드가 작성되는 영역을 오퍼랜드 필드라고 한다.

    오퍼랜드는 0개 이상 올 수 있다.(0개: 0-주소 명령어, 1개: 1-주소 명령어 …)

     

    연산 코드 = 연산자

    컴퓨터가 수행해야 하는 동작.

    연산 코드가 작성되는 영역을 연산 코드 필드라고 한다.

    연산 코드 종류: 데이터 흐름, 산술/논리 연산, 제어 흐름 변경 입출력 제어

     

    (오퍼랜드 필드 크기) = (명령어 크기) - (연산 코드 필드 크기)

    ‘명령어 크기’와 ‘연산 코드’의 크기는 거의 고정된 값. 그러나 오퍼랜드의 크기는 매 연산마다 달라질 수 있고 개수도 0개 ~ N개가 될 수 있음. 따라서 표현할 수 있는 오퍼랜드 크기에 제한이 걸림. 이를 해결하기 위해 오퍼랜드 필드에 데이터가 저장된 메모리나 레지스터의 주소를 입력하는 주소 지정 방식을 사용.

     

    대표적인 명령어 주소 지정 방식 5가지

    즉시 주소 지정 방식 immediate addressing mode

    데이터 필드에 오퍼랜드 값을 직접 입력. → 입력 할 수 있는 데이터 크기가 오퍼랜드 필드 크기만큼으로 줄어듦.

    메모리에 접근할 필요가 없으므로 수행 속도 가장 빠름.

     

    직접 주소 지정 방식 direct addressing mode

    유효 주소: 연산에 사용할 데이터가 저장된 메모리 or 레지스터 이름

    데이터 필드에 오퍼랜드가 저장된 메모리 주소를 입력. → 입력할 수 있는 유효 주소 길이가 오퍼랜드 필드 크기만큼으로 줄어듦.

    메모리에 1번 접근

     

    간접 주소 지정 방식 Indirect addressing mode

    데이터 필드에 유효 주소의 주소를 입력 → 오퍼랜드 필드에 입력할 수 있는 유효 주소의 길이 한계 개선.

    메모리에 2번 접근하므로 비교적 느림.

     

    레지스터 주소 지정 방식 register addressing mode

    연산에 사용될 데이터가 저장된 레지스터 이름을 입력 → 오퍼랜드 필드에 입력할 수 있는 유효 주소 길이(여기서는 레지스터 이름)가 오퍼랜드 필드 크기만큼으로 줄어듦.

    레지스터에 1번 접근. 직접 주소 지정 방식보다 빠름.

     

    레지스터 간접 주소 지정 방식

    유효 주소가 저장된 레지스터 이름을 입력 → 오퍼랜드 필드에 입력할 수 있는 유효 주소의 길이 한계 개선.

    레지스터에 1번, 메모리에 1번 접근. 간접 주소 지정 방식보다는 빠름.

     

    * 본 글의 일부 설명과 그림의 출처는 인프런 강의 '혼자-공부하는-컴퓨터구조-운영체제'와 동명의 서적 입니다.

    https://www.yes24.com/Product/Goods/111378840

     

    혼자 공부하는 컴퓨터 구조+운영체제 - 예스24

    혼자 해도 충분합니다! 1:1 과외하듯 배우는 IT 지식 입문서이 책은 독학으로 컴퓨터 구조와 운영체제를 배우는 입문자가 ‘꼭 필요한 내용을 제대로 학습’할 수 있도록 구성했다. 뭘 모르는지

    www.yes24.com

    'CS > 컴퓨터구조' 카테고리의 다른 글

    6장. 메모리와 캐시메모리  (0) 2023.08.31
    5장. CPU 성능 향상 기법  (0) 2023.08.26
    4장. CPU  (0) 2023.08.26
    [컴퓨터구조] 2장. 데이터  (0) 2023.08.23
    [컴퓨터구조] 1. 컴퓨터 구조 시작하기  (0) 2023.08.22

    댓글

Designed by Tistory.