CSAPP 1.2

hodeethelion·2023년 3월 20일
0

CSAPP

목록 보기
2/6
post-thumbnail

1.2 프로그램은 다른 프로그램에 의해 다른 형태로 번역된다

  • C 프로그램(각 C문장, 고급 소스 파일) --> 저급 기계어 인스트럭션(Executable Object file, 형태 = 바이너리 디스크 파일)

이 과정은 크게 4 단계 를 거쳐서 번역 된다.

컴파일 시스템

  1. 전처리기
  2. 컴파일러
  3. 어셈블러
  4. 링커

각 단계에 대해서 알아보자

  1. 전처리(CPP) 단계:
    C/C++ preprocessor: 전처리기.
  • 기능: #include <stdio.h>를 통해서 printf, scanf와 같은 것을 정리

#include: #이후의 디렉티브 지시자, 전처리기에게 헤더 파일을 직접 삽입하라
stdio.h: standard input output, h: 파일의 확장자를 나타냄, 시스템 헤더파일

정리 짱 잘 되어 있음
GCC 명령어 정리

이는 다음과 같은 명령어로 설명할 수 있다.
gcc -E hello.c -o hello.i
하나하나 알아보자
gcc: GNU project C and C++ compiler
-E: 전처리 단계까지만 하고 컴파일은 그만 둠
-o: 아웃풋 파일을 적어라!

직접 보니까 이런 문장들이 적혀 있다!

# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdio.h" 1 3 4

아직까진 text file이라고 볼 수 있다!

현재 까지의 상황

├── 1_source
│   └── hello.c
├── 2_cpp_modified_source_program
│   └── hello.i
├── 3_cc1_compiler
│   └── hello.s
├── a.out
├── hello
├── hello.c
├── hello.i
├── hello.s
├── howtoUse.txt
└── z_sample_for_exact
  1. 컴파일 단계

cc1은 텍스트파일 hello.i --> 어셈블리어 프로그램이 저장

어셈블리어(영어: assembly language) 또는 어셈블러 언어(assembler language)는 기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어이다.

컴퓨터 구조에 따라 사용하는 기계어가 달라지며, 따라서 기계어에 대응되어 만들어지는 어셈블리어도 각각 다르게 된다. 컴퓨터 CPU마다 지원하는 오퍼레이션의 타입과 개수는 제각각이며, 레지스터의 크기와 개수, 저장된 데이터 형의 표현도 각기 다르다. 모든 범용 컴퓨터는 기본적으로 동일한 기능을 수행하지만, 기능을 어떤 과정을 거쳐 수행할지는 다를 수 있으며, 이런 차이는 어셈블리어에 반영되게 된다.

  • C와 Fortran는 둘다 동일한 어셈블리어로 출력 파일을 생성.
  • 여기서부터 지나면 상위수준언어의 컴파일러를 위한 공통의 출력 언어를 제공!

아무래도 컴퓨터가 달라지면 어셈블리어도 달라지게 되는 갑다.

  1. 어셈블리 단계
    이제 부터는 진짜 기계어 인스트럭션으로 번역!

1) 번역
2) 재배치 가능 목적 프로그램의 형태로 묶어서 hello.o 목적파일, object file에 저장한다

x86 계열 CPU 기계어 명령: 10110000 01100001
어셈블리어로 옮겨 쓰면: mov al, 061h : 16진수 61을 al 레지스터에 옮겨라!
al은 cpu 안에 변수를 저장하는 레지스터 중 하나


와씨 이사람 빡세게 공부 했네
빡센공부

근데 아무래도 arm 환경의 m1 이다 보니 어셈블리어 프로그램이 살짝 이상하게 보일 수도 있겠다라는 생각이 조금 든다

굉장히 중요한 것은 우리는 거꾸로 갈 수도 있다는 점이다.

  1. 어셈블리 단계:
    기계어 인스트럭션을 번역해서 목적파일에 저장.
    일단 그냥 인스트럭션 번역해서 아직 합치지 않은 순간이라고 봐야하나 ?
  1. 링크 단계:
    표준 C 라이브러리에서 printf 함수를 호출 하는 것.
    printf.o 라는 파일에 들어 있는데 이게 hello.o 파일과 어떻게든 결합을 해야한다 ld가 이 통합 작업을 수행!

이렇게 하면은 된다!

근데 왜 모든 stage를 다 뽑아 보라고 하면 이렇게 되는 거지 ?

gcc -save-temps hello.c

profile
가슴을 따라가자

0개의 댓글

관련 채용 정보