혼자 공부하는 컴퓨터구조 + 운영체제 Section 3. 명령어

jihyelee·2023년 7월 7일
0

achitecture-os

목록 보기
3/15
post-custom-banner

강의 링크

소스 코드와 명령어

  • 고급 언어
    • 개발자가 이해하기 쉽게 만든 언어
      • e.g. 파이썬, C++, ...
      • 저급 언어로 변환되어 실행
    • 컴파일 언어
      • 고급 언어 (소스 코드) -> 컴파일러로 컴파일 -> 저급 언어 (목적 코드)
      • 컴파일 언어로 작성된 소스 코드는 컴파일러에서 저급 언어로 변환, 컴파일의 결과로 목적 코드가 생성
      • 소스 코드 컴파일 중 오류가 발생하면 소스 코드 전체가 실행되지 않음
    • 인터프리트 언어
      • 인터프리터에 의해 한 줄씩 실행
      • 소스 코드 전체가 저급 언어로 변환되기까지 기다릴 필요가 없음
      • 소스 코드 인터프리트 중 오류가 발생하면 오류 발생 전까지의 코드는 실행
  • 저급 언어
    • 컴퓨터가 이해하고 실행하는 언어 (=명령어)
    • 기계어
      • 0과 1로 이루어진 명령어로 구성된 저급 언어
    • 어셈블리어
      • 0과 1로 이루어진 기계어를 읽기 편한 형태로 번역한 저급 언어
      • e.g. 0101 0101 -> push rbp

명령어의 구조

  • 무엇을 대상으로, 무엇을 수행하라
  • 연산코드
    • 수행할 연산
    • 4가지 종류 (연산코드의 종류, 생김새는 CPU마다 다름)
      • 데이터 전송: 데이터 옮기기, 메모리에 저장, 메모리에서 CPU로 데이터 전송, 스택에 데이터 저장, 스택의 최상단 데이터 옮기기 등
      • 산술/논리 연산: 사칙연산, 논리연산(and, or, not), 오퍼랜드에 1 더하거나 빼기, 두 개의 숫자 혹은 true/false 비교 등
      • 제어 흐름 변경: (조건에 부합할 때, 돌아올 주소를 저장한 채) 특정 주소로 실행 순서 옮기기, 프로그램 실행 중지, 저장했던 주소로 복귀 등
      • 입출력 제어: 읽기, 쓰기, 입출력 장치 시작, 입출력 장치 상태 확인 등
  • 오퍼랜드
    • 연산에 사용될 데이터 혹은 연산에 사용될 데이터가 저장된 위치 (주소 필드)
    • 없거나 하나 이상일 수도 있음

명령어 주소 지정 방식

  • 16비트가 주어졌을 때 연산코드가 4비트라고 한다면
    • 오퍼랜드 2개일 때, 2-주소 명령어에서 표현할 수 있는 데이터의 크기 = 2^6비트 (64비트)
    • 오퍼랜드 3개일 때, 3-주소 명령어에서 표현할 수 있는 데이터의 크기 = 2^4비트 (16비트)
    • 데이터가 아니라 데이터가 저장된 주소를 저장한다면
      • 오퍼랜드 필드로 표현할 수 있는 데이터의 크기는 2^16비트가 됨
  • 유효 주소 (effective address)
    • 연산에 사용할 데이터가 저장된 위치
  • 명령어 주소 지정 방식 (addressing modes)
    • 연산에 사용할 데이터가 저장된 위치를 찾는 방법
    • 유효 주소를 찾는 방법
    • 다양한 명령어 주소 지정 방식들
  • 즉시 주소 지정 방식 (immediate addressing mode)
    • 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시
    • 가장 간단한 형태의 주소 지정 방식
    • 연산에 사용할 데이터의 크기가 작아질 수 있지만 빠름
    • 연산 코드 + 연산에 사용할 데이터 형태
  • 직접 주소 지정 방식 (direct addressing mode)
    • 오퍼랜드 필드에 유효 주소 직접적으로 명시
    • 유효 주소를 표현할 수 있는 크기가 연산 코드만큼 줄어듦
    • 연산 코드 + 유효 주소 형태 (연산에 사용할 데이터는 메모리 내에)
  • 간접 주소 지정 방식 (indirect addressing mode)
    • 오퍼랜드 필드에 유효 주소의 주소를 명시
    • 앞선 주소 지정 방식들에 비해 속도가 느림
      • c.f. CPU가 메모리를 접근하는 속도는 느린 편이기 때문에 이를 최소화하는 게 속도에 좋음
    • 연산 코드 + 유효 주소의 주소 형태 (연산에 사용할 데이터, 유효 주소는 메모리 내에)
  • 레지스터 주소 지정 방식 (register addressing mode)
    • 연산에 사용할 데이터가 저장된 레지스터 명시
    • 메모리에 접근하는 속도보다 레지스터에 접근하는 것이 빠름 (직접 주소 방식보다 빠를 수 있음)
    • 연산 코드 + 유효 주소의 형태 (연산에 사용할 데이터는 레지스터 내에)
  • 레지스터 간접 주소 지정 방식 (register indirect addressing mode)
    • 연산에 사용할 데이터를 메모리에 저장
    • 그 주소를 저장한 레지스터를 오퍼랜드 필드에 명시
    • 연산 코드 + 유효 주소를 저장한 레지스터 형태 (유효주소는 레지스터 내에, 연산에 사용할 데이터는 메모리 내에)

C언어의 컴파일 과정

  • 전처리기 (preprocessor)
    • input: test.c
    • output: test.i
    • gcc -E test.c -o test.i
    • 본격적으로 컴파일하기 전에 처리할 작업들
      • 외부에 선언된 다양한 소스 코드, 라이브러리 포함 (e.g. #include)
      • 프로그래밍의 편의를 위해 작성된 매크로 변환 (e.g. #define)
      • 컴파일할 영역 명시 (e.g. #if, #ifdef, ...)
  • 컴파일러 (compiler)
    • input: test.i
    • output: test.s
    • gcc -S test.i(or test.c) -o test.s
    • 전처리가 완료되어도 여전히 소스 코드
    • 전처리 완료된 소스 코드를 저급 언어(어셈블리 언어)로 변환
  • 어셈블러 (assembler)
    • input: test.s
    • output: test.o
    • gcc -o test.o test.s
    • 어셈블리어를 기계어로 변환
    • 목적 코드(object file)를 포함하는 목적 파일이 됨
      • 목적 파일 vs. 실행 파일
      • 목적 파일과 실행 파일은 둘 다 기계어로 이루어진 파일이나 다름
      • 목적 파일은 링킹(linking)을 거친 이후에야 실행 파일이 됨
  • 링커 (linker)
    • input: test.o
    • output: test.exe
profile
Graduate student at Seoul National University, majoring in Artificial Intelligence (NLP). Currently AI Researcher at LG CNS AI Lab
post-custom-banner

0개의 댓글