Little Man Computer

De Viquipèdia
Dreceres ràpides: navegació, cerca

El Little Man Computer (LMC) és un model educatiu d'ordinador, creat pel Dr. Stuart Madnick en 1965.[1] 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.[2][3][4]

Arquitectura del sistema[modifica | modifica el codi]

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 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ó[modifica | modifica el codi]

Vegeu també: Cicle d'instrucció

Per a executar un programa, el petit home realitza els següents passos:

  1. Comprova el comptador de programa, aquest té un número de bústia que conté una instrucció de programa (per exemple, zero)
  2. Busca la instrucció que hi ha a la bústia amb aquest número.
  3. Incrementa el comptador de programa (de manera que contingui el número de bústia de la següent instrucció).
  4. 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).
  5. 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).
  6. Executa la instrucció.
  7. Emmagatzema les noves dades a la bústia des d'on es recuperaren les dades antigues.
  8. Repeteix el cicle o s'atura.

Ordres[modifica | modifica el codi]

Encara que l'LMC sí 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[modifica | modifica el codi]

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[modifica | modifica el codi]

Utilització de codis d'instruccions numèriques[modifica | modifica el codi]

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[modifica | modifica el codi]

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 [5] disponible al lloc web de la Universitat de York (Toronto, Canadà) o en l'aplicació d'escriptori escrita per Mike Coley.[6] 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.
INP
STA FIRST
INP
STA SECOND
LDA FIRST
SUB SECOND
OUT
HLT
FIRST DAT
SECOND DAT

Etiquetes[modifica | modifica el codi]

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 a 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[modifica | modifica el codi]

Aquest programa demana una entrada a l'usuari, i fa un compte enrere fins a zero.

     INP
LOOP SUB ONE  // Etiqueta aquesta instrucció com LOOP i resta el valor d'ONE al valor de l'acumulador
     OUT
     BRZ QUIT // Si el valor de l'acumulador és 0, salta a l'adreça etiquetada QUIT
     BRA LOOP // Si el valor de l'acumulador no és 0, salta a l'adreça etiquetada LOOP
QUIT HLT      // Etiqueta aquesta adreça com QUIT
ONE  DAT 1    // Emmagatzema 1 en aquesta adreça de memòria, i l'etiqueta ONE (declaració de variables)

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)

START   LDA ZERO     // Inicialitza l'execució del programa múltiple
        STA RESULT
        STA COUNT
        INP          // Entrada proporcionada per l'usuari
        BRZ END      // Salt del programa a END si entrada = 0
        STA VALUE    // Emmagatzema l'entrada com a VALUE
LOOP    LDA RESULT   // Carrega el resultat en RESULT
        ADD VALUE    // Suma l'entrada VALUE a RESULT
        STA RESULT   // Emmagatzema el nou resultat en RESULT
        LDA COUNT    // Carrega el compte COUNT
        ADD ONE      // Suma ONE al comtpe COUNT
        STA COUNT    // Emmagatzema COUNT
        SUB VALUE    // Resta l'entrada VALUE a COUNT
        BRZ ENDLOOP  // Si zero (VALUE suma RESULT VALUE vegades) salta a ENDLOOP
        BRA LOOP     // Salta a LOOP per a continuar sumant VALUE a RESULT
ENDLOOP LDA RESULT   // Carrega RESULT
        OUT          // Trau RESULT
        BRA START    // Salta a START per a començar i demanar altre VALUE
END     HLT          // S'atura (S'ha introduït un zero per fer-ho!)
RESULT  DAT          // Resultat computat (per defecte 0)
COUNT   DAT          // Comptador (per defecte 0)
ONE     DAT 1        // Constant amb valor 1
VALUE   DAT          // Entrada proporcionada per l'usuari, el valor que volem al quadrat (per defecte 0)
ZERO    DAT          // Constant amb valor 0 (per defecte 0)

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[modifica | modifica el codi]

  1. «Little Man Computer». Universitat Estatal d'Illinois, 1 de maig de 2000.
  2. 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.
  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.
  4. 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.
  5. Chen, Stephen Y.; Cudmore, William C. «The Little Man Computer». York University. [Consulta: 7 d'octubre de 2010].
  6. Coley, Mike. «The Little Man Computer». [Consulta: 12 d'abril de 2012].

Enllaços externs[modifica | modifica el codi]

Simuladors[modifica | modifica el codi]