Ufak Adam Kompüteri

Little Man Computer, 1965 yılında Dr. Stuart Madnick tarafından tasarlanmış, von Neumann mimarisine dayanan farazi bir bilgisayar modelidir. Günümüz bilgisayarlarının bütün özelliklerine sahip bu model, öğrencilere bilgisayarların çalışma mantığını kavratmak amacıyla okullarda öğretilmektedir. Kendine ait komut seti ve bir dili vardır.

Bu modele göre bilgisayar ufak bir oda, ve bu odanın içerisine kapatılmış ufak bir adamdan oluşur. Odanın bir köşesinde 0'dan 99'a kadar numaralandırılıp istif edilmiş posta kutuları (hafıza) bulunur. Bu posta kutularının her birinin içerisinde zarflar vardır ve bu zarfların üstünde 3 adet rakamdan oluşan instruction lar yazılı bulunur.
Odanın diğer ucunda ise dışarıya açılan iki adet sepet vardır. Bu sepetlerin bitanesi input, diğeri ise output görevi görür.
Odanın ortasında sadece toplama ve çıkarma işlemlerini yapabilen bir hesap makinesi ve yanında resetlenebilen bir program sayacı bulunur.


Bu odanın içerisindeki elemanları biraz inceliyelim.

  • Program sayacı: Çalıştırılacak bir sonraki talimatın kaç numaralı posta kutusunda olduğunu gösterir. Günümüz bilgisayarındaki karşılığı Instruction Pointer dır.
  • Posta kutuları: Her birinin kendine ait bir numarası (adresi) vardır ve içlerinde veri barındırırlar. Bu veri yerine göre talimatta olabilir, normal veri de olabilir. Bilgisayardaki karşılığı RAM dir.
  • Sepetler: Girdi ve çıktı verilerini taşırlar.
  • Hesap makinesi: Girdi verilerini geçici olarak tutarlar. Ayrıca aritmetik işlemlerde kullanılırlar. Bilgisayardaki karşılığı Accumulator Register dır.
Bilgisayarımızın yapısını incelediğimize göre şimdi bu bilgisayarda bir programın nasıl çalıştığına adım adım bakalım.
  1. Adamımız Hayrettin öncelikle çalıştıracağı talimatı (instruction) barındıran posta kutusunun numarasını öğrenmek için program sayacına bakar.
  2. Sayaçta gördüğü numaradaki posta kutusundan zarfı alır ve üstündeki rakamları okur.
  3. Sayacın değeri 1 arttırır.
  4. Okuduğu rakamlardan hangi talimatı gerçekleştireceğini anlar.
  5. Talimatı gerçekleştirir.
  6. Adım 1'e geri döner.
Algoritması gayet basit. Günümüz bilgisayarları da, biraz daha teferruatlı olmasına rağmen temelde aynı mantık ile çalışır. Gelin şimdi de komut setini bir inceleyelim.
LMC'de komutlar 3 adet rakamdan oluşuyor demiştik. Bu üç rakamdan ilki yapılacak işlemi, diğer ikisi ise işlemin etkileyeceği posta kutusu numarasını temsil eder. Üç istisna dışında bütün komutlar bu yapıdadır.

Burada kullanılan her talimatın bir adı vardır ve sayılar yerine bu adları kullanabiliriz. Günümüzdeki Assembly dilide esasında talimatları sayısal komutlar yerine onların adları ile çağırma temeline dayanır.
Şimdi komutlara bakalım:

  • 1xx (ADD): xx. posta kutusunun içinde bulunan sayıyı, hesap makinesinde yazan sayıyla topla ve sonucu hesap makinesinde tut.
  • 2xx (SUB): xx. posta kutusunun içinde bulunan sayıyı, hesap makinesinde yazan sayıdan çıkart ve sonucu hesap makinesinde tut.
  • 3xx (STO): Hesap makinesinde yazan sayıyı xx. posta kutusunun içine yaz. (Bu işlem sonucunda posta kutusunda önceden bulunan sayı kaybolur)
  • 5xx (LDA): xx. posta kutusunun içindeki sayıyı hesap makinesine yaz. (Bu işlem sonucunda hesap makinesinde önceden bulunan sayı kaybolur)
  • 6xx (BRA): Diğer komutlardan farklı olarak bu komut belli bir hafıza alanını değilde, direkt olarak program sayacını etkiler. xx olarak belirtilen değeri program sayacının içine yazar. Yani dolaylı yoldan xx. komuta atlamış olur.
  • 7xx (BRZ): Eğer hesap makinesindeki değer 0 (sıfır) ise program sayacının içine xx ile belirtilen değeri yazar. Yani dolaylı yoldan xx. komuta atlamış olur.
  • 8xx (BRP): Eğer hesap makinesindeki değer 0'dan büyükse program sayacının içine xx ile belirtilen değeri yazar.
  • 901 (INP): Ilk istisnamız olan bu komut, input sepetinden girdi alıp bu değeri hesap makinesinin içine yazar.
  • 902 (OUT): Ikinci istisnamız olan bu komut ise hesap makinesindeki değeri output sepetine koyar, yani çıktı verir.
  • 444 (COB): Son istisnamız olan bu komut ise programın bittiğini ima eder.
Bu dili kullanarak yazılan programları çalıştırabilmek için Python ile LMC Debugger adlı bir araç hazırladım. Bu araçla yazdığınız programları sayısal komutlara dönüştürebilir (Assemble), sayı halindeki komutları okunabilir hale getirebilir (Disassemble) veya çalıştırabilirsiniz. LMC Debugger Github hesabımda bulabilirsiniz.

Yorumlar

Bu blogdaki popüler yayınlar

DKHOS - Rev300 Çözümü

Part 1: Tersinden Tersine Mühendisliğe Giriş

Bir Güvenlikçi, Virüs ile Karşılaşırsa