===Makine kodu nedir?===
Normalde bilgisayarların tek anlayabildiği sayı sistemi ikilik sayı sistemidir. Bilgisayar bütün işlemleri ikilik sayı sistemi ile yapar. Yani <tt>mov</tt> komutunun veya <tt>A</tt> karakterinin bilgisayar için hiçbir anlamı yoktur. Karakterlerin bilgisayarda nasıl temsil edildiğini daha önce görmüştük. ASCII kodlarla temsil ediliyorlar. Yani A sayısı bilgisayarda (41)<sub>16</sub> yani (01000001)<sub>2</sub> sayısı ile temsil edilir. Yani bir bellek gözeneğinde (01000001)<sub>2</sub> sayısı varsa o bellek gözeneğinde A karakteri saklanıyor demektir. Peki ya komutlar? Komutların bellekte nasıl saklandıklarını anlamak için şöyle bir deney yapalım. Debug'da Assembly moduna geçip şöyle bir program yazalım:
1524:0100 mov ah,9
1524:0102 mov dx,10b
1524:0105 int 21
1524:0107 mov ah,4c
1524:0109 int 21
1524:010b db "deneme$"
Bu program bildiğiniz üzere ekrana <tt>deneme</tt> yazıp kapanır. Bu programı yazıp çalıştığından emin olmak için bir kere çalıştıralım. Sonra debug modundayken <tt>u 100</tt> komutunu verelim. u komutu aktif segmentteki belirtilen ofsetten itibaren bir miktar komutu assembly ve makine kodu olarak ekrana yazar. Rehberlik etmesi açısından şimdiye kadar yaptıklarımızın ekran görüntüsü şu şekilde:
[[Dosya:U.jpg|center]]
Bu resimdeki ilk sütun bellek adresleri, ikinci sütun ilgili bellek adreslerindeki makine kodları, diğer iki sütun da ilgili bellek gözeneklerindeki makine kodlarının Assembly dilindeki karşılıklarıdır. Eğer sadece u komutunu verseydik aktif segmentteki aktif ofsetten itibaren ilgili kodlar yazılacaktı. Aktif ofsetin değişik olma ihtimalini düşünerek ofseti kendimiz belirttik. İstersek <tt>u 100 10b</tt> gibi bir komut vererek bellekteki hangi aralıktaki kodların gösterileceğini de belirleyebilirdik. Bu durumda bizi ilgilendirmeyen kodları görmemiş olurduk. Hatta <tt>u 1200:100 10b</tt> gibi bir komut vererek segmenti de kendimiz belirleyebiliriz. Ayrıca ekran görüntüsünde de gördüğünüz gibi db talimatı belleğe olduğu gibi değil, db komutlarına parçalanarak geçirilmiş. Ancak bizim burada asıl odaklanmamız gereken nokta makine kodları ve bu kodların Assembly karşılıkları. Öncelikle bu kodları bir daha görelim:
1524:0100 B409 MOV AH,09
1524:0102 BA0B01 MOV DX,010B
1524:0105 CD21 INT 21
1524:0107 B44C MOV AH,4C
1524:0109 CD21 INT 21
1524:010B 64 DB 64
1524:010C 65 DB 65
1524:010D 6E DB 6E
1524:010E 65 DB 65
1524:010F 6D DB 6D
1524:0110 65 DB 65
Bu sonuçlardan görebileceğimiz üzere <tt>mov ah</tt>'ın karşılığı B4'tür, <tt>mov dx</tt>'in karşılığı da BA'dır. Yani mov'un belirli bir karşılığı yoktur. Ayrıca ikinci satırdan da anlayacağınız üzere veriler bellek ve yazmaçlarda düşük değerlikli bayttan itibaren yerleştirilir. Yani ilk önce en sağdaki bayt, sonra onun bir solundaki bayt, ... şeklinde gider. Buna ''Little Endian Byte Ordering'' denir.
Normalde bilgisayarların tek anlayabildiği sayı sistemi ikilik sayı sistemidir. Bilgisayar bütün işlemleri ikilik sayı sistemi ile yapar. Yani <tt>mov</tt> komutunun veya <tt>A</tt> karakterinin bilgisayar için hiçbir anlamı yoktur. Karakterlerin bilgisayarda nasıl temsil edildiğini daha önce görmüştük. ASCII kodlarla temsil ediliyorlar. Yani A sayısı bilgisayarda (41)<sub>16</sub> yani (01000001)<sub>2</sub> sayısı ile temsil edilir. Yani bir bellek gözeneğinde (01000001)<sub>2</sub> sayısı varsa o bellek gözeneğinde A karakteri saklanıyor demektir. Peki ya komutlar? Komutların bellekte nasıl saklandıklarını anlamak için şöyle bir deney yapalım. Debug'da Assembly moduna geçip şöyle bir program yazalım:
1524:0100 mov ah,9
1524:0102 mov dx,10b
1524:0105 int 21
1524:0107 mov ah,4c
1524:0109 int 21
1524:010b db "deneme$"
Bu program bildiğiniz üzere ekrana <tt>deneme</tt> yazıp kapanır. Bu programı yazıp çalıştığından emin olmak için bir kere çalıştıralım. Sonra debug modundayken <tt>u 100</tt> komutunu verelim. u komutu aktif segmentteki belirtilen ofsetten itibaren bir miktar komutu assembly ve makine kodu olarak ekrana yazar. Rehberlik etmesi açısından şimdiye kadar yaptıklarımızın ekran görüntüsü şu şekilde:
[[Dosya:U.jpg|center]]
Bu resimdeki ilk sütun bellek adresleri, ikinci sütun ilgili bellek adreslerindeki makine kodları, diğer iki sütun da ilgili bellek gözeneklerindeki makine kodlarının Assembly dilindeki karşılıklarıdır. Eğer sadece u komutunu verseydik aktif segmentteki aktif ofsetten itibaren ilgili kodlar yazılacaktı. Aktif ofsetin değişik olma ihtimalini düşünerek ofseti kendimiz belirttik. İstersek <tt>u 100 10b</tt> gibi bir komut vererek bellekteki hangi aralıktaki kodların gösterileceğini de belirleyebilirdik. Bu durumda bizi ilgilendirmeyen kodları görmemiş olurduk. Hatta <tt>u 1200:100 10b</tt> gibi bir komut vererek segmenti de kendimiz belirleyebiliriz. Ayrıca ekran görüntüsünde de gördüğünüz gibi db talimatı belleğe olduğu gibi değil, db komutlarına parçalanarak geçirilmiş. Ancak bizim burada asıl odaklanmamız gereken nokta makine kodları ve bu kodların Assembly karşılıkları. Öncelikle bu kodları bir daha görelim:
1524:0100 B409 MOV AH,09
1524:0102 BA0B01 MOV DX,010B
1524:0105 CD21 INT 21
1524:0107 B44C MOV AH,4C
1524:0109 CD21 INT 21
1524:010B 64 DB 64
1524:010C 65 DB 65
1524:010D 6E DB 6E
1524:010E 65 DB 65
1524:010F 6D DB 6D
1524:0110 65 DB 65
Bu sonuçlardan görebileceğimiz üzere <tt>mov ah</tt>'ın karşılığı B4'tür, <tt>mov dx</tt>'in karşılığı da BA'dır. Yani mov'un belirli bir karşılığı yoktur. Ayrıca ikinci satırdan da anlayacağınız üzere veriler bellek ve yazmaçlarda düşük değerlikli bayttan itibaren yerleştirilir. Yani ilk önce en sağdaki bayt, sonra onun bir solundaki bayt, ... şeklinde gider. Buna ''Little Endian Byte Ordering'' denir.

