cyphen156

4장 : 기계어 본문

프로젝트/Nand2Tetris

4장 : 기계어

cyphen156 2023. 7. 17. 15:30

기계어와 프로그래밍 언어

프로그래밍 언어플랫폼간 호환성과 프로그래머의 편의에 맞춰 강력한 표현력을 갖도록 설계하여 코딩을 편하게 만들어주는 것이 목표라면 기계어는 프로그래밍언어로 작성된 프로그램을 대상 하드웨어에서 직접 명령을 실행하고, 하드웨어를 완전히 제어하는 것이 설계 목표다. 

다시 말해서 2장과 3장에서 만든 연산기와 메모리를 직접 제어하는 언어이다.

그렇기 때문에 기계어는 하드웨어가 명령을 수행할 수 있도록 2진 버전으로 구성되어 있고 약간의 프로그래머의 편의를 위한 기호 버전으로 나타낼 수 있다.

예를 들어  R1 + R2라는 명령이 있을 때

2진 기계어로 표현한다면 R1 = 00001, R2 = 00010, + = 101011일 때, 이 코드들을 조합(assemble)하면 101011(+)00010(R2)00001(R1)이라는 16비트의 명령어 코드가 될 것이다.

또는 and R2, R1이라는 기호버전(어셈블리어)으로 표시할 수 있다.

하지만 프로그래밍 언어에 비하면 어떠한가? 매우 알아보기 어렵다 그래서 사람들은 초기에는 기계어를 직접 사용하여 컴퓨터를 제어했지만 점차 프로그래머의 생산성을 위해 코드를 인간 친화적으로 설계하게 되었고, 이것이 프로그래밍 언어가 되었다. 그리고 기계어와 프로그래밍 언어의 중간에 위치하여 상호 교환 가능할 수 있도록 어셈블리어가 존재한다.

16비트 기계어(Hack)

4장에서 만들어볼 것은 Hack이라는 기계어다.

핵은 16비트를 기반으로 데이터 메모리와 명령어 메모리라는 두 개의 개별 메모리를 활용한다. 데이터 메모리가 프로그램이 조작하는 2진 값을 저장하면, 명령어 메모리는 프로그램의 명령어들을 저장한다.

이 메모리들은 16비트 단위로 처리되고, 각 각 15비트(2**15 = 약 32,000) 만큼의 주소공간을 가지고 있다. 

메모리 구조

그리고 이 메모리 주소에서 가져온 값들을 연산기가 빠르게 사용할 수 있도록 임시로 저장하고 있는 것이 레지스터이다.

메모리와 레지스터의 구조

여기서 중요한것은 주소 레지스터인 A다.

예를 들어 핵 명령어 @xxx는 주소레지스터 A에 xxx라는 값을 설정한다. 이것은 다시 선택된 주소가 xxx인 데이터 메모리를 선택된 메모리 레지스터 M으로 만들거나 주소가 xxx인 명령어 레지스터의 값을 선택된 명령어가 되게 하는 것이다. 즉, 메모리 레지스터를 조작하거나 선택된 명령어로 무언가를 하는 것이다.

이 외에도 분기, 변수 등에 대한 설명이 있지만 이것들은 다음 글에서 프로그램 예제를 직접 구현하면서 배울것이다. 

 

//모든 자료들은 Nand2Tetris홈페이지에서 찾을 수 있습니다

또는 cyphen156/Work-space: Studying (github.com)에서 찾으실 수 있습니다.