[WEEK 05] 컴퓨터 시스템 - 3. 프로그램의 기계수준 표현

신호정 벨로그·2021년 9월 9일
0

Today I Learned

목록 보기
25/89

3. 프로그램의 기계수준 표현

컴퓨터는 데이터를 처리하고, 메모리를 관리하고, 저장장치에 데이터를 읽거나 쓰고, 네트워크를 통해 통신하는 등의 하위 동작들을 인코딩한 연속된 바이트인 기계어 코드를 실행한다.

컴파일러는 프로그램 언어의 규칙, 대상 컴퓨터의 인스트럭션 집합, 운영체제의 관례 등에 따라 기계어 코드를 생성한다.

GCC C 컴파일러는 기계어 코드를 문자로 표시한 어셈블리 코드의 형태로 출력을 만들어 프로그램의 각 인스트럭션을 만들어 낸다.

GCC는 어셈블러와 링커를 호출하여 어셈블리 코드로부터 실행 가능한 기계어 코드를 생성한다.

우리가 기계어 코드를 배워야 하는 이유는 비록 컴파일러가 어셈블리 코드를 만들어 내느 대부분의 일을 하고 있지만, 그 코드들을 읽고 이해할 수 있는 기술은 프로그래머에게 매우 중요한 기술이기 때문이다.

3.2.1 기계수준 코드

컴퓨터 시스템은 보다 간단한 추상화 모델을 이용해서 세부 표현내용을 감추면서 추상화의 여러 가지 다른 형태를 사용하고 있다.

첫째, 기계수준 프로그램의 형식과 동작은 인스트럭션 집합구조에 의해 정의된다.

둘째, 기계수준 프로그램이 사용하는 주소는 가상주소이며, 메모리가 매우 큰 바이트 배열인 것처럼 보이게하는 메모리 모델을 제공한다. 살재 메모리 시스템은 여러 개의 메모리 하드웨어와 운영체제 소프트웨어로 구현되어 있다.

포인터 예제

포인터의 읽기 연산을 포인터 역참조(dereferencing) 라고 부른다.

C 연산자 *는 포인터의 역참조를 실행한다.

C 연산자 &는 주소화 연산자라고 부르는 포인터를 만들어 주며, 지역변수를 저장하고 있는 위치의 주소를 생성한다.

3.4.4 스택 데이터의 저장과 추출

스택은 프로시저 호출을 처리하는 데 중요한 역할을 한다.

스택은 값들이 후입선출 형태로만 추가되거나 제거되는 자료구조이며 push 연사으로 스택에 데이터를 추가하고 pop 연산으로 제거하되, 제거하는 값이 가장 최근에 추가된 값이어야 하며, 그 값을 스택에 여전히 남아 있게 된다.

스택은 배열로 구현될 수 있으며, 배열에서 원소들을 배열의 한쪽 끝에서만 추가하거나 제거한다.

스택은 낮은 주소 방향으로 성장하며, 따라서 푸시를 하게 되면 스택 포인터가 감소되고 메모리에 저장되며, 팝을 하면 메모리에서 읽어내고 스택 포인터를 증가시킨다.

3.7 프로시저

프로시저 호출은 소프트웨어에서의 주요 추상화이며 지정된 인자들과 리턴 값으로 특정 기능을 구현하는 코드를 감싸주는 방법을 제공한다.

3.9 구조체

C는 서로 다른 유형의 객체를 연결해서 자료형을 만드는 두 가지 방법을 제공한다. struct 키워드를 사용해서 선언하는 구조체다수의 객체를 하나의 단위로 연결한다. union 키워드로 선언하는 공용체하나의 객체를 여러 개의 다른 자료형으로 참조될 수 있도록 한다.

C struct 선언은 서로 다른 유형의 객체들을 하나의 객체로 묶어주는 자료형을 생성한다. 하나의 구조체 내의 서로 다른 컴포넌트들은 이름을 이용해서 참조된다.

구조체의 구현은 구조체의 모든 컴포넌트들이 메모리의 연속된 영역에 저장되며, 구조체의 포인터가 첫번째 바이트의 주소라는 점에서 배열과 유사하다.

3.10.1 포인터 이해하기

포인터는 연관된 자료형을 갖는다. 이 자료형은 어떤 종류의 객체를 이 포인터가 가리키는가를 의미한다.

모든 포인터는 특정 값을 가진다. 이 값은 특정 자료형을 갖는 어떤 객체의 주소다. 특수 값인 NULL(0) 값은 포인터가 아무 곳도 가리키지 않는 것을 의미한다.

함수 포인터

int (*f) (int**);와 같은 문장은 내부로부터 시작해서 바깥쪽으로 읽어나가면 이해하기 쉬워진다.

f는 함수 포인터이며, 하나의 int *를 인자로 가진다.

따라서 int *를 인자로 받아 int를 리턴하는 함수의 포인터임을 알 수 있다.

0개의 댓글