리틀맨 컴퓨터
Little man computer리틀맨 컴퓨터([1]LMC)는 1965년 스튜어트 매드닉 박사가 만든 컴퓨터 교육 모델이다.LMC는 현대적인 컴퓨터의 모든 기본 기능을 갖춘 단순한 von Neumann 아키텍처 컴퓨터를 모델링하기 때문에 학생들을 가르치는 데 일반적으로 사용됩니다.기계 코드(2진수가 아닌 10진수) 또는 어셈블리 [2][3][4]코드로 프로그래밍할 수 있습니다.
LMC 모델은 밀폐된 우편실에 갇힌 작은 남자(이 시나리오에서는 컴퓨터와 유사)의 개념을 기반으로 합니다.회의실 한쪽 끝에는 0~99의 번호가 매겨진 100개의 우편함(메모리)이 있으며, 각각 3자리 명령 또는 데이터(000~999)를 포함할 수 있습니다.또한 다른 쪽 끝에는 INBOX와 OUTBOX라는 라벨이 붙은2개의 우편함이 있어 데이터의 송수신에 사용됩니다.방의 중앙에는 축적기라고 하는 간단한 2개의 함수(더하기 및 빼기) 계산기와 프로그램 카운터라고 하는 재설정 가능한 카운터가 있는 작업 영역이 있습니다.프로그램 카운터에는 리틀 맨이 수행할 다음 명령의 주소가 있습니다.이 프로그램 카운터는 각 명령이 실행된 후 보통 1씩 증가하므로 리틀 맨은 프로그램을 순차적으로 실행할 수 있습니다.분기 명령을 사용하면 반복(루프) 및 조건부 프로그래밍 구조를 프로그램에 통합할 수 있습니다.후자는 특정 조건이 충족될 경우 프로그램 카운터를 비순차 메모리 주소로 설정함으로써 실현됩니다(일반적으로 축적기에 저장된 값은 0 또는 양수).
von Neumann 아키텍처에 의해 지정되어 있듯이, 임의의 메일 박스(고유한 메모리 위치 표시)에는 명령 또는 데이터가 포함될 수 있습니다.따라서 프로그램 카운터가 데이터가 포함된 메모리 주소에 도달하지 않도록 주의해야 합니다. 그렇지 않으면 리틀맨이 이를 지침으로 취급하려고 시도합니다.코드로서 해석되는 메일 박스에 지시사항을 기입해, 자기 수정 코드를 작성하는 것으로, 이 점을 이용할 수 있습니다.LMC를 사용하려면 사용자는 데이터를 우편함에 로드한 다음 메모리 주소 0에 저장된 명령부터 시작하여 실행을 시작하도록 리틀맨에게 신호를 보냅니다.프로그램 카운터를 0으로 재설정하면 다른 상태일 수도 있지만 프로그램이 효과적으로 재시작됩니다.
실행 사이클
프로그램을 실행하기 위해 작은 남자는 다음 단계를 수행합니다.
- 프로그램 카운터에서 프로그램 명령이 포함된 우편함 번호(프로그램 시작 시 0)를 확인합니다.
- 해당 번호로 우편함에서 명령을 가져옵니다.각 명령에는 다음 두 개의 필드가 있습니다.opcode(실행할 조작을 나타냄) 및 주소 필드(실행할 데이터의 위치를 나타냄).
- 프로그램 카운터를 늘립니다(다음 명령의 우편함 번호가 포함되도록).
- 명령을 디코딩합니다.명령이 다른 우편함에 저장된 데이터를 사용하는 경우 주소 필드를 사용하여 "메일함 42에서 데이터 가져오기"와 같이 사용할 데이터의 우편함 번호를 찾습니다.)
- 데이터를 가져옵니다(입력, 어큐뮬레이터 또는 우편함에서 4단계에서 결정된 주소를 사용).
- 지정된 opcode에 따라 명령을 실행합니다.
- 결과를 분기 또는 저장합니다(스텝 4에서 결정된 주소로 출력, 어큐뮬레이터 또는 우편함에).
- 프로그램 카운터로 돌아가 사이클 또는 정지합니다.
명령어
LMC는 바이너리 프로세서의 실제 동작을 반영하지만, 10진수의 단순성은 바이너리/16진수로 작업하는 것이 불편할 수 있는 학생들의 복잡성을 최소화하기 위해 선택되었습니다.
지침들
일부 LMC 시뮬레이터는 3자리 숫자 명령을 사용하여 직접 프로그래밍되며, 일부 LMC 시뮬레이터는 3자 니모닉 코드와 라벨을 사용합니다.어느 경우든 명령어세트는 이해를 용이하게 하기 위해 의도적으로 매우 한정되어 있습니다(일반적으로 약 10개의 명령어).LMC가 니모닉 코드와 라벨을 사용하는 경우 프로그램 조립 시 3자리 숫자 명령으로 변환됩니다.
아래 표에는 일반적인 숫자 명령 집합과 이에 상응하는 니모닉 코드가 나와 있습니다.
숫자 코드 | 니모닉 코드 | 설명 | 묘사 |
---|---|---|---|
1xx | 더하다 | 더하다 | 편지함 xx에 저장된 값을 현재 누적기(계산기)에 있는 값에 추가합니다.
|
2xx | 후보선수 | 빼다 | 우편함 xx에 저장된 값을 현재 누적기(계산기)에 있는 값에서 뺍니다.
|
3xx | 스타 | 가게 | 어큐뮬레이터의 내용을 우편함 xx에 저장합니다(파괴).
|
5xx | LDA | 로드 | 우편함 xx(비파괴)에서 값을 로드하여 누적기(파괴)에 입력합니다. |
6xx | 브라 | BRANCH(무조건적인) | 지정된 주소(값 xx)로 이 프로그램 카운터를 설정합니다.즉, 우편함 xx의 가치가 다음 지시를 실행하다. |
7xx | BRZ | BRANCH 만약 ZERO(조건부) | 만약 어큐물레이터(계산기)값 000가 포함된 경우 이 값 xx기 위해 이 프로그램 카운터를 세웠다.그렇지 않으면 아무것도 하지 않는다.그 부정적인 국기를 고려하는 시기는 정의되지 않습니다.언제는 뺄셈 어큐물레이터 underflows, 이 플래그, 그 후 어큐물레이터 확실하지 않은 것, 잠재적으로 제로일 경우 BRZ의 행동 underflow에 정의되어 있지 않는 원인 예정이다.Suggested 행동 만약 축전지와 부정적인 플래그가 설정되지 않다 0이다 진출할 것이다.
|
8xx | 폭탄 투하점 | BRANCH 만약POSITIVE(조건부) | 누적기(계산기)가 0 또는 양수인 경우 프로그램 카운터를 xx 값으로 설정합니다.그렇지 않으면 아무것도 하지 않는다.LMC 메모리 셀은 0 ~999 사이의 값만 유지할 수 있으므로 이 명령어는 감산 시 언더플로우에 의해 설정된 음의 플래그 및 잠재적으로 ADD 시 오버플로(정의되지 않음)에 의존합니다.
|
901 | INP | 입력 | 받은 편지함으로 이동하여 사용자로부터 값을 가져와 누적기(계산기)에 넣습니다.
|
902 | 나가. | 산출량 | 누적기(계산기)에서 OUTBOX로 값을 복사합니다.
|
000 | HLT/COB | 정지/커피 브레이크 | 작업을 중지하거나 프로그램을 종료합니다. |
DAT | 데이터. | 이것은 다음 사용 가능한 우편함에 값을 로드하는 어셈블러 명령입니다.DAT를 레이블과 함께 사용하여 변수를 선언할 수도 있습니다.예를 들어 DAT 984는 값 984를 DAT 명령 주소의 우편함에 저장합니다. |
예
숫자 명령 코드 사용
이 프로그램(지시 901~지시 000)은 숫자 코드만으로 작성됩니다.프로그램은 두 숫자를 입력으로 받아 차분을 출력합니다.실행은 Mailbox 00에서 시작하여 Mailbox 07에서 종료됩니다.아래에서는 숫자 지침 코드를 사용하여 LMC를 프로그래밍할 경우의 단점을 설명합니다.
우편함 | 숫자 코드 | 작동 | 평. |
---|---|---|---|
00 | 901 | 수신 트레이 --> 어큐뮬레이터 | 첫 번째 숫자를 입력하고 계산기로 들어갑니다(있었던 숫자를 모두 지웁니다). |
01 | 308 | 어큐뮬레이터 --> 메모리 [08] | 계산기의 현재 값을 저장합니다(다음 단계를 준비하기 위해...). |
02 | 901 | 수신 트레이 --> 어큐뮬레이터 | 두 번째 숫자를 입력하고 계산기로 들어갑니다(있었던 숫자를 모두 지웁니다). |
03 | 309 | 어큐뮬레이터 --> 메모리 [09] | 계산기의 현재 값을 저장합니다(다음 단계를 준비하기 위해...). |
04 | 508 | 메모리 [08] --> 어큐뮬레이터 | (이제 두 입력 값이 모두 우편함 08과 09에 저장됩니다...) 첫 번째 값을 계산기에 다시 로드합니다(모든 값을 지웁니다). |
05 | 209 | 축전지 = 축전지 - 메모리[09] | 계산기의 현재 값에서 두 번째 숫자를 뺍니다(첫 번째 숫자로 방금 설정됨). |
06 | 902 | 어큐뮬레이터 --> 아웃박스 | 계산기 결과를 OUTBOX에 출력합니다. |
07 | 000 | (조작 없음) | LMC를 정지 |
니모닉 및 라벨 사용
어셈블리 언어는 숫자 명령 코드 대신 니모닉과 라벨을 사용하는 저수준 프로그래밍 언어입니다.LMC는 제한된 니모닉 세트만 사용하지만 각 명령에서 니모닉을 사용하는 편리성은 아래에 나와 있는 것과 같은 프로그램의 어셈블리 언어에서 알 수 있습니다.프로그래머는 익명의 숫자 코드 세트를 기억할 필요가 없어져, 보다 기억에 남는 니모닉 코드 세트를 사용해 프로그래밍할 수 있게 되었습니다.니모닉이 메모리 주소(분기 명령 또는 데이터 로드/저장)를 포함하는 명령인 경우 라벨은 메모리 주소의 이름을 짓기 위해 사용됩니다.
- 이 예제 프로그램은 York University(캐나다 온타리오주 Toronto[5]) 웹사이트 또는 Mike [6]Coley가 작성한 데스크톱 응용 프로그램에서 컴파일하여 실행할 수 있습니다.이들 시뮬레이터에는 완전한 명령어와 샘플 프로그램, 어셈블리 코드를 기계 코드로 변환하는 어셈블러, 프로그램을 실행하고 감시하는 제어 인터페이스, 각 LMC 명령에 대한 단계별 상세 설명이 포함됩니다.
첫 번째 입력 제2LDA 첫 번째 서브 출력 HLT 첫 번째 DAT 두 번째 DAT
라벨
라벨이 없으면 프로그래머는 우편함(메모리) 주소를 수동으로 계산해야 합니다.숫자 코드 예에서는 최종 HLT 명령 전에 새로운 명령을 삽입하면 해당 HLT 명령이 주소 07에서 주소 08로 이동합니다(주소 라벨링은 주소 위치 00에서 시작됩니다).사용자가 첫 번째 입력으로 600을 입력했다고 가정합니다.명령어 308은 이 값이 주소 위치 08에 저장되어 000(HLT) 명령을 덮어쓰는 것을 의미합니다.600은 "메일함 주소 00에 분기"를 의미하기 때문에 프로그램은 중단되는 대신 끝없는 루프에 갇힙니다.
이 문제를 해결하기 위해 대부분의 어셈블리 언어(LMC 포함)는 니모닉과 라벨을 조합합니다.라벨은 명령 또는 데이터가 저장되어 있는 메모리주소의 이름을 붙이거나 명령에서 해당 주소를 참조하기 위해 사용되는 단어입니다.
프로그램을 조립할 때:
- 명령 니모닉 왼쪽에 있는 라벨은 명령 또는 데이터가 저장되어 있는 메모리 주소로 변환됩니다(예: 루프 스타트 INP).
- 명령 니모닉 오른쪽에 있는 라벨은 위에서 언급한 메모리 주소의 값을 사용합니다(BRA 루프 스타트).
- DAT 문과 결합된 라벨은 변수로 기능하며, 데이터가 저장되는 메모리 주소(예: 1개의 DAT 1 또는 1번 DAT)로 라벨링합니다.
니모닉과 라벨을 사용하는 어셈블리 언어 예에서는 최종 HLT 명령 전에 새로운 명령어가 삽입되면 FIRST라는 이름의 주소 위치가 08이 아닌 메모리 위치 09가 되고 STA FIRST 명령어는 프로그램이 조립되었을 때 308(STA 08)이 아닌 309(STA 09)로 변환됩니다.
따라서 라벨은 다음 용도로 사용됩니다.
- BRANCH 명령의 타깃으로 특정 명령을 식별합니다.
- 메모리 위치를 명명된 변수로 식별하고(DAT를 사용하여) 프로그램에서 사용하기 위해 어셈블리 시간에 선택적으로 데이터를 프로그램에 로드합니다(이 사용은 카운터에 1을 추가하는 방법이 없다고 판단할 때까지 명확하지 않습니다).처음에 1을 입력하도록 사용자에게 요청할 수도 있지만 조립 시 1개의 DAT 1)를 사용하여 로드하는 것이 좋습니다.
예
아래 프로그램은 사용자 입력을 받아 0까지 카운트다운합니다.
INP OUT // Initialize 출력 LOUP BRZ KIT // 이 메모리 주소에 LOUP 라벨을 붙입니다.누적기 값이 0인 경우, QUIT SUB ONE이라는 레이블이 붙은 메모리 주소로 점프 // 누적기 OUT BRA LOAP에서 주소 ONE에 저장된 값을 빼다 // LOUP QUIT HLT라는 레이블이 붙은 메모리 주소로 점프(무조건) // 이 메모리 주소에 값 1을 저장합니다.abel it ONE(변수 선언)
아래 프로그램은 사용자 입력을 받아 제곱한 후 답을 출력한 다음 반복합니다.0을 입력하면 프로그램이 종료됩니다.
(참고: 999보다 큰 값이 되는 입력은 LMC의 3자리 숫자 제한으로 인해 정의되지 않은 동작을 합니다).
START LDA ZERO // 다중 프로그램 실행 STA RESULT STA COUNT INP // 입력 = 0 STA VALUE // 입력을 VALUE LOFF LDA RESULT로 저장 // 결과 추가 값, 사용자 입력된 값을 RE에 로드합니다.SLT STA RESULT // 새 결과 LDA 카운트 저장 // COUNT ADD ONE // COUNT STA COUNT에 추가 // 새 COUNT SUB VALUE 저장 // COUNT BRZ ENDLOUP에서 사용자 제공 입력 값 빼기 // BRZ ENDLOAP에서 0이 추가된 경우 분기점)BRA LOOP // RESUCT ENDLOOFF LDA RESOULT에 VALUE를 계속 추가하려면 BRA START에 BROCULT를 로드하고 초기화 및 다른 입력값 END HLT // HALT - 0이 입력되었습니다!RESUCT DAT // 계산 결과(기본값 0) COUNT DAT // 카운터(기본값 0) ONE DAT 1 // 사용자 제공 입력, 제곱할 값(기본값 0) ZERO DAT // 상수, 값 0(기본값 0)
주의: DAT 문 뒤에 데이터가 없으면 기본값 0이 메모리 주소에 저장됩니다.
위의 예에서 [BRZ ENDLOAP]는 정의되지 않은 동작에 의존합니다.COUNT-VALUE가 음수일 수 있으며, 그 후 AUMTROULATOR 값이 정의되지 않아 BRZ가 분기 또는 분기되지 않을 수 있습니다(ACCUMTROULATOR이 0이거나 감길 수 있습니다).코드가 사양과 호환되도록 하려면 , 다음의 순서에 따릅니다.
...LDA COUNT // COUNT ADD ONE 로드 // COUNT STA COUNT에 ONE 추가 // 새로운 COUNT SUB VALUE 저장 // COUNT BRZ ENDLOAP에서 사용자 제공 입력 값 감산 // 0(VALUE가 RESOUCT에 의해 RESUAL에 추가된 경우), 분기에 BRZ ENDLOAP...
다음 버전에서는 COUNT-VALUE가 아닌 VALUE-COUNT를 평가하여 축전지 언더플로우가 발생하지 않도록 합니다.
...LDA COUNT // COUNT ADD ONE 로드 // COUNT STA COUNT에 ONE 추가 // 새로운 COUNT LDA VALUE // VALUE SUB COUNT 로드 // 사용자가 제공한 입력 VALUE BRZ ENDLOUP에서 COUNT 빼기 // 0(VALUE가 BRZ ENDLOAP에 의해 결과에 추가된 경우) 분기,..
또 다른 예로는 자체 기계 코드를 인쇄하는 쿼인이 있습니다(문자를 출력할 수 없기 때문에 소스 인쇄는 불가능합니다).
LOAD LDA 0 // 위치 0을 어큐뮬레이터에 로드합니다.이 라인은 각 루프에서 수정되어 다음 라인을 누적기 OUT // 누적기 값을 출력합니다.축전지 값은 방금 로드된 SUB ONE // 축전지 값에서 1을 뺍니다.이는 다음 단계에서 BRZ ONE 프로그램의 마지막 라인에 있는지 확인하기 위해 BRZ ONE // 이전 감산 결과 축전지 0이 된 경우(즉, 축전지 안에 값 001이 있음), 다음으로 분기하여 하나의 LDA LOAD // LOAD 위치를 축전지 안으로 로드합니다. 이 준비는 진행 중입니다.이 위치의 Address digits ADD ONE // LOAD 라인의 위치 숫자를 늘립니다.현재 어큐뮬레이터에 있는 값은 마지막으로 로드된 라인 STA LOAD // 새로 로드된 LOAD 라인을 LOAD 위치에 다시 저장 // 루프 ONE DAT 1 // 변수 ONE DAT 1의 선두로 돌아갑니다(명령으로 읽히는 경우).는 HLT/COB로 해석되어 프로그램을 종료합니다.
이 쿼인은 자체 수정 코드를 사용하여 작동합니다.위치 0은 출력하는 코드가 1이 될 때까지 반복마다 1씩 증가하며, 이 행의 코드는 출력됩니다.이 시점에서 위치 0은 ONE 위치로 분기합니다.ONE 위치의 값은 0으로 opcode이므로 HALT/COB 명령으로 해석됩니다.
「 」를 참조해 주세요.
- CARDboard 계산 예시 (다른 교육 모델)
- TIS-100 (비디오 게임)
- LMC의 영향을 많이 받은 컴퓨터 게임인 Human Resource Machine
- WDR 페이퍼 컴퓨터
- Digi-Comp I
레퍼런스
- ^ "Little Man Computer". Illinois State University. May 1, 2000. Archived from the original on February 27, 2009. Retrieved March 8, 2009.
- ^ Yurcik, W.; Osborne, H. (2001). "A crowd of Little Man Computers: Visual computer simulator teaching tools". Proceedings of the 2001 Winter Simulation Conference (Cat. No.01CH37304). Vol. 2. p. 1632. doi:10.1109/WSC.2001.977496. ISBN 0-7803-7307-3. S2CID 18907923.
- ^ Yurcik, W.; Brumbaugh, L. (2001). "A web-based little man computer simulator". Proceedings of the thirty-second SIGCSE technical symposium on Computer Science Education - SIGCSE '01. p. 204. doi:10.1145/364447.364585. ISBN 1581133294. S2CID 14794750.
- ^ Osborne, H.; Yurcik, W. (2002). "The educational range of visual simulations of the Little Man Computer architecture paradigm". 32nd Annual Frontiers in Education. pp. S4G–S19. doi:10.1109/FIE.2002.1158742. ISBN 0-7803-7444-4. S2CID 10324295.
- ^ Chen, Stephen Y.; Cudmore, William C. "The Little Man Computer". York University. Retrieved October 7, 2010.
- ^ Coley, Mike. "The Little Man Computer". Retrieved April 12, 2012.