Kategoriler
Bilgisayar Teknoloji

İşlemci (CPU) Çalışma Prensibi

Makina Dili

Bir işlemcinin yaptığı işleri temelde üçe ayırabiliriz:

– Bir işlemci ALU’sunu veya FPU’sunu kullanarak tamsayılarla ve ondalık sayılarla matematiksel işlemleri yapabilir
– Verileri bir bellek alanından diğerine hareket ettirebilir.
– Verdiği karara göre bir programın farklı bir satırına atlayıp yeni bir komut çalıştırabilir.

Sponsorlu Bağlantılar

Bir programcının rahatlıkla anlayabileceği gibi bu üç temel işlem bir programı çalıştırmak için yeterlidir. işlemciler komutları bizim yazdıklarımızdan çok daha farklı bir şekilde algılarlar. Bir komut bit (binary digit, 0 veya 1 değerini alabilen ikili sistemdeki basamaklar) dizilerinden oluşur fakat bu bit dizilerini akılda tutmak çok zordur. Bu yüzden komutlar bit dizileri yerine kısa kelimelerle ifade edilir ve bu kelimelerden oluşan dile Assembly Dili denir. Bir assembler bu kelimeleri bit dizilerine çevirerek işlemcinin anlayabileceği şekilde hafızaya yerleştirir. Komutlara örnek verelim:

  • LOADA mem – bellek adresini A yazmacına yükle
  • LOADB mem – bellek adresini B yazmacına yükle
  • CONB con – B yazmacına sabit bir değer ata
  • SAVEB mem – B yazmacını bellek adresine kaydet
  • SAVEC mem – C yazmacını bellek adresine kaydet
  • ADD – A ile B’yi toplayıp sonucu C’ye kaydet
  • SUB – A’dan B’yi çıkartıp sonucu C’ye kaydet
  • MUL – A ile B’yi çarpıp sonucu C’ye kaydet
  • DIV – A’yı B’ye bölüp sonucu C’ye kaydet
  • COM – A ile B’yi karşılaşıtırıp sonucu teste kaydet
  • JUMP addr – adrese atla
  • JEQ addr – eşitse adrese atla
  • JNEQ addr – eşit değilse adrese atla
  • JG addr – büyükse adrese atla
  • JGE addr – büyük veya eşitse adrese atla
  • JL addr – küçükse adrese atla
  • JLE addr – küçük veya eşitse adrese atla
  • STOP – işlemi durdur

Şimdi aşağıdaki C kodlarının assembly diline derlendikten sonra neye benzediklerine bakalım.

a=1;
f=1;
while (a <= 5)
{
f = f * a;
a = a + 1;
}

C bilmeyenler için kısaca anlatmakta fayda var: a değişkeni 5 olana kadar her seferinde bir arttırılarak f değişkeninin değeriyle çarpılıyor ve f değişkeninin değeri 5 faktöryel oluyor. Küme parantezleri içindeki while döngüsü bittikten sonra parantez içindeki koşul tekrar kontrol ediliyor ve doğru olduğu sürece döngü tekrar tekrar işleme konuyor.

Bir C derleyicisi bu kodları assembly diline çevirir. RAM’in 128, assembly programını barındıran ROM’un da 0 numaralı hafıza adresinden başladığını varsayarsak işemcimiz için yukarıdaki C kodları aşağıdaki şekilde görünür:

// adres 128’deki a’yı al
// adres 129’daki f’i al
0 CONB 1 // a=1;
1 SAVEB 128
2 CONB 1 // f=1;
3 SAVEB 129
4 LOADA 128 // a>5 ise 17’ye atla
5 CONB 5
6 COM
7 JG 17
8 LOADA 129 // f=f*a;
9 LOADB 128
10 MUL
11 SAVEC 129
12 LOADA 128 // a=a+1;
13 CONB 1
14 ADD
15 SAVEC 128
16 JUMP 4 // 4. satırdaki if koşuluna geri dön
17 STOP

Şimdi bu komutların hafızada nasıl göründüğüne bakalım. Bütün komutlar ikili sistemdeki sayılarla gösterilmeli. Bunun için her komuta opcodedenen bir numara verilir:

Programımız ROM’da şöyle gözükür:

// adres 128’deki a’yı al
// adres 129’daki f’i al
Addr opcode/value
0 3 // CONB 1
1 1
2 4 // SAVEB 128
3 128
4 3 // CONB 1
5 1
6 4 // SAVEB 129
7 129
8 1 // LOADA 128
9 128
10 3 // CONB 5
11 5
12 10 // COM
13 14 // JG 17
14 31
15 1 // LOADA 129
16 129
17 2 // LOADB 128
18 128
19 8 // MUL
20 5 // SAVEC 129
21 129
22 1 // LOADA 128
23 128
24 3 // CONB 1
25 1
26 6 // ADD
27 5 // SAVEC 128
28 128
29 11 // JUMP 4
30 8
31 18 // STOP

Gördüğünüz gibi C’de 7 satır tutan kod assemblyde 17 satıra çıktı ve ROM’da 31 byte kapladı. Instruction Decoder (komut çözücü, bir önceki başlıkta bahsettiğimiz Decode ünitesi), opcedeları alarak işlemcinin içindeki değişik bileşenleri harekte geçirecek elektriksel sinyallere dönüştürür.

Sponsorlu Bağlantılar

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

RenkliNOT