해킹 컴퓨터

Hack computer

'해크 컴퓨터'는 노암 니산과 시몬 쇼켄이 만든 이론적인 컴퓨터 설계로, 저서 '컴퓨팅 시스템의 요소: 첫 번째 원칙에서 현대 컴퓨터를 만드는 것.[1] "현대적"이라는 용어를 사용하는 데 있어서, 저자들은 폰 노이만 건축 모델에 따라 패턴화된 디지털, 바이너리 기계를 가리킨다.null

Hack 컴퓨터는 하드웨어 시뮬레이터 애플리케이션에서 컴퓨터 조직과 아키텍처에 있어 기본적이면서도 포괄적인 과정의 일부로 가상의 실제 건설을 위한 것이다.[2]저자들에 의해 만들어지고 두 부분으로 나눠진 이러한 과정 중 하나는 '첫 원칙에서 현대적인 컴퓨터 구축'이라는 대규모 오픈 온라인 과정(MOOC)으로 자유롭게 이용할 수 있다.낸드에서 테트리스까지.[3]과정에 포함된 12개 프로젝트에서 학습자는 2입력 낸드 게이트로 시작하여 하드웨어(메모리 및 CPU)와 소프트웨어(어셈블러, VM, 자바 유사 프로그래밍 언어, OS)를 모두 포함하여 완전히 작동하는 가상 컴퓨터를 갖게 된다.컴퓨터 하드웨어의 초기 구현에 사용되는 하드웨어 시뮬레이터 외에도, 저자의 웹사이트에서 책과 온라인 코스에 기술된 프로젝트를 지원하는 완전한 Hack 컴퓨터 에뮬레이터 프로그램과 조립기를 이용할 수 있다.[4]null

하드웨어 아키텍처

Hack 컴퓨터 블록 다이어그램

Hack 컴퓨터 하드웨어는 블록 다이어그램에 표시된 3가지 기본 요소로 구성된다.별도의 16비트 메모리 유닛 2개와 중앙 처리 유닛(CPU)이 있다.데이터가 16비트 단어로 컴퓨터에 의해 이동되고 처리되기 때문에 Hack 컴퓨터는 16비트 아키텍처로 분류된다.null

컴퓨터와 지정 ROM의 관점에서 읽기 전용 메모리로 구현된 명령 메모리는 실행을 위해 조립된 이진 프로그램 코드를 가지고 있다.RAM이라고 불리는 랜덤 액세스 메모리는 실행 중인 프로그램의 데이터를 저장할 수 있는 저장 공간을 제공하고 컴퓨터의 메모리 매핑된 I/O 메커니즘을 위한 서비스와 저장 영역을 제공한다.데이터 처리 및 프로그램 제어 관리는 CPU가 제공한다.

세 개의 유닛은 병렬 버스로 연결된다.주소 버스(15비트)와 ROM 및 RAM 장치의 데이터 및 지침 버스(16비트)는 완전히 독립적이다.따라서 Hack 설계는 메모리 유닛과 CPU 사이의 버스 통신에 관하여 하버드 아키텍처 모델을 따른다. 모든 메모리는 단어 어드레싱만 가능하다.null

읽기 전용 메모리(ROM)

Hack 컴퓨터의 ROM 모듈은 개별 주소 지정 가능한 순차 16비트 메모리 레지스터의 선형 배열로 표시된다.주소는 0(0x0000)에서 시작한다.메모리 소자는 순차적 장치이기 때문에 시스템 시계 신호는 시뮬레이션 애플리케이션과 컴퓨터 에뮬레이터 애플리케이션에 의해 공급된다.ROM 어드레스 버스는 폭이 15비트여서, 프로그램 지침에는 총 32,768개의 개별 단어를 사용할 수 있다.현재 활성 워드의 주소는 CPU 내의 프로그램 카운터 레지스터에 의해 제공된다(아래 참조).특정 클럭 사이클에서 명령 어드레스 버스에 배치된 주소로 식별된 ROM 메모리 레지스터의 값은 다음 사이클이 시작될 때 "전류" 명령으로 이용할 수 있다.지시 레지스터는 없으며, 지시사항은 현재 활성화된 ROM 레지스터에서 각 사이클마다 디코딩된다.null

RAM(Random Access Memory)

RAM 모듈은 개별적으로 어드레싱 가능한 순차, 읽기-쓰기, 16비트 메모리 레지스터의 연속적인 선형 배열로도 간주되지만, 기능적으로 어드레스 범위별로 3개의 세그먼트로 구성된다.주소 0 (0x000) ~ 16383 (0x3FFFF)은 기존의 16비트 읽기-쓰기 레지스터를 포함하며 범용 프로그램 데이터 저장소로 사용된다.null

