Skip to main content

Chapter 04

Machine Language

4장에서는 기계어를 통해 CPU가 어떤 방식으로 가장 간단한 프로그램을 실행하는지를 배웠다. 컴퓨터과학 태동기에 어쩌다가 천공 카드를 사용하여 프로그램을 작성하게 된 것인지 이해하게 되었다.

Instruction과 Assembly

CPU가 수행하는 모든 작업은 본질적으로 명령어(Instruction)에 따라 데이터를 처리하는 것이다. 즉, 모든 프로그램은 결국 실행하는 CPU가 따르는 명령어 집합(Instruction set)에 정의된 기본 명령어의 조합 형태로 실행되는 것이다.

최초의 프로그램은 이러한 명령어 집합을 직접 사용하여 CPU의 작업을 정의했을 것이나, 매우 불편하고 실수의 여지가 높다. 이 때 명령어와 메모리 주소 등 필요한 항목에 이를 나타내는 기계어(이진 입력)와 1:1로 대응하는 연상 기호(Mnemonic)를 붙이면 훨씬 작성하기 편하고 가독성도 좋아지는데(물론 어디까지나 기계어와 비교했을 때), 이를 어셈블리(Assembly)라고 한다.

어셈블리는 언어로 불리지만 기계어와 1:1로 대응한다는 점에서 본질적으로는 표기법(Notation)에 가깝다. 어셈블리 표준은 다양한 CPU 아키텍처 간 호환을 위해 반드시 필요한 것 같은데 왜 없는지가 궁금해졌는데, 찾아보니 표준은 있긴 하지만 준수되고 있지는 않다고 한다.

Project

이번 과제는 2장에서 구현해본 ALU에서 실행이 가능한 16비트 명령어를 사용하는 간단한 프로그램을 작성해보는 것이었다. 메모리의 주소 공간을 15비트로 정의하면서, 2^15 = 대략 32K개의 레지스터를 사용할 수 있게 되었지만, 16비트 명령어에 15비트짜리 메모리 주소를 사용하기에는 자리가 모자라므로 주소를 통한 메모리의 접근은 A 레지스터의 값을 주소로 사용하는 방식을 채택하였다. 또, 특정 주소 구간의 레지스터를 모니터 출력(0x4000 ~ 0x5999)과 키보드 입력(0x6000)으로 할당해서 입/출력 장치와의 상호작용도 구현한 것을 볼 수 있었다.

작성한 프로그램을 위와 같이 assembler를 통해 .hack 확장자를 가진 binary 파일로 변환하였다.

binary 파일을 시뮬레이터로 실행하면서 키보드 입력이 발생할 경우 모니터의 픽셀이 검은 색으로 채워져 나가는 과정을 확인할 수 있었다.

출처