Assembly diline neden ihtiyacımız var?
Aslında, şu ana kadar ihtiyaç duyacağımız tek bir dil var; buna “makine dili” veya “makine kodu” denir. Bu gibi görünüyor:
0010000100100011
Bilgisayarınızın doğrudan konuşabileceği tek dil budur. Bir CPU'nun konuştuğu dildir (ve teknik olarak, farklı CPU tipleri farklı sürümleri konuşur). Aynı zamanda bakmak ve anlamaya çalışmak için berbat.
Neyse ki, her bir ikili bölüm belirli bir anlama gelir. Birkaç bölüme ayrılmıştır:
0010|0001|0010|0011
operation type source register other source destination register
0010 0001 0010 0011
Bu değerler şunlara karşılık gelir:
operation type 0010 = addition
source register 0001 = register 1
other source 0010 = register 2
destination register 0011 = register 3
Böylece bu işlem, 1 ve 2 numaralı kayıtlardaki sayıları ekler ve bu değeri 3 numaralı yazara koyar. Bu değerleri tam anlamıyla bir CPU'ya koyarsanız ve "git" diyerseniz, sizin için iki sayı ekleyecektir. "Çıkarma" işlemi, burada 0010 yerine 0011 ya da başka bir şey olabilir. Hangi değer olursa olsun CPU bir çıkarma işlemi yapar.
Böylece bir program şöyle görünebilir (bir şeyler açıklamak için makine kodunun bu özel versiyonunu yaptığım için onu anlamaya çalışmayın):
instruction 1: 0010000100100011
instruction 2: 0011000110100100
instruction 3: 0101001100010111
instruction 4: 0010001001100000
Bu okumak için emmek mi? Kesinlikle. Fakat CPU için buna ihtiyacımız var . Her makine kodu belirli bir eyleme karşılık geliyorsa, basit bir "İngilizce" kestirme yapmanıza izin verir ve programın ne yaptığını anladıktan sonra, onu gerçek bir ikili makine koduna dönüştürün ve çalışacak şekilde CPU'ya verin.
Bu yüzden, yukarıdaki orijinal talimatımız şuna benzeyebilir:
(meaning) operation type source register other source destination register
(machine code) 0010 0001 0010 0011
("English") add r1 r2 r3
Bu İngilizce sürümün makine koduyla tam olarak eşleştiğini unutmayın . Bu yüzden bu "İngilizce" nin bir satırını yazarken, gerçekten sadece dostça ve daha anlaşılır bir makine kodu yazıyoruz.
Evet, bu meclis dili. Bu yüzden var ve ilk başta yaratıldı.
Neden şimdi ihtiyaç duyduğumuzu anlamak için yukarıdaki cevapları okuyun, ancak bunu anlamanın anahtarı şudur: Üst düzey dillerin tek bir temsili yoktur, makine kodudur. Örneğin, C veya Python veya her neyse:
z = x + y
Bu, tıpkı yukarıdan eklememiz gibi, x
kayıt 1'de, y
kayıt 2'de olduğunu ve z
kayıt 3'te sona ermesi gerektiğini varsayıyor . Peki ya bu satır?
z = x * 2 + (y / 6) * p + q - r
Bu satırı 16 bitlik ikilik olarak temsil etmeyi ve bir CPU'ya "git" demeyi deneyin . Yapamazsın Makine kodunun toplama, çıkarma ve aynı anda 4 veya 5 değişkenli başka bir işlemi gerçekleştirmek için tek bir işlem talimatı yoktur. Bu nedenle ilk önce bir makine kodu sırasına dönüştürülmelidir . Üst düzey bir dili “derlediğinizde” veya “yorumladığınızda” yaptığınız şey budur.
Bunu yapmak için programlarımız var, peki neden şimdi kuruluma ihtiyacımız var? Programınızın beklediğinizden daha yavaş çalıştığını ve nedenini bilmek istediğinizi varsayalım. Makine hattının bu satırdaki "çıktısı" na bakıldığında şöyle görünebilir:
1010010010001001
0010001000010000
0110010000100100
0010001011000010
0010100001000001
0100010100000001
0010010101000100
0010101010100000
0000100111000010
Sadece bir satır Python yaptırmak için. Demek gerçekten hata ayıklamak istiyorsun? NO . Aksine, derleyicinizden size gerçekten kolayca anlayabileceğiniz formdaki çıktısını vermesini istersiniz; bu, bu makine koduna tam olarak uygun olan assembly dili sürümüdür . O zaman derleyicinizin aptalca bir şey yapıp yapmadığını anlayabilir ve düzeltmeye çalışabilirsiniz.
(@ Raphael'in tavsiyesine dair ek not: Aslında üçlü kodlar (üçlü temel) veya ondalık kodlar, hatta ASCII gibi ikili kodlar dışındaki şeylerle çalışan CPU'ları oluşturabilirsiniz.