주소 16384 (0x4000) ~ 24575 (0x5FFFF)의 레지스터는 본질적으로 데이터 RAM과 같으나, 내장된 화면 I/O 하위시스템에 의해 사용하도록 지정되기도 한다.이 범위의 주소에 기록된 데이터는 컴퓨터의 가상 256 x 512 화면에서 출력을 생성하는 부작용이 있다(I/O 참조).프로그램이 화면 출력을 요구하지 않는 경우, 이 범위의 레지스터를 일반 프로그램 데이터에 사용할 수 있다.null

RAM 주소 공간의 최종 주소 24576(0x6000)는 Hack 에뮬레이터 프로그램을 호스팅하는 컴퓨터에 부착된 키보드의 출력에 의해 현재 값이 제어되는 단일 단어 레지스터를 포함한다.이 키보드 메모리 맵 레지스터는 읽기 전용입니다(I/O 참조).null

24577 (0x6001) ~ 32767 (0x7FFFF) 범위의 데이터 메모리 주소는 유효하지 않다.선택한 RAM 메모리 레지스터의 상태 전환도 시스템 클럭 신호에 의해 조정된다.null

중앙 처리 장치(CPU)

Hack Computer CPU Block Diagram
Hack 컴퓨터 CPU 블록 다이어그램

첨부 다이어그램에 표시된 Hack computer central processing unit(CPU)는 내부 구조를 가진 통합 로직 유닛이다.그것은 상업적으로 이용 가능한 단순 CPU에서 발견되는 많은 기능을 제공한다.CPU의 가장 복잡한 요소는 컴퓨터의 연산 기능을 제공하는 산술 논리 단위(ALU)이다.ALU는 두 개의 16비트 입력 피연산자와 하나의 16비트 출력을 가진 결합 논리 장치다.피연산자로부터의 출력으로 생성된 계산은 ALU에 대해 순서가 지정된 6개의 단일 비트 입력 세트로 지정된다.또한 ALU는 계산 결과가 0(zr 플래그)인지 음(ng 플래그)인지를 나타내는 두 개의 단일 비트 상태 플래그를 방출한다.null

CPU에는 D와 A라는 레이블이 붙은 두 개의 16비트 레지스터도 포함되어 있다.D(데이터) 레지스터는 ALU x 피연산자를 현재 값이 항상 공급하는 범용 레지스터로, 일부 지침에서는 값이 무시된다.A(주소) 레지스터는 지침으로 지시되었을 때 ALU에 대한 y 피연산자로서 현재 값을 제공할 수도 있지만, 그 값은 데이터 메모리 주소 지정 및 분기 지시사항에 대한 지침 메모리의 표적 주소로도 사용될 수 있다.이 기능을 용이하게 하기 위해, A 레지스터는 하드웨어에서 명시적으로 구현되지 않는 M으로 지정된 "의사 레지스터"와 직접 관련된다.따라서 이 M 레지스터는 A 레지스터에 포함된 현재 값의 주소를 가진 RAM에 포함된 값을 나타낸다.null

CPU의 마지막 중요한 요소는 프로그램 카운터(PC) 레지스터다.PC는 16비트 이진 카운터로, 낮은 15비트가 다음 실행 지침의 명령 메모리에 주소를 지정한다.분기 지침에 의해 달리 지시되지 않는 한, PC는 각 클럭 사이클이 끝날 때마다 값을 증가시킨다.CPU는 또한 PC를 비순차적 값으로 설정함으로써 프로그램 제어 하에서 컴퓨터의 명령 실행 순서를 변경하기 위한 논리를 포함한다.PC는 또한 로직 0에서 로직 1로 사이클링하여 PC 값을 0(0x0000)으로 초기화하는 단일 비트 재설정 입력을 구현한다.많은 실제 CPU 설계와 달리 CPU 외부 또는 내부 인터럽트나 기능 호출 지원을 구현하기 위해 제공되는 프로그램 액세스 가능한 하드웨어 메커니즘은 없다.null

외부 입력 및 출력(I/O)

Hack 컴퓨터는 I/O에 대한 메모리 맵 방식을 사용한다.가상 256 x 512 화면에 대한 비트맵, 흑백 출력은 데이터 메모리 위치 16384(0x4000) ~ 24575(0x5FFFF)에 원하는 출력의 비트맵을 작성함으로써 영향을 받는다.이 주소 범위의 데이터 워드는 컴퓨터 에뮬레이터의 가상 화면에서 단일 픽셀의 흑백 상태를 나타내는 각 비트 값을 가진 비트의 선형 배열로 간주된다.화면 RAM 세그먼트의 첫 번째 메모리 주소에서 단어 중 가장 유의하지 않은 비트는 화면 왼쪽 상단 모서리에 있는 픽셀이 0이면 흰색, 1이면 검정색으로 설정한다.첫 번째 단어의 다음 중요 비트는 오른쪽의 다음 픽셀을 제어하는 등의 작업을 한다.첫 번째 512픽셀 행이 화면 메모리의 첫 32단어로 설명되고 나면, 다음 32단어로 두 번째 행에 대해서도 같은 방식으로 매핑을 계속한다.컴퓨터 외부의 논리는 클럭 사이클당 화면 RAM 메모리 맵 세그먼트를 여러 번 읽고 가상 화면을 업데이트한다.null

키보드가 CPU 에뮬레이터 프로그램을 호스팅하는 컴퓨터에 연결되어 있는 경우 에뮬레이터는 프로그램 실행 중에 누른 키에 해당하는 왼쪽 0 확장 8비트 스캔 코드를 RAM 주소 24576(0x6000)의 키보드 리시스터에 넣는다.키를 누르지 않으면 이 레지스터에 값 0이 포함되어 있다.에뮬레이터는 토글 버튼을 제공하여 키보드를 활성화/비활성화한다.인코딩 체계는 인쇄 가능한 문자의 ASCII 인코딩을 근접하게 따른다.Shift 키의 효과는 일반적으로 인정된다.표준 PC 키보드에 흔히 나타나는 다른 키(예: 방향 제어 키(←, ↑, ↓, ↓, →)와 Fn 키에도 코드가 제공된다.화면 메모리와 마찬가지로 키보드 메모리 레지스터는 클록 사이클당 여러 번 업데이트된다.null

작동 사이클

CPU와 메모리 장치의 단계적 작동은 하드웨어 시뮬레이터와 컴퓨터 에뮬레이터 프로그램 모두에 내장된 시계에 의해 제어된다.클럭 사이클이 시작될 때 프로그램 카운터의 현재 값에 의해 방출되는 ROM 주소의 명령이 디코딩된다.지침에 명시된 ALU 피연산자는 필요한 경우 보안한다.지정된 계산은 ALU에 의해 수행되며 적절한 상태 플래그가 설정된다.계산 결과는 지침에서 지정한 대로 저장된다.마지막으로 프로그램 카운터는 필요한 다음 프로그램 지침 값으로 업데이트된다.현재의 지시로 분기가 지정되지 않은 경우, PC 값은 단순히 증가된다.분기 지정이 된 경우, PC는 (A 레지스터로부터) 실행될 다음 명령의 주소와 함께 로드된다.그런 다음 현재 PC 값을 사용하여 주기를 반복한다.null

Hack 컴퓨터는 하버드 메모리 아키텍처 모델 때문에 현재의 명령을 실행하고 다음 명령을 2부 클럭 사이클 하나로 "추출"하도록 설계되었다.시계의 속도는 하드웨어 시뮬레이터와 CPU 에뮬레이터의 제어 요소에 의해 달라질 수 있다.그러나 선택한 속도와는 별개로 각 명령은 한 사이클에서 완전히 실행된다.사용자는 프로그램을 통해 한 단계씩 이동할 수도 있다.null

ROM에 로드된 프로그램의 실행은 CPU의 재설정 비트에 의해 제어된다.재설정 비트 값이 0이면 위에서 설명한 동작 주기에 따라 실행이 진행된다.재설정 비트를 1로 설정하면 PC가 0으로 설정된다.재설정 비트 값을 0으로 다시 설정한 다음 첫 번째 지침에서 현재 프로그램의 실행을 시작하지만, RAM에는 재설정 시 이전 활동의 값이 포함되어 있다.null

어떤 종류의 인터럽트에 대한 하드웨어 또는 기계 언어 지원은 없다.null

데이터 유형

ROM 메모리에 저장된 값은 명령 집합 아키텍처 섹션에 설명된 대로 유효한 Hack 기계 언어 지침을 나타내야 한다.null

16비트 값은 RAM에 저장할 수 있다.RAM에 저장된 값의 데이터 유형은 프로그램 내 위치 및/또는 데이터 사용에 의해 유추된다.기본 하드웨어 지원 데이터 유형은 16비트 부호 정수로, 2의 보완 형식으로 표시된다.따라서 서명된 정수의 범위는 -32768 ~ 32767이다.RAM의 값 중 낮은 15비트는 포인터의 의미에서도 ROM이나 RAM의 주소를 나타낼 수 있다.null

화면 I/O에 할당된 RAM 메모리 레지스터의 값의 경우 화면이 "켜짐" 상태일 경우 컴퓨터의 독립 I/O 하위 시스템에 의해 256행 x 512열 가상 화면의 16픽셀 맵으로 해석된다.null

키보드 메모리의 코드 값은 프로그래밍 방식으로 읽을 수 있으며 프로그램에서 사용하도록 해석할 수 있다.null

부동 소수점 유형에 대한 하드웨어 지원은 없다.null

ISA(지시 집합 아키텍처) 및 기계 언어

Hack 컴퓨터의 명령 집합 아키텍처(ISA)와 파생 기계 언어는 다른 많은 아키텍처에 비해 희박하다.ALU에 의한 연산을 지정하는 데 사용되는 6비트는 64개의 구별되는 지시를 허용할 수 있지만, Hack 컴퓨터의 ISA에서는 18개만이 공식적으로 구현된다.Hack 컴퓨터 하드웨어는 정수 곱하기(및 나누기)나 함수 호출을 직접 지원하지 않기 때문에, ISA에는 이러한 작업에 해당하는 기계 언어 지침이 없다.null

해킹 기계어에는 각각 16개의 이진수로 인코딩된 두 가지 유형의 지침만 있다.null

A-지침

가장 중요한 비트가 "0"인 지시사항을 A지침 또는 주소지침이라고 한다.A-장치는 다음과 같이 비트 필드로 암호화된다.

0bbbbbbbbbbbb14131211109876543210.

0 – A-인스트레이션에서 가장 중요한 비트는 "0"이다.

b14 - b0 - 이 비트는 0 ~ 32767 범위의 음수가 아닌 정수의 이진 표현을 제공한다.

이 명령이 실행되면 나머지 15비트는 좌제로 확장되어 CPU의 A 레지스터에 로드된다.부작용으로서, 해당 값으로 대표되는 주소를 가지는 RAM 레지스터는 다음 클럭 사이클에서 후속 읽기/쓰기 작업을 위해 활성화된다.null

C-인스턴스

C-지침(계산지침)으로 알려진 다른 명령어 유형은 "1"을 가장 중요한 비트로 한다.나머지 15비트는 피연산자, 수행된 연산 및 지정된 계산 결과에 대한 저장 위치를 정의하기 위해 비트 필드 인코딩으로 되어 있다.또한 이 지침은 가장 최근의 계산 결과에 기초한 프로그램 분기를 지정할 수 있다.C-장치는 다음과 같이 비트 필드로 인코딩된다.

1xxacccccdddjjj10543210210210.

1 – C-인스트레이션에서 가장 중요한 비트는 "1"이다.

xx10 – 이러한 비트는 CPU에 의해 무시되고 관례에 따라 각각 "1"로 설정됨

a – 이 비트는 계산에 사용될 때 ALU의 "y" 피연산자의 소스를 지정한다.

c-c05 – 이 6개의 제어 비트는 ALU에 의해 수행될 피연산자와 계산을 지정한다.

d-d20 – 이 세 비트는 현재 ALU 출력을 저장할 대상을 지정함

j-j20 – 이 세 비트는 산술 분기 조건, 무조건 분기(jump) 또는 분기 없음(no branching)을 지정한다.

C-인스트레이션의 Hack 컴퓨터 인코딩 방식은 다음 표에 나와 있다.null

이 테이블에서,

  • A는 현재 A-register에 포함된 값을 나타낸다.
  • D는 현재 D-register에 포함된 값을 나타낸다.
  • M은 현재 A-register에 포함된 주소인 데이터 메모리 레지스터에 포함된 값을 나타낸다. 즉, M == RAM[A]
기계 언어 계산 기능 코드 및 조립 언어 연상 장치
a c5 c4 c3 c2 c1 c0 ALU 출력: f(x,y) 니모닉
0 1 0 1 0 1 0 출력 0, 모든 피연산자 무시 0
0 1 1 1 1 1 1 출력 1; 모든 피연산자 무시 1
0 1 1 1 0 1 0 출력 -1; 모든 피연산자 무시 -1
0 0 0 1 1 0 0 출력 D, A 및 M 무시 D
0 1 1 0 0 0 0 출력 A, D 및 M 무시 A
1 1 1 0 0 0 0 출력 M, D 및 A 무시 M
0 0 0 1 1 0 1 D의 비트 부정 출력, A 및 M 무시 !D
0 1 1 0 0 0 1 비트 A 부정 출력, D 및 M 무시 !A
1 1 1 0 0 0 1 M의 비트 부정 출력, D 및 A 무시 !M
0 0 0 1 1 1 1 출력 2의 D 보완값 음수, A 및 M 무시 -D
0 1 1 0 0 1 1 출력 2의 A 보충수 음수, D 및 M 무시 -A
1 1 1 0 0 1 1 출력 2의 M 보충수 음수, D 및 A 무시 -M
0 0 0 1 1 1 1 출력 D + 1(증가 D), A 및 M 무시 D+1
0 1 1 0 1 1 1 출력 A + 1(증가 A), D 및 M 무시 A+1
1 1 1 0 1 1 1 출력 M + 1(증가 M), D 및 A 무시 M+1
0 0 0 1 1 1 0 출력 D - 1(감소 D), A 및 M 무시 D-1
0 1 1 0 0 1 0 출력 A - 1(감소 A), D 및 M 무시 A-1
1 1 1 0 0 1 0 M-1(감소 M) 반환, D 및 A 무시 M-1
0 0 0 0 0 1 0 출력 D + A, 무시 M D+A
1 0 0 0 0 1 0 D + M 출력, A 무시 D+M
0 0 1 0 0 1 1 출력 D - A; M 무시 디에이
1 0 1 0 0 1 1 출력 D - M, A 무시 D-M
0 0 0 0 1 1 1 A - D 출력, M 무시 A-D
1 0 0 0 1 1 1 출력 M - D, A 무시 M-D
0 0 0 0 0 0 0 비트 논리 및 D 및 A 출력, M 무시 디앤에이
1 0 0 0 0 0 0 비트 와이즈 논리 및 D와 M 출력, A 무시 디앤엠
0 0 1 0 1 0 1 비트 논리 또는 D 및 A 출력, M 무시 DA
1 0 1 0 1 0 1 비트 논리 또는 D 및 M 출력, A 무시 DM
기계 언어 계산 결과 저장 코드 및 조립 언어 연상 장치
d2 d1 d0 ALU 출력 저장 위치 니모닉
0 0 0 출력이 저장되지 않음 없는
0 0 1 M M
0 1 0 D D
0 1 1 D와 M DM
1 0 0 A A
1 0 1 A와 M AM
1 1 0 A와 D AD
1 1 1 A, D, M ADM
기계 언어 분기 상태 코드 및 어셈블리 언어 연상키
j2 j1 j0 분기: 니모닉
0 0 0 가지 없음 없는
0 0 1 0보다 큰 출력 JGT
0 1 0 출력은 0과 같다. JEQ
0 1 1 출력이 0보다 크거나 같음 JGE
1 0 0 다음보다 작은 출력 JLT
1 0 1 출력이 0이 아님 JNE
1 1 0 출력이 0보다 작거나 같음 JLE
1 1 1 무조건분기점 JMP

어셈블리 언어

Hack 컴퓨터는 텍스트 기반의 조립 언어를 가지고 있어 Hack 컴퓨터 ISA를 구현하는 하드웨어 플랫폼용 프로그램을 만든다.해커 어셈블리 언어 프로그램은 파일 이름 확장명이 ".asm"인 텍스트 파일에 저장할 수 있다.해커 어셈블리 언어 소스 파일은 대소문자를 구분한다.각 텍스트 행은 다음 요소 중 하나를 포함한다.

  • 빈 줄
  • 댓글
  • 레이블 선언(선택 사항의 줄 끝 설명 포함)
  • A-제도(선택 사항의 종단 코멘트 포함)
  • C-제도(선택 사항의 종단 설명 포함)

이러한 각 선 유형은 특정 구문을 가지며 미리 정의된 또는 사용자 정의 기호 또는 숫자 상수를 포함할 수 있다.빈 줄과 코멘트는 조립자에 의해 무시된다.라벨 선언, A-지침 및 C-지침은 아래 정의된 바와 같이 선행 또는 후행 공백이 허용되고 무시되지만 내부 공백 문자를 포함하지 않을 수 있다.null

평.

2자 시퀀스 "/"로 시작하는 모든 텍스트는 주석이다.코멘트는 소스 코드 라인에만 나타날 수 있으며, 다른 프로그램 소스 라인의 끝에 배치될 수도 있다.주석 식별자 문자 시퀀스를 따라 줄의 끝까지 이어지는 모든 텍스트는 조립자에 의해 완전히 무시되며, 결과적으로 기계 코드를 생성하지 않는다.null

기호 및 숫자 상수

hack 어셈블리 언어는 영숫자 기호를 다양한 특정 용도의 숫자에 사용할 수 있도록 허용한다.기호는 알파벳 순서(상단 및 소문자) 또는 숫자 자릿수일 수 있다.기호는 막대("_"), 달러 기호("$" 및 콜론(":")에서 다음 문자를 포함할 수도 있다.기호는 숫자 문자로 시작할 수 없다.기호는 대소문자를 구분한다.사용자 정의 기호는 변수 이름과 레이블을 만드는 데 사용된다(아래 참조).null

Hack 조립 언어 조립자는 조립 언어 프로그램에 사용하기 위해 미리 정의된 기호를 인식한다.기호 R0, R1, …, R15는 각각 0에서 15까지의 정수에 구속된다.이러한 기호는 범용 레지스터를 나타내기 위한 것이며 따라서 기호 값은 데이터 메모리 주소 0부터 15까지를 나타낸다.메모리 매핑된 가상 화면 출력 시작(16384)과 키보드 입력(24756)의 데이터 메모리 주소를 나타내도록 미리 정의된 기호 SCREEN과 KBD도 지정된다.운영 체제 소프트웨어 스택을 구축하는 데 사용되는 몇 가지 다른 기호(SP, LCL, ARG, THE, THE, THE)가 있다.null

0에서 32,767 범위의 음수가 아닌 소수 상수를 나타내기 위해 소수점(0-9)의 침을 사용할 수 있다.음수를 나타내기 위해 마이너스 부호를 사용하는 것은 허용되지 않는다.이진 또는 8진법은 지원되지 않는다.null

변수

사용자 정의 기호는 변수, 즉 명명된 RAM 레지스터를 나타내기 위해 조립 언어 프로그램에서 생성될 수 있다.이 기호는 조립 시 조립자가 선택한 RAM 주소에 바인딩되어 있다.따라서 조합 언어 소스 코드에 표시될 때는 변수를 주소로 취급해야 한다.null

변수는 A-인스트레이션에서 처음 참조될 때 어셈블리 언어 소스 코드에 암묵적으로 정의된다.조립자가 소스 코드를 처리할 때 변수 기호는 주소 16에서 시작하는 고유한 양의 정수 값에 바인딩된다.주소는 소스 코드에 처음 나타나는 순서에 따라 가변 기호에 순차적으로 바인딩된다.관례에 따라 프로그램 변수를 식별하는 사용자 정의 기호는 모두 소문자로 작성된다.null

레이블

라벨은 왼쪽("")과 오른쪽(")" 괄호로 구분된다.그것들은 별도의 소스 프로그램 라인에 정의되며, 조립자에 의해 소스 코드에 있는 다음 명령의 명령 메모리 위치의 주소로 구속된다.라벨은 한 번만 정의될 수 있지만, 라벨이 정의된 라인 이전이라도 프로그램 내의 어느 곳에서나 여러 번 사용할 수 있다.관례에 따라 라벨은 올캡으로 표현된다.그것들은 지점 C-지침의 목표 주소를 식별하는 데 사용된다.null

A-지침

A-instruction에는 "@xxxxx"라는 구문이 있는데, 여기서 xxxxxx는 0 ~ 32767 범위의 숫자 십진수 상수, 라벨 또는 변수(미리 정의 또는 사용자 정의)이다.이 명령은 실행될 때 A 레지스터와 M 사이비 레지스터의 값을 "xxxx"로 나타내는 15비트 이진수 값으로 설정한다.15비트 값은 A 레지스터에서 16비트까지 왼쪽 0으로 확장된다.null

A-장치는 세 가지 목적 중 하나로 사용할 수 있다.프로그램 제어 하에 컴퓨터에 (부정음) 숫자 값을 도입할 수 있는 유일한 수단이다. 즉, 프로그램 상수를 만드는 데 사용할 수 있다.둘째로, C-인스트루먼트에 의한 후속 참조를 위해 M 사이비 레지스터 메커니즘을 이용하여 RAM 메모리 위치를 지정하는데 사용한다.마지막으로 분기를 지정하는 C-인스트레이션은 A 레지스터의 현재 값을 분기 대상 주소로 사용한다.A-지침은 일반적으로 라벨을 참조하여 분기 지시 전에 대상 주소를 설정하는 데 사용된다.null

C-지침

C지침은 Hack 컴퓨터의 ALU 연산 엔진과 프로그램 흐름 제어 기능을 지시한다.명령 구문은 "comp", "dest" 및 "jump"로 언급되는 세 가지 필드에 의해 정의된다.모든 C-instruction에서 컴팩트 필드가 필요하다.C-인스트레이션 구문은 "dest=comput;jump"이다."="와 ";" 문자는 명령의 필드를 구분하는 데 사용된다.목적지 필드를 사용하지 않으면 "=" 문자가 생략된다.점프 필드를 사용하지 않으면 ";" 문자가 생략된다.C-인스트레이션은 내부 공간을 허용하지 않는다.null

컴프 필드는 위 표에 정의된 28개의 문서화된 니모닉 코드 중 하나여야 한다.이러한 코드는 구별되는 단위로 간주되며, 내부 공간이 없는 올캡으로 표현해야 한다.6 ALU 제어 비트는 잠재적으로 64개의 연산 기능을 명시할 수 있지만, 표에 제시된 18개 기능만 조립자에 의한 인정을 위해 공식적으로 문서화된다.null

목적지 필드를 사용하여 지정된 계산 결과를 저장할 하나 이상의 위치를 지정할 수 있다.이 필드를 생략하면 "=" 구분 기호와 함께 계산 값이 저장되지 않는다.허용된 저장 위치 조합은 위의 표에 정의된 니모닉 코드로 지정된다.null

점프 필드는 실행할 다음 명령의 ROM 주소를 지정하는 데 사용할 수 있다.필드를 생략한 경우 ";" 구분 기호와 함께 현재 지침에 따라 명령이 즉시 실행된다.지점 주소 대상(ROM)은 지정된 지점 조건이 충족되면 A 레지스터의 현재 값에 의해 제공된다.분기 조건이 실패하면 ROM의 다음 지시로 실행이 계속된다. 현재 계산 값에 기초한 6가지 다른 비교를 위해 니모닉 코드가 제공된다.또한 일곱 번째 옵션으로 무조건적인 분기가 제공된다.무조건 분기에 대해서는 값이 필요하지 않더라도 항상 comp 필드를 제공해야 하기 때문에 본 지침의 구문은 "0;JMP"로 주어진다.지원되는 분기 조건은 위의 표에 명시되어 있다.null

조립자

Hack 컴퓨터를 지원하는 자유롭게 이용할 수 있는 소프트웨어에는 명령줄 조립기 응용 프로그램이 포함되어 있다.조립자는 Hack 조립체 언어 소스 타일(*.asm)을 읽고 Hack 기계어 출력 파일(*.hack)을 생성한다.기계어 파일도 텍스트 파일이다.이 파일의 각 줄은 "Instruction set architecture(ISA) 및 machine language" 절에 기술된 사양에 따라 소스 텍스트 파일의 각 해당 실행 파일의 인코딩을 나타내는 16자리의 이진수 문자열이다.생성된 파일은 에뮬레이터 사용자 인터페이스에서 제공하는 설비에 의해 Hack 컴퓨터 에뮬레이터에 로드될 수 있다.null

어셈블리 언어 프로그램 예제

다음은 Hack 어셈블리 언어로 작성된 주석이 달린 예제 프로그램이다.이 프로그램은 처음 100개의 연속 정수를 집계하고 계산 결과를 "sum"이라는 사용자 정의 변수에 배치한다.그것은 정수 값 1에서 100까지 반복하기 위해 "while" 루프 구성을 구현하고 각 정수를 "sum" 변수에 추가한다.사용자 정의 변수 "cnt"는 루프를 통해 현재 정수 값을 유지한다.이 프로그램은 메모리 매핑된 I/O를 제외한 Hack Computer의 "문서화된" 조립 언어의 모든 기능을 보여준다.null

Hack assembly language source 파일의 내용은 두 번째 열에 굵은 글꼴로 표시된다.다음 논의에서 참조할 수 있도록 라인 번호가 제공되지만 소스 코드에는 나타나지 않는다.조립자가 생산한 Hack 기계코드는 앞의 열에 할당된 ROM 주소가 있는 마지막 열에 표시된다.전체 줄 설명, 빈 줄 및 레이블 정의 문은 기계 언어 코드를 생성하지 않는다는 점에 유의하십시오.또한 조립 언어 지침이 포함된 각 줄의 끝에 제공된 코멘트는 조립자에 의해 무시된다.null

마지막 열에 표시된 어셈블러 출력은 16비트 이진 정수 표현이 아닌 16개의 이진 문자로 구성된 텍스트 문자열이다.null

라인

Nbr

해킹 조립 언어 프로그램 운영 노트 지시

유형

롬

애드르

해크머신

코드

01 // 연속 정수 1 ~ 100 추가 프로그램 동작을 설명하는 설명 풀라인 코멘트 - - - - 코드가 생성되지 않음
02 // 합계 = 1 + 2 + 3 + ...+ 99 + 100 코멘트는 조립자에 의해 무시됨 풀라인 코멘트 - - - - 코드가 생성되지 않음
03 빈 소스 라인이 어셈블러에 의해 무시됨 빈 줄 - - - - 코드가 생성되지 않음
04 @t // 루프 카운터 선언 변수 기호 "cnt"가 16으로 바인딩됨 A-지령 00 0000000000001000
05 M=1 // 루프 카운터를 1로 초기화 램[16] ← 1 C-인스트레이션 01 1110111111001000
06 @sum // 누적합계 선언 변수 기호 "sum"이 17로 바인딩됨 A-지령 02 0000000000010001
07 M=0 // 합을 0으로 초기화 RAM[17] ← 0 C-인스트레이션 03 1110101010001000
08 (LOOP) // while loop의 시작 ROM 주소에 바인딩된 레이블 기호 04 라벨 선언 - - - - 코드가 생성되지 않음
09 @t // cnt의 참조 추가자 M ← 16 A-지령 04 0000000000001000
10 D=M // 현재 cnt 값을 D로 이동 D ← RAM[16] C-인스트레이션 05 1111110000010000
11 @100 // 루프 제한을 A로 로드 A ← 100 A-지령 06 0000000001100100
12 D=D-A // 루프 테스트 연산 수행 D ← D - A C-인스트레이션 07 1110010011010000
13 @END // 분기의 대상 로드 M ← 18 A-지령 08 0000000000010010
14 D;JGT //D > 0일 경우 루프 종료 조건부 분기 C-인스트레이션 09 1110001100000001
15 @t // cnt의 참조 추가자 M ← 16 A-지령 10 0000000000001000
16 D=M // 현재 cnt 값을 D로 이동 D ← RAM[16] C-인스트레이션 11 1111110000010000
17 @sum // 합계 참조 주소 M ← 17 A-지령 12 0000000000010001
18 M=D+M // 합계에 cnt 추가 M ← D + RAM[17] C-인스트레이션 13 1111000010001000
19 @t // cnt의 참조 추가자 M ← 16 A-지령 14 0000000000001000
20 M=M+1 // 증분 카운터 램[16] ← 램[16] + 1 C-인스트레이션 15 1111110111001000
21 @LOOP // 분기의 대상 로드 M ← 4 A-지령 16 0000000000000100
22 0;JMP // LOOP 항목으로 점프 무조건분기점 C-인스트레이션 17 1110101010000111
23 (END) // 종료 루프 시작 ROM 주소 18에 바인딩된 레이블 기호 라벨 선언 - - - - 코드가 생성되지 않음
24 @END // 분기의 대상 로드 M ← 18 A-지령 18 0000000000010010
25 0;JMP // END 항목으로 점프 무조건분기점 C-인스트레이션 19 1110101010000111

지시 순서는 A-지침, C-지침, A-지침, C-지침, ...의 패턴을 따른다는 점에 유의한다. 이것은 Hack 조립 언어 프로그램의 전형이다.A-지령에는 후속 C-지령에서 사용되는 상수 또는 메모리 주소가 지정된다.null

A-인스트레이션의 세 가지 변형이 모두 설명되어 있다.11행(@100)에서는 상수값 100이 A 레지스터에 로드된다.이 값은 라인 12(D=D-A)에서 루프 분기 조건 테스트에 사용되는 값을 계산하는 데 사용된다.null

4행(@cnt)은 사용자 정의 변수 "cnt"의 첫 번째 모양을 포함하고 있으므로, 이 문장은 기호를 사용하지 않는 다음 RAM 주소에 바인딩한다.이 경우 주소는 16이며 이 값은 A 레지스터에 로드된다.또한 M phosphy-register도 현재 이 주소를 참조하고 있으며, RAM[16]이 활성 RAM 메모리 위치로 만들어진다.null

A-인스트루먼트의 세 번째 용도는 라인 21(@LOOP)에서 볼 수 있다.여기서 명령은 ROM 메모리에서 주소를 나타내는 바운드 라벨 값을 A 레지스터와 M 사이비 레지스터에 로드한다.라인 22(0;JMP)의 후속 무조건 분기 명령은 M 레지스터 값을 CPU의 프로그램 카운터 레지스터에 로드하여 루프의 시작에 대한 제어 전송을 유효하게 한다.null

Hack 컴퓨터는 프로그램 실행을 중지하기 위한 기계 언어 지침을 제공하지 않는다.프로그램의 마지막 두 라인(@END 및 0;JMP)은 Hack 조립체 프로그램이 CPU 에뮬레이터에서 실행되도록 설계된 프로그램을 종료하기 위해 일반적으로 사용하는 무한 루프 조건을 생성한다.null

참고 항목

  • 헤네시, 존 L, 패터슨, 데이비드 A.(2019년).컴퓨터 아키텍처: 정량적 접근법, 제6판.매사추세츠 주 캠브리지:모건 카우프만 출판사
  • 정의, 매튜(2021).컴퓨터가 실제로 작동하는 방식.캘리포니아 주 샌프란시스코:녹말 압착 금지.
  • Malvino, Albert P, & Brown, Jerald A. (1993)디지털 컴퓨터 전자, 제3판.뉴욕: 글렌코 맥그라우힐
  • Null, Linda, & Lobur, Julia.(2019).컴퓨터 조직과 건축의 필수품. 제5판.매사추세츠주 벌링턴: 존스와 바틀렛 학습.
  • 패트, 예일 N, & 파텔, 산제이 J.(2020).컴퓨팅 시스템 소개: Bits and Gates에서 C와 Beyond, 3판까지.뉴욕, 뉴욕: 맥그로 힐 교육.
  • 페트졸드, 찰스(2009).코드: 컴퓨터 하드웨어 및 소프트웨어의 숨겨진 언어.워싱턴 주 레드몬드:마이크로소프트 프레스.
  • 스콧, 존 클라크(2009년).하지만 그것은 어떻게 알까? 모두를 위한 컴퓨터의 기본 원리.플로리다의 올드스마르: 존 C.스캇
  • 휘플, 리처드(2019년)Scratch로 자신만의 컴퓨터를 만드십시오.워싱턴 주 시애틀:아마존 킨들.

참조

  1. ^ Nisan, Noam; Schocken, Shimon (2021). The Elements of Computing Systems: Building a Modern Computer from First Principles, 2nd Edition. Cambridge, Massachusetts: The MIT Press.
  2. ^ 쇼켄, 시몬(2021), 낸드 투 테트리스 티데부스.null
  3. ^ "Build a Modern Computer from First Principals: From Nand to Tetris". Retrieved 21 August 2021.{{cite web}}: CS1 maint : url-status (링크)
  4. ^ "From Nand to Tetris". Retrieved 23 August 2021.{{cite web}}: CS1 maint : url-status (링크)