[컴퓨터구조] Ch2 Instructions language of the computer - part2

으닝·2023년 5월 7일
0

Translation hierarchy for C language

디스크 파일에 있는 C 프로그램을 컴퓨터에서 실행되는 프로그램으로 변환하는 네 단계

이 과정 전체를 컴파일이라고 하기도 함.

1) 컴파일러

  • c프로그램(high level 언어)를 기계가 이해하는 형식인 assembly 언어 프로그램으로 변환.
  • 지난 1970~1980년대에는 많은 OS와 어셈블러가 어셈블리 언어로 작성됨. 메모리가 작고 컴파일러가 비효율적이었기 때문에 직접 어셈블리 언어로 작성.
  • High level 언어는 assembly 언어보다 훨씬 적은 코드를 사용한다. 그래서 프로그래머 생산성이 더 높다.

2) 어셈블러

  • 어셈블리 언어를 기계어로 변환하는 프로그램
  • pseudo instruction을 받아들인다.

*pseudo insturction이란? 실제로 컴퓨터를 동작시키는 데 사용되는 코드는 아니다(가짜 명령어). 컴파일러가 컴파일 과정을 통해 실제 명령어로 바꿔준다.

MIPS Pseudo Instruction
프로그래머가 사용하기에 용이한 형태의 명령어이다.컴퓨터가 이해할 수 있는 명령어들이 조합된 형태이다. (추상화 개념)의사 명령어를 컴퓨터가 이해하기 위해서는, 변환 과정이 필요하다.의사 명령어를 사용함으로써, 간결한 코딩이 가능해지고 생산성이 향상된다.

  • li, la, move(한 레지스터의 값을 다른 레지스터에 대입), nop (no operation) ult(곱셈) 등

pseudo 명령어: 직접 하드웨어 implementation이 없는 합법적인 MIPS 어셈블리 언어 명령어이다. 프로그래머의 편의를 위해 제공되며, MIPS 어셈블리 언어 프로그램에서 의사 명령어를 사용할 때 어셈블러는 이를 동등한 실제 MIPS 명령어로 변환한다.

  • 어셈블러는 어셈블러 언어 프로그램을 object file로 변환
  • object file: 기계어, 명령어, 데이터, 메모리에 적절하게 명령어를 배치하기 위한 정보 등의 조합
  • 아직 완전한 프로그램으로 link되지 않은 Machine code의 일부
  • Machine code: CPU에서 직접 실행할 수 있는 이진코드

3) Linker

  • 링커가 중요한 이유?
    • 모든 procedure을 다시 번역하는 것은 컴퓨터 자원이 낭비됨.
    • 각 procedure을 독립적으로 컴파일하고 어셈블하여 한 줄을 변경했을 때 단 하나의 procedure만 다시 컴파일링하고 어셈블링하도록 한다.
  • 링커는 독립적으로 어셈블된 기계어 프로그램을 함께 합친다.
  • 합쳐서 컴퓨터에서 실행가능한 executable file(실행가능한 파일 .exe file)을 만든다.

Translating and Starting a Program

Dynamically linked libraries (DLLs, DLL)

  • 프로그램 실행중에 연결된 라이브러리
  • 왜 이런걸 사용? 프로그램이 실행되기 전 라이브러리를 연결하는 것의 단점 때문에.
  • 만약 새 버전의 라이브러리가 출시되면, 정적으로 연결된 프로그램은 계속 구버전으로 남아있음.

정적 링크라고 하며 컴파일 시점에 라이브러리가 링커에 의해 연결되어 실행 파일의 일부분이 된다.(컴파일 시에 라이브러리 코드를 실행파일에 복사하는 방식)

↔ DLL: 각 실행파일에서 해당 라이브러리의 기능을 사용 시에만, 라이브러리 파일을 참조하여(혹은 다운로드받아) 기능을 호출한다.

함수의 코드가 컴파일 시점에 실행파일에 복사되는 것이 아니라 프로그램 실행 중에 자신의 라이브러리에 있는 함수를 호출함. 복사 방식 아님.

프로그램 실행시에, 내 프로그램이 해당 dll 내의 함수를 원한다면, 그때에 dll에 접근을 하여 그것을 사용한 후, 다시 코드 흐름이 되돌아오는 방식으로 실행된다.

따라서 dll파일은 컴파일 후에도 실행파일과 독립되어있으며, 배포시에도 이 dll파일의 위치를 실행파일에서 설정한 공간에 위치시켜줘야한다.

그래서 DLLs는 심지어 실행되지 않은 call이더라도 실행파일의 어느 곳에서나 호출되는 라이브러리의 모든 루틴을 로드한다.

ARM vs MIPS

  • ARM : 임베디드 시스템에서의 가장 널리 사용되는 ISA(명령어 집합 구조)
  • 주요한 차이점
  • MIP는 더 많은 레지스터를 가지고 있고 ARM은 더 많은 주소 지정 모드가 있다.

주소 지정 모드( immediate adressing, direct adressing.. 이런거. 주소 지정 방식)

주소 비트 수는 동일.

  • Instruction 비교 - ARM은 나누기 instruction이 없다. 나중 버전에서 포함됨.
  • Instruction format 비교 - MIPS는 레지스터 32개이고 ARM은 레지스터가 16개이다.

CHAPTER 2 Summary

  • 3가지 디자인 원칙
  • 1) 간단한 것은 규칙적으로 → 산술명령어는 항상 3개의 피연산자 레지스터가 필요하다. 각 Instruction 포맷은 레지스터 필드를 같은 위치에서 유지한다.
  • 2) 작을수록 빠름→ MIPS에는 32개의 레지스터.
  • 2) 좋은 디자인은 좋은 타협 → MIPS는 명령어에서 더 큰 주소와 상수를 제공하고 같은 길이의 명령어를 유지한다.
  • SPEC CPU2006에 대한 명령어 클래스의 인기도(popularity) 산술 명령어 → assignment operation Transfer 명령어 → 배열이나 데이터 구조 다룰 때 conditional branch → if문과 루프에서
profile
아이쿠

0개의 댓글