CPUnun tek işlevi kodun assembly çıktısını okumaktır. Assembly çıktısı ise önceki anlatımlarda bahsettiğiniz text segment, data/bss segment vb. şeylerden oluşur.
Derlenebilir dillerde yazılan her kodun bir assembly çıktısı vardır, derlenemeyen dillerde ise yorumlayıcının bir assembly çıktısı ve yazdığınız kodun yorumlayıcı tarafından yorumlanmış hâlinin bir assembly çıktısı vardır.
Assembly bilgisayara emirler verebileceğiniz en temel dildir ve bu çıktıdaki text segmenti çeşitli cpu instruction'lardan oluşur. İşlemcideki o an bulunan her veriyi cpu register'lar temsil eder, değişken gibi düşünebilirsiniz. Tam açıklaması bu değil ama yapabildiğim en iyi açıklama bu. Bu instruction'lara örnek olarak;
mov = bir register'daki değeri başka bir register'a taşır (move)
cmp = bir register'daki veriyle başka registerdeki veriyi karşılaştırır (compare)
je = eğer cmp ile son karşılaştırılan veri birbirine eşitse belirtilen text segmenti altındaki kısma zıpla (jump if equals)
jne = je'yi yap ancak eşit değilse yap (jump if not equals)
add = bir register'daki şeyi başka bir register'a ekle
ret = kodlardaki return'ü temsil eder
Bu ve bunun gibi birçok instruction'lar vardır ve bunlar işlemci mimarisinden işlemci mimarisine göre artabilir/azalabilir/değişebilir.
Örneğin siz kodunuzda bir if ((a + b) == c) return; yazdığınızda bu assembly çıktısı olarak bir add'ye, bir cmp'ye, bir je'ye ve bir ret'e dönüşür. Buradaki a, b ve c değerleri ise anlık olarak cpu register'a alınır ve bunlar üzerinde gösterilir.
CPU register'lar eax, rax, ebx, ax gibi şeylerle gösterilir, bunların hepsinin bir anlamı vardır ve verinin büyüklüğüne göre değişkenlik gösterir. (16-32-64 bit)
Kısaca siz bir kod yazdığınız zaman bu kodunuzun assembly çıktısının gerçekleştireceği işlem (ve kısmen uzunluğu) ne kadar uzun olursa kodunuz o kadar ağır olur.
Çeşitli işlemci mimarileri ve bit türleri ise bu sistemde istenilen işlemi daha rahat yapabilmek için ortaya çıkmıştır.
Derlenebilir dillerde yazılan her kodun bir assembly çıktısı vardır, derlenemeyen dillerde ise yorumlayıcının bir assembly çıktısı ve yazdığınız kodun yorumlayıcı tarafından yorumlanmış hâlinin bir assembly çıktısı vardır.
Assembly bilgisayara emirler verebileceğiniz en temel dildir ve bu çıktıdaki text segmenti çeşitli cpu instruction'lardan oluşur. İşlemcideki o an bulunan her veriyi cpu register'lar temsil eder, değişken gibi düşünebilirsiniz. Tam açıklaması bu değil ama yapabildiğim en iyi açıklama bu. Bu instruction'lara örnek olarak;
mov = bir register'daki değeri başka bir register'a taşır (move)
cmp = bir register'daki veriyle başka registerdeki veriyi karşılaştırır (compare)
je = eğer cmp ile son karşılaştırılan veri birbirine eşitse belirtilen text segmenti altındaki kısma zıpla (jump if equals)
jne = je'yi yap ancak eşit değilse yap (jump if not equals)
add = bir register'daki şeyi başka bir register'a ekle
ret = kodlardaki return'ü temsil eder
Bu ve bunun gibi birçok instruction'lar vardır ve bunlar işlemci mimarisinden işlemci mimarisine göre artabilir/azalabilir/değişebilir.
Örneğin siz kodunuzda bir if ((a + b) == c) return; yazdığınızda bu assembly çıktısı olarak bir add'ye, bir cmp'ye, bir je'ye ve bir ret'e dönüşür. Buradaki a, b ve c değerleri ise anlık olarak cpu register'a alınır ve bunlar üzerinde gösterilir.
CPU register'lar eax, rax, ebx, ax gibi şeylerle gösterilir, bunların hepsinin bir anlamı vardır ve verinin büyüklüğüne göre değişkenlik gösterir. (16-32-64 bit)
Kısaca siz bir kod yazdığınız zaman bu kodunuzun assembly çıktısının gerçekleştireceği işlem (ve kısmen uzunluğu) ne kadar uzun olursa kodunuz o kadar ağır olur.
Çeşitli işlemci mimarileri ve bit türleri ise bu sistemde istenilen işlemi daha rahat yapabilmek için ortaya çıkmıştır.