Küçük Adam Bilgisayar ( LMC ) bir olduğunu eğitsel bilgisayar Dr tarafından oluşturulan, Stuart Madnick 1965 LMC tipik bunun nedeni modelleri ile basit bilgisayar öğretimi öğrencileri için kullanılan von Neumann mimarisi -. Bunların hepsi var temel işlevleri modern bir bilgisayar. Makine kodunda (ikili formdan ziyade ondalık formda olmasına rağmen) veya assembler'da programlanabilir.
LMC modeli, küçük bir odada veya bir bilgisayarda kilitli küçük bir adam konseptine dayanmaktadır. Odanın sonunda , her biri 3 basamaklı bir talimat veya veri öğesi (dolayısıyla 000 ila 999 arasında değişen) içerebilen, 0 ila 99 numaralı 100 posta kutusu ( hafıza ) vardır. Ek olarak, veri almak ve göndermek için kullanılan diğer uçta GELEN KUTUSU (gelen kutusu) ve ÇIKIŞ KUTUSU (giden kutusu) olarak işaretlenmiş iki posta kutusu vardır. Odanın ortasında, Akümülatör adı verilen basit iki işlevli (toplama ve çıkarma) bir hesap makinesi ve Program Sayacı adı verilen sıfırlanabilir bir sayaç içeren bir çalışma alanı vardır . Program Sayacı, Küçük Adam'ın gerçekleştireceği bir sonraki talimatın adresini içerir. Program Sayacı, normalde yürütülen her komuttan sonra 1 artırılır ve Little Man'in programı sıralı olarak yürütmesine izin verir. Bölüm ifadeleri, yinelemelerin (döngüler) ve koşullu yapıların bir programa dahil edilmesine izin verir. İkincisi, belirli bir koşul karşılanırsa (genellikle toplayıcıda depolanan değer pozitif veya sıfır ise) Program Sayacına sıralı olmayan bir bellek adresi atayarak. Belirtildiği gibi , von Neumann mimarisi , yönerge ve verileri hem de içerir. Bu nedenle, Program Sayacının veri içeren bir hafıza adresine ulaşmasını önlemek için dikkatli olmak gerekir, aksi takdirde Küçük Adam bunu bir talimat olarak ele almaya çalışacaktır. LMC'yi kullanmak için, kullanıcı verileri posta kutularına yükler ve Hafıza adresi sıfırda depolanan talimattan başlayarak Küçük Adam'a yürütmeye başlaması için sinyal gönderir. Program Sayacının sıfırlanması programı yeniden başlatır.
Küçük Adam bir programı çalıştırmak için şu adımları gerçekleştirir:
LMC, ikili işlemcilerin gerçekte nasıl çalıştığını yansıtsa da, ikili veya onaltılık olarak çalışmaya alışkın olmayan öğrenciler için karmaşıklığı en aza indirmek için ondalık sayıların basitliği seçilmiştir .
Bazı CML simülatörleri doğrudan 3 basamaklı sayısal talimatlar kullanılarak programlanır ve diğerleri 3 harfli anımsatıcı kodlar ve etiketler kullanır. Her iki durumda da, anlaşılmasını kolaylaştırmak için talimat seti kasıtlı olarak çok sınırlıdır ( genellikle yaklaşık on talimat ). LMC anımsatıcı kodlar ve etiketler kullanıyorsa, program birleştirildiğinde bunlar 3 basamaklı dijital talimatlara dönüştürülür. Sayısal bir talimatın ilk basamağı, gerçekleştirilecek komutu temsil eder ve son iki basamak, bu komutla ilgili posta kutusunun hafıza adresini temsil eder.
Aşağıdaki tablo tipik bir talimat setini ve bunlara karşılık gelen anımsatıcı kodları göstermektedir.
Sayısal Kod | Anımsatıcı kod | Talimat | Açıklama |
---|---|---|---|
1xx | EKLE | EKLE | Posta kutusunda xx depolanan değeri, o anda toplayıcıda (hesap makinesi) bulunan değere ekler. Not: Posta kutusunun içeriği değiştirilmez ve toplayıcının (hesaplayıcı) eylemleri, 3 basamaktan daha büyük toplamları içeren toplama talimatları için tanımlanmaz. |
2xx | ALT | ÇIKARMA | Posta kutusunda xx depolanan değeri, o anda toplayıcıda (hesap makinesi) bulunan değerden çıkarır. Not: Posta kutusunun içeriği değiştirilmez ve toplayıcının (hesaplayıcı) eylemleri, negatif sonuçlar veren çıkarma talimatları için tanımlanmaz - ancak, 8xx (BRP) 'nin doğru bir şekilde kullanılabilmesi için negatif bir bayrak atanabilir . |
3xx | STA | MAĞAZA | Akümülatörün içeriğini posta kutusu xx'e kaydedin (yıkıcı talimat) Not: Toplayıcının (hesap makinesi) içeriği değiştirilmez (tahribatsız), ancak burada depolanan değerden bağımsız olarak posta kutusunun içeriği değiştirilir (yıkıcı). |
5xx | LDA | YÜK | Xx posta kutusunun değerini yükler (tahribatsız yükleme) ve bunu toplayıcıya yazar (yıkıcı kayıt). |
6xx | SUTYEN | ŞUBE (koşulsuz) | Program sayacını verilen adrese ayarlar (değer xx). Böylece, xx değeri yürütülen bir sonraki komutun adresi olacaktır. |
7xx | BRZ | SIFIR İSE ŞUBE (şartlı) | Toplayıcı (hesap makinesi) 000 değerini içeriyorsa, program sayacını xx değerine ayarlayın, başka hiçbir şey yapmayın. Not: Program hafızaya kaydedildiğinden, program verileri ve komutların tümü aynı adres / konum formatına sahiptir. |
8xx | BRP | POZİTİF İSE ŞUBE (şartlı) | Toplayıcı (hesap makinesi) pozitif veya sıfır ise, program sayacını xx adresine ayarlayın, başka bir şey yapmayın. Not: Program hafızaya kaydedildiğinden, program verileri ve komutların tümü aynı adres / konum formatına sahiptir. |
901 | INP | GİRİŞ | GELEN KUTUSUNA gidin, kullanıcının değerini alır ve bunu akümülatöre (hesap makinesi) kaydeder. Not: bu, akümülatörde bulunan herhangi bir değerin üzerine yazacaktır (yıkıcı yazma). |
902 | DIŞARI | ÇIKTI | Akümülatörün değerini OUTBOX'a kopyalayın. Not: Akümülatörün içeriği değiştirilmez (tahribatsız kopya). |
000 | HLT / COB | DURMA / KAHVE ARASI | İşlemi durdurun. |
DAT | VERİ | Bu, verilen değeri bir sonraki mevcut posta kutusuna basitçe yükleyen bir assembler komutudur. DAT, değişkenleri bildirmek için etiketlerle birlikte de kullanılabilir. Örneğin, DAT 465, DAT komutunun adresindeki posta kutusunda 465 değerini saklayacaktır. |
Bu program (talimat 901 ile 000 ) yalnızca sayısal kodları kullanılarak yazılır. Program girdi olarak iki sayı alır ve farkı döndürür. Yürütmenin Posta Kutusu 00'da başladığını ve Posta Kutusu 07'de sona erdiğini unutmayın. LMC'yi sayısal komut kodları kullanarak programlamanın dezavantajları aşağıda açıklanmıştır.
Mektup kutusu | Sayısal Kod | Ameliyat | Yorumlar (değiştir | kaynağı değiştir) |
---|---|---|---|
00 | 901 | GELEN KUTUSU → AKÜMÜLATÖR | İlk sayıyı girin (GİRİŞ), hesap makinesine yerleştirin (orada olanı silerek). |
01 | 308 | AKÜMÜLATÖR → BELLEK [08] | Hesap makinesinin mevcut değerini saklayın (SAKLA) (sonraki adıma hazırlanmak için). |
02 | 901 | GELEN KUTUSU → AKÜMÜLATÖR | İkinci sayıyı girin (GİRİŞ), hesap makinesine yerleştirin (orada olanı silerek). |
03 | 309 | AKÜMÜLATÖR → BELLEK [09] | Hesap makinesinin mevcut değerini saklayın (SAKLA) (bir sonraki adıma bir kez daha hazırlamak için). |
04 | 508 | BELLEK [08] → AKÜMÜLATÖR | (Artık girilen değerler 08 ve 09 posta kutularında saklandığına göre)
Bilgisayardaki ilk değeri yeniden yükleyin (YÜKLE) (orada olanı silerek). |
05 | 209 | AKÜMÜLATÖR = AKÜMÜLATÖR - BELLEK [09] | Hesap makinesinin mevcut değerinden ikinci sayıyı çıkarın (ÇIKAR) (girilen ilk sayıya yeni ayarlanmış olan). |
06 | 902 | AKÜMÜLATÖR → OUTBOX | Hesap makinesinin sonucunu Giden Kutusuna (ÇIKIŞ KUTUSU) gönderin (ÇIKTI). |
07 | 000 | (hiçbir işlem yapılmadı) | LMC'yi durdurun (DURDURUN). |
Assemblage dil alt düzey bir programlama dilidir that use sembolleri ve etiketleri yerine dijital talimat kodları. LMC, bu anımsatıcıların yalnızca sınırlı bir setini kullansa da, her bir talimat için bir anımsatıcı kullanmanın rahatlığı, aşağıda gösterilen aynı programın montaj dili tarafından anlaşılır hale getirilmiştir - programlama artık bir dizi anonim dijital kodu ezberlemesine gerek yoktur ve artık hatırlaması daha kolay bir dizi anımsatıcı kodla programlayabilir. Anımsatıcı, bir bellek adresiyle ilgili bir talimatsa ( bir bölüm talimatı veya bir veri yükleme / kaydetme ), bu durumda etiket, bellek adresini adlandırmak için kullanılır.
Bu örnek program, York Üniversitesi web sitesinde ( Toronto , Kanada ) veya Mike Coley tarafından yazılan masaüstü uygulamasında bulunan LMC simülatöründe derlenebilir ve çalıştırılabilir . Tüm bu simülatörler, tüm talimatları ve örnek programları, montaj kodunu makine koduna dönüştürmek için bir birleştiriciyi, programları çalıştırmak ve kontrol etmek için kontrol arayüzlerini ve her komut için adım adım bir uygulamayı içerir.INP STA TERME1 INP STA TERME2 LDA TERME1 SUB TERME2 OUT HLT TERME1 DAT TERME2 DATEtiketler olmadan programcının Posta Kutularının (bellek) adreslerini manuel olarak hesaplaması gerekirdi. Gelen örnek sayısal kod , yeni talimatlar HLT talimatı (adres etiketleme pozisyonunda 00 başlar) 08 adresi, adres 07 taşınmış olacağını daha sonra nihai HLT talimatı önce eklenecek olsaydı. Kullanıcının ilk girişte 600 girdiğini varsayalım. 308 talimatı, bu değerin 08 adresinde saklanacağı ve 000 talimatının (HLT) silineceği anlamına gelir. 600, "posta kutusu adresi 00'a çatal" anlamına geldiğinden, program durmak yerine sonsuz bir döngüde asılı kalır.
Bu zorluğun üstesinden gelmek için, çoğu montaj dili ( LMC dili dahil ) anımsatıcıları etiketlerle birleştirir. Bir etiket, bir talimatın veya verinin saklandığı bir hafıza adresini adlandırmak veya bir talimatta bu adrese atıfta bulunmak için kullanılan bir kelimedir.
Bir program birleştirildiğinde:
Gelen çevirici dili Örneğin , yeni bir talimat nihai HLT talimatı önce takılırsa komutları ve etiketleri kullanır, sonra TERM1 etiketli adresin konumunu artık hafıza konumu 09 yerine 08 olacağını ve STA TERME1 talimat 309 dönüştürülebilir olurdu Program birleştirildiğinde 308 (STA 08) yerine (STA 09).
Bu nedenle etiketler şunlar için kullanılır:
Misal
Bu program kullanıcı girdisini alır ve sıfıra doğru geri sayar.
INP BOUCLE SUB UN // Étiqueter cette adresse mémoire BOUCLE, l'instruction soustraira la valeur stockée à l'adresse UN à l'accumulateur. OUT BRZ QUIT // Si la valeur de l'accumulateur est 0, sauter à l'adresse mémoire étiquetée QUITTER BRA LOOP // Si la valeur de l'accumulateur n'est pas 0, sauter à l'adresse mémoire étiquetée BOUCLE QUITTER HLT // Étiqueter cette adresse mémoire QUITTER UN DAT 1 // Stocker la valeur 1 à cette adresse mémoire et l’étiqueter UN (déclaration de variable).Bu program kullanıcı girdisini alır, karesini alır, cevabı döndürür ve baştan başlar. Sıfır değerinin girilmesi programı sonlandırır. (Not: Daha büyük bir çıktı 999 ile sonuçlanan bir girdi, LMC'nin 3 basamaklı sayı sınırı nedeniyle bir hataya neden olacaktır).
DEBUT LDA ZERO // Initialisation pour permettre d'exécuter le programme plusieurs fois STA RESULTAT STA COMPTEUR INP // Entrée fournie par l'utilisateur BRZ END // Saute au programme END si l'entrée est égale à zéro STA VALEUR // Stocke l'entrée dans VALEUR LOOP LDA RESULTAT // Load the RESULTAT ADD VALEUR // Ajoute VALEUR, l'entrée fournie par l'utilisateur à RESULTAT STA RESULTAT // Stocke le nouveau RESULTAT LDA COMPTEUR // Charge le COMPTEUR ADD UN // Ajoute UN au COMPTEUR STA COMPTEUR // Stocker le nouveau COMPTEUR SUB VALEUR // Soustraire la nouvelle VALEUR entrée par l'utilisateur au COMPTEUR BRZ ENDLOOP // Si zéro (VALEUR a été ajouté au RESULTAT VALEUR fois), aller à FINBOUCLE BRA LOOP // Aller à BOUCLE pour continuer à ajouter VALEUR à RESULTAT FINBOUCLE LDA RESULTAT // Charger RESULTAT OUT // Sortir RESULTAT BRA START // Aller à START afin de réinitialiser et de récupérer une autre entrée VALEUR END HLT // Arrêt (HALT) - un zéro a été entré, le programme est donc terminé. RESULTAT DAT // Résultat calculé (0 par défaut) COMPTEUR DAT // COMPTEUR (0 par défaut) UN DAT 1 // Constante, valeur de 1 VALEUR DAT // Entrée fournie par l'utilisateur, la valeur à être mise au carré (0 par défaut) ZERO DAT // Constante, valeur de 0 (0 par défaut)Not: Bir DAT bildiriminden sonra herhangi bir değer verilmezse, varsayılan değer olan 0, bellek konumunda saklanır.