본문 바로가기

[Chapter 4] 기계어 (Machine Language)

(밑바닥부터 만드는 컴퓨팅 시스템 2판, 인사이트(insight), 2023)을 학습하고 개인 학습용으로 정리한 내용입니다.

 

 

 

 

 

기계어는 기계 수준의 명령어를 코딩할 수 있도록 미리 정의된 언어로, 기계어와 고수준 언어는 목표가 다르다.

설계 목표
기계어 고수준 언어
하드웨어 제어 플랫폼 간 호환성 확보

 

 

기계어가 어떤 하드웨어 플랫폼을 제어하도록 설게된 것이라고 한다면, 그 하드웨어 플랫폼은, 그 기계어로 작성된 명령어를 실행할 수 있도록 만들어졌다고 말할 수도 있다. 즉, 기계어는 CPU별로 각각 존재하며, 이들은 서로 문법이 통하지 않는다.

  • 하드웨어 구성 요소

하드웨어는 메모리, 프로세서, 레지스터로 구성되어 있다. 따라서 기계어의 목표는 프로세서와 레지스터들로 메모리를 조작하는 것이다.

 

  • 메모리

메모리는 컴퓨터에서 데이터와 명령어를 저장하는 장치로, 고유한 주소를 가진다. 

메모리 주소를 이용해서 각각의 메모리에 접근할 수 있다.

 

  • 프로세서

보통 중앙 처리 장치(Central Processing Unit, CPU)라 불리며, 산술 및 논리 연산, 메모리 접근 연산, 제어 연산을 수행한다.

CPU는 2진 명령어를 파싱하고 실행할 수 있는 게이트 논리, ALU, 레지스터 모음으로 구성된다.

 

  • 레지스터

CPU와 메모리는 개별적이고 독립적인 두 개의 칩으로 구현되며, 두 칩 사이에 데이터를 옮기는 건 상대적으로 느린 작업이다. 레지스터는 이 두 칩 사이에 고속으로 데이터를 옮길 수 있도록 돕는다. 이런 이유로 CPU는 여러개의 레지스터를 내부에 포함하고 있다.

CPU 내에 위치한 레지스터들은 두 가지 종류로 나뉜다. 하나는 데이터를 저장하는 데이터 레지스터(data register)고, 다른 하나는 메모리 주소를 저장하는 주소 레지스터(address register)다.

 

  • 어셈블리어 (assembly language)

기계어 프로그램은 2진(binary)과 기호(symbolic)의 두 가지 버전으로 동일하게 작성될 수 있다.

예를 들어 "R1 + R2"를 1010110001000001와 같이 특정한 2진 값으로 정의할 수도 있지만, add R1 R2 같은 기호를 도입해서 표현할 수도 있다.

사람의 입장에서는 기호 버전이 코드 작성, 디버그, 유지보수 측면에서 훨씬 더 쉽다. 하지만 기호 명령어로 프로그램을 작성하면, 그 기호 명령어를 실행 가능한 2진 코드로 번역하는 번역 작업이 필요하다.

기호 언어를 2진 코드로 번역하는 프로그램을 어셈블러(assembler)라 하고, 기호 언어를 어셈블리어(assembly language)라 부른다.