# Little Man Computer

El Little Man Computer (LMC) és un model educatiu d'ordinador, creat pel Dr. Stuart Madnick en 1965. L'LMC s'utilitza generalment per a l'ensenyament, ja que modela un ordinador senzill amb arquitectura de von Neumann, que té totes les característiques bàsiques d'un ordinador modern. Pot ser programat en codi màquina (però en sistema decimal en lloc de binari) o en codi assemblador.

## Arquitectura del sistema

El model LMC es basa en el concepte d'un petit home tancat en una habitació petita o un ordinador en aquest escenari. En un extrem de l'habitació, hi ha 100 bústies (memòries), numerades del 0 al 99 i cada una pot contenir una instrucció o dada de 3 dígits (del 000 al 999). A més, hi ha dues bústies en l'altre extrem etiquetades entrada i sortida que s'utilitzen per a la recepció i la sortida de dades.
Al centre de l'habitació, hi ha una àrea de treball que conté una senzilla calculadora amb dues funcions (suma i resta) coneguda com a acumulador i un comptador reprogramable conegut com el comptador de programa. El comptador de programa conté l'adreça de la següent instrucció que l'homenet durà a terme. Aquest comptador de programa normalment s'incrementa en 1 després d'executar cada instrucció, permetent que l'home petit treballe de forma seqüencial al llarg del programa.
El programa incorpora instruccions de bifurcació que permeten realitzar iteracions (bucles) i estructures de programació condicionals, fixant el comptador de programa a una adreça de memòria no seqüencial si es compleix una condició determinada (normalment el valor en l'acumulador és zero o positiu). Tal com s'especifica en l'arquitectura von Neumann, la memòria conté tant les instruccions com les dades. Per tant, és necessari tindre cura d'aturar el comptador de programa quan s'arriba a una adreça de memòria que conté dades, o l'homenet intentarà tractar-lo com una instrucció. Per a utilitzar l'LMC l'usuari carrega les dades en les bústies i després l'indica al petit homenet que comence l'execució, a partir de la instrucció emmagatzemada a l'adreça de memòria zero. Restablir el comptador de programa a zero reinicia eficaçment el programa.

## Cicle d'execució

Per a executar un programa, el petit home realitza els següents passos:
* Comprova el comptador de programa, aquest té un número de bústia que conté una instrucció de programa (per exemple, zero)
* Busca la instrucció que hi ha a la bústia amb aquest número.
* Incrementa el comptador de programa (de manera que contingui el número de bústia de la següent instrucció).
* Descodifica la instrucció (això pot incloure trobar el número de bústia on són les dades amb què treballarà) (per exemple, diu que cal obtenir les dades de la bústia 42).
* Recupera les dades de la bústia amb el número trobat en el pas anterior (per exemple, emmagatzema les dades de la bústia 42 en l'acumulador).
* Executa la instrucció.
* Emmagatzema les noves dades a la bústia des d'on es recuperaren les dades antigues.
* Repeteix el cicle o s'atura.

## Ordres

Encara que l'LMC sí que reflecteix el funcionament real dels processadors binaris, es va triar la simplicitat dels nombres decimals per a minimitzar la complexitat als estudiants, ja que els pot resultar incòmode treballar en un sistema binari o hexadecimal.

### Instruccions

Alguns simuladors LMC es programen utilitzant directament instruccions numèriques de 3 dígits i d'altres amb codis mnemònics de 3 lletres i etiquetes. En qualsevol cas, el conjunt d'instruccions és deliberadament molt limitat (normalment unes deu instruccions) per a simplificar la comprensió. Si l'LMC utilitza codis mnemotècnics i etiquetes, després, aquests, es converteixen en instruccions numèriques de 3 dígits quan s'assembla el programa. El primer dígit d'una instrucció numèrica representa l'ordre a executar i els dos últims dígits representen l'adreça de memòria de la bústia corresponent a aquesta ordre.
La taula de sota mostra un conjunt típic d'instruccions numèriques i els codis mnemotècnics equivalents.
Instruccions :
| Codi numèric | Codi mnemotècnic | Instrucció | Descripció |
| 1xx | ADD | ADD | Suma el valor emmagatzemat en la bústia xx a qualsevol valor que es trobi actualment a l'acumulador (calculadora) Nota: el contingut de la bústia no canvia, i les accions a l'acumulador (calculadora) no estan definides per a instruccions de suma amb resultats de més de 3 dígits. |
| 2xx | SUB | SUBTRACT | Resta el valor emmagatzemat a la bústia xx de qualsevol valor que es trobi actualment a l'acumulador (calculadora). Nota: el contingut de la bústia no canvia, i les accions a l'acumulador no estan definides per a instruccions de resta amb resultats negatius (però, s'establirà un registre d'estat negatiu de manera que 8xx (BRP) es pugui utilitzar correctament). |
| 3xx | STA | STORE | Emmagatzema el contingut de l'acumulador a la bústia xx (destructiu). Nota: el contingut de l'acumulador (calculadora) no es modifica (no destructiu), però el contingut de la bústia es substitueix independentment del que hi hagués abans (destructiu). |
| 5xx | LDA | LOAD | Carrega el valor de la bústia xx (no destructiu) i l'introdueix a l'acumulador (destructiu). |
| 6xx | BRA | BRANCH (incondicional) | Estableix l'adreça indicada (valor xx) al comptador de programa. És a dir, el valor xx serà la següent instrucció executada. |
| 7xx | BRZ | BRANCH IF ZERO (condicional) | Si l'acumulador (calculadora) conté el valor 000, estableix el valor xx al comptador de programa. En cas contrari no fa res. Nota: atès que el programa s'emmagatzema a la memòria, totes les dades i les instruccions del programa tenen el mateix format d'adreça/ubicació. |
| 8xx | BRP | BRANCH IF POSITIVE (condicional) | Si l'acumulador (calculadora) és 0 o positiu, estableix el valor xx al comptador de programa. En cas contrari no fa res. Nota: atès que el programa s'emmagatzema a la memòria, totes les dades i les instruccions del programa tenen el mateix format d'adreça/ubicació. |
| 901 | INP | INPUT | Va a l'ENTRADA, obté el valor que ha introduït l'usuari i el posa a l'acumulador (calculadora). Nota: això sobreescriu qualsevol valor que es trobi en l'acumulador (destructiu) |
| 902 | OUT | OUTPUT | Copia el valor de l'acumulador (calculadora) en la SORTIDA. Nota: el contingut de l'acumulador no canvia (no destructiu). |
| 000 | HLT/COB | HALT/COFFEE BREAK | Deixa de treballar. |
| | DAT | DATA | Aquesta és una instrucció d'assemblador que no més fa que carregar el valor en la següent bústia disponible. DAT també es pot utilitzar en conjunció amb etiquetes per a declarar variables. Per exemple, DAT 984 emmagatzemarà el valor 984 en una bústia, a l'adreça de la instrucció DAT. |

### Exemples
#### Utilització de codis d'instruccions numèriques

Aquest programa s'ha escrit utilitzant codis numèrics (instruccions 901 a la 000). El programa demana dos números com a ENTRADA i n'obté la resta com a SORTIDA. Observeu que l'execució comença a la bústia 00 i acaba a la bústia 07. Els desavantatges de la programació amb LMC utilitzant codis d'instrucció numèrics es descriuran després.
| Bústia | Codi numèric | Operació | Comentaris |
| 00 | 901 | ENTRADA → ACUMULADOR | Introdueix (INPUT) el primer número, a la calculadora (esborrant tot el que hi era) |
| 01 | 308 | ACUMULADOR → MEMÒRIA[08] | Emmagatzema (STORE) el valor actual de la calculadora (es prepara per al següent pas...) |
| 02 | 901 | ENTRADA → ACUMULADOR | Introdueix (INPUT) el segon número, a la calculadora (esborrant tot el que hi era) |
| 03 | 309 | ACUMULADOR → MEMÒRIA[09] | Emmagatzema (STORE) el valor actual de la calculadora (de nou, es prepara per al següent pas...) |
| 04 | 508 | MEMÒRIA[08] → ACUMULADOR | (Ara que els dos valors d'entrada estan emmagatzemats a les bústies 08 i 09 ...) Carrega (LOAD) el primer valor, de nou, a la calculadora (esborrant tot el que hi era) |
| 05 | 209 | ACUMULADOR = ACUMULADOR - MEMÒRIA[09] | Resta (SUBTRACT) el segon número al valor actual de la calculadora (que acaba d'establir-se com el primer número) |
| 06 | 902 | ACUMULADOR → SORTIDA | Trau (OUTPUT) el resultat de la calculadora a la SORTIDA |
| 07 | 000 | (no fa cap operació) | Atura (HALT) l'LMC |

#### Utilització de codis mnemònics i etiquetes

El llenguatge assemblador és un llenguatge de programació de baix nivell que utilitza la mnemotècnia i etiquetes en lloc de codis d'instruccions numèriques. Tot i que l'LMC només utilitza un conjunt limitat de mnemotècnics, la conveniència d'utilitzar una regla mnemotècnica per a cada instrucció del llenguatge assemblador es fa evident en el mateix programa que es mostra a continuació (el programador ja no ha de recordar-se d'una sèrie de codis numèrics anònims i pot programar amb un conjunt de codis mnemotècnics més fàcils de memoritzar). Si la sentència és una instrucció que implica una adreça de memòria (ja sigui una instrucció de salt o dades que s'han de càrregar o guardar enlloc), llavors s'utilitza una etiqueta per a nomenar aquesta adreça.
    Aquest programa d'exemple pot ser compilat i executat en el simulador de LMC disponible al lloc web de la Universitat de York (Toronto, Canadà) o en l'aplicació d'escriptori escrita per Mike Coley. Tots aquests simuladors inclouen instruccions completes i programes d'exemple, un assemblador per a convertir el codi assemblador a codi màquina, interfícies de control per a executar i supervisar els programes i una descripció pas a pas detallada de cada instrucció LMC.

## Etiquetes

Sense etiquetes el programador necessita calcular manualment les bústies (adreces de memòria) on emmagatzemar les dades.
En l'exemple amb codis numèrics, si s'afegeix una nova instrucció abans de la instrucció HLT final, aleshores es mou la instrucció HLT des de la bústia 07 a la 08 (l'etiquetatge de d'adreces del programa comença en la posició 00). Suposem que l'usuari introdueix 600 com a primera entrada (instrucció 901 de la bústia 00). La instrucció 308 (bústia 01) fa que aquest valor s'emmagatzemi en la bústia 08, i sobreescriu la instrucció 000 (HLT) amb el valor 600. La instrucció 600 significa saltar a l'adreça (bústia) 00 del programa, i en lloc d'aturar-se, el programa quedaria atrapat en un bucle sense fi.
Per a solucionar aquesta dificultat, la majoria dels llenguatges assembladors (incloent l'LMC) combinen els mnemònics amb etiquetes. Una etiqueta no és més que una paraula que s'utilitza per a nomenar qualsevol adreça de memòria on s'emmagatzema una instrucció o dades, o per referir-se a aquesta adreça en una instrucció.
Quan un programa s'assembla:
* Una etiqueta a l'esquerra d'una instrucció mnemònica es converteix en l'adreça de memòria on s'emmagatzema la instrucció o les dades. Per exemple, inicibucle INP
* Una etiqueta a la dreta d'una instrucció mnemònica pren el valor de l'adreça de memòria abans esmentada. Per exemple, BRA inicibucle
* Una etiqueta combinada amb una declaració DAT funciona com una variable, fa que les dades s'emmagatzemen en l'adreça de memòria de l'etiqueta. Per exemple, one DAT 1 o numero1 DAT
En l'exemple de llenguatge assemblador que utilitza mnemotècnia i etiquetes, si una nova instrucció s'insereix abans de la instrucció HLT final, llavors la ubicació de l'adreça marcada amb l'etiqueta FIRST estaria ara en la posició de memòria 09 en lloc de 08, i la primera instrucció STA es convertiria al 309 (STA 09) en lloc de 308 (STA 08) quan s'assemble el programa.
Per tant, les etiquetes s'utilitzen per a:
* Identificar una instrucció particular com la destinació d'una instrucció de salt (BRANCH).
* Identificar una ubicació de memòria com una variable amb un nom (utilitzant DAT) i, opcionalment, carregar determinades dades quan s'assembla el programa per al seu ús posterior quan s'executa. Aquest ús no es fa evident fins que un no s'adona que no hi ha cap altra forma, per exemple, de sumar 1 a un comptador: Es podria demanar a l'usuari que introdueixi 1 al començament de l'execució(INPUT), però és millor carregar-lo al programa quan aquest s'assembla utilitzant one DAT 1)

### Exemple

Aquest programa demana una entrada a l'usuari, i fa un compte enrere fins a zero.
Aquest programa demana una entrada d'usuari, calcula el seu quadrat, mostra la resposta i torna a repetir. La introducció d'un zero finalitza el programa. (Nota: una entrada que doni un resultat superior a 999 produirà un error, degut al límit de 3 dígits de l'LMC)
Nota: Si no hi ha dades després d'una declaració DAT, llavors s'emmagatzema a l'adreça de memòria el valor predeterminat 0.

## Referències

* ↑ «Little Man Computer». Universitat Estatal d'Illinois, 01-05-2000. Arxivat de l'original el 2009-02-27. [Consulta: 12 juny 2014].
* ↑ Yurcik, W.; Osborne, H. (2001). "A crowd of Little Man Computers: Visual computer simulator teaching tools". Proceeding of the 2001 Winter Simulation Conference (Cat. No.01CH37304) 2. p. 1632. doi:10.1109/WSC.2001.977496. ISBN 0-7803-7307-3
* ↑ 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
* ↑ 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
* ↑ Chen, Stephen Y.; Cudmore, William C. «The Little Man Computer». York University. [Consulta: 7 octubre 2010].
* ↑ Coley, Mike. «The Little Man Computer». Arxivat de l'original el 2016-12-09. [Consulta: 12 abril 2012].

## Enllaços externs

* Richard J. Povinelli:Teaching:Introduction to Computer Hardware and Software:Little Man Computer (anglès)
* The "Little Man" Computer Arxivat 2015-05-14 a Wayback Machine. (anglès)

### Simuladors

* Java Applet
* Windows Executable
* Emacs package