Transfer Komutları
MOV Komutu
MOV komutuna daha önce bellek adresleme bölümünde kısaca değinilmişti. Bu kısımda
komutun kullanımı hakkında daha ayrıntılı bilgi verilecektir. Mov komutunun çeşitli kullanım
biçimleri aşağıdaki gibidir.
Genel Form : mov hedef, kaynak
mov register, register
mov bellek, register
mov register, bellek
mov bellek, sabit değer
mov register, sabit değer
Yukarıda mov komutunun çeşitli kullanım şekilleri gösterilmiştir. Dikkat ederseniz kullanım
şekilleri arasında bellek-bellek arasında transfer yok. Yukarıdaki register ifadeleri hem genel
amaçlı registerları hem de segment registerlarını temsil etmektedir. Yalnız, kesinlikle bir sabit
değer doğrudan bir segment registerına atılamaz. Böyle bir işlem aşağıdaki gibi iki aşamada
gerçekleştirilir.
mov ax, 1234
mov cs, ax
Yukarıdaki örnekte CS içerisine 1234h değeri atanmıştır.
Dikkat edilmesi gereken bir başka önemli nokta da transferi yapılacak değerlerin boylarının
aynı olmasıdır. Yani AH içerisine 16-bitlik bir değer atamsı yapılamaz. Aynı şekilde 8-bitlik
bir registerdan 16-bitlik bir resgistera da transfer yapılamaz.
Herhangi bir bellek bölgesi dolaylı adresleme ile adreslenip içerisine sabit bir değer atanmak
istendiği zaman atanacak değerin uzunluğu belirtilmelidir.
mov [bx], 12 -> Hata !
mov byte ptr [bx], 12
yada
mov word ptr [bx], 1234
byte ptr ve word ptr önekleri ile transfer edilecek bilginin boyu hakkında işlemciye bilgi
verilmektedir.
NOT: 32-bit işlemcilerde ( 80386 ve sonrasında ) dword ptr öneki ile 32-bit bilgi transferi
yapılabilmektedir.
MOV komutu flag registerlar üzerinde herhangi bir değişiklik yapmamaktadır.
XCHG Komutu
XCHG (exchange) komutu iki değeri karşılıklı olarak değiştirmek için kullanılır. Tabi yine
değişiklik yapılacak değerlerin aynı boyda olması gerekmektedir. Genel formu aşağıdaki
gibidir.
xchg register, register
xchg bellek, register
xchg komutunun kullanımında operandların yerleri önemli değildir. Yani xchg bellek,
register ile xchg register, bellek aynı işi yapmaktadır.
mov ax,1234 -> AX=1234h
mov bx, 5678 -> BX=5678h
xchg ax,bx -> AX=5678h BX=1234h
XCHG komutu flag registerlar üzerinde herhangi bir değişiklik yapmamaktadır
,
LEA Komutu
LEA komutunun kullanımı MOV komutu ile benzerlik göstermesine karşın bazı durumlarda
programcıya iki yada üç komut ile yapılacak bir işlemi tek komut ile yapma olanağı
sağlamaktadır. Genel formu aşağıdaki gibidir.
lea register, bellek
Komutun kullanımına birkaç örnek verince programcıya sağladığı kolaylıklar daha basit
anlaşılacaktır.
lea ax, [bx] -> mov ax, [bx]
lea bx, 3[bx] -> BX = BX+3
Yukarıdaki kullanımlar lea komutu dışında tek bir komut ile icra edilebilecek durumlardır.
(BX = BX+3 ifadesinin assembly dilindeki karşılığı daha anlatılmadığı için normal bir gösterim
kullanılmıştır) Aşağıdaki örnekler incelenirse komutun sağladığı kolaylık açıkça fark
edilecektir.
lea ax, 3[bx] -> BX = BX+3 -> mov ax, bx
lea ax, 8[bx+di]
LEA komutunun genel kullanım amacı herhangi bir registera bir bellek adresi saklamaktır.
Komut kullanımı sırasında flag registerlar üzerinde herhangi bir etki yapmamaktadır.
PUSH Komutu
PUSH komutu herhangi bir bilgiyi bilgisayarın stack adı verilen bölümüne kaydetmek için
kullanılır. PUSH komutu ile stack üzerine atılacak bilgi 16-bit uzunluğunda olmalıdır.
Komutun genel formu aşağıdaki gibidir.
PUSH değer
Yukarıda değer ile gösterilen kısım daha öncede belirtildiği gibi 16-bit uzunluğunda
olmalıdır. Bunun yanı sıra değer ile gösterilen kısım sabit bir değer alamaz. Yani PUSH ile
stack üzerine yazılacak değer ya bir register içerisindeki değer yada bir bellek bölgesindeki
değer olmalıdır.
PUSH komutu ile stack üzerine bilgi yazıldığı için SPnin değeri değişmektedir. İcra edilen
her PUSH komutu SPnin değerini 2 azaltacaktır (PUSH ile 2 bayt bilgi aktarıldığı için).
Aşağıda PUSH komutu ile stack üzerine bilgi aktarılmasına bir örnek verilmiştir.
mov ax,1234 -> AX = 1234h
push ax -> AX > STACK , SP = SP-2
Stack üzerine bilgi yazma işlemi gerekli değerlerin geçici bir süre saklanması için ve bazı
UNIX sistemlerde kesme kullanımında gerekli parametrelerin aktarılması için işaretçiler ile
birlikte kullanılır.
PUSHF Komutu
PUSHF komutu ile PUSH komutuna benzer olarak stack üzerine bilgi aktarılır. Yalnız burada
tek fark, PUSHF komutu ile aktarılacak bilginin herhangi bir register yada bellek bölgesinden
değil de flag registerdan alınmasıdır. Komutun kullanımı aşağıdaki gibidir.
PUSHF
Görüldüğü gibi komutun kullanımı sırasında hiçbir register yada bellek adresi
kullanılmamıştır. Onun yerine stack üzerine atılacak bilgi doğrudan 16-bit uzunluğundaki flag
resigter içerisindeki değerdir.
Komut herhangi bir işlem sırasında flag registerın mevcut değerini korumak için kullanılır.
Yine PUSH komutunda olduğu gibi PUSHF komutu da SPnin değerini 2 azaltacaktır.
POP Komutu
POP komutu ile stack üzerinden bilgi okuması yapılır. Yani PUSH komutu ile stack üzerine
yazılan bilgi POP komutu ile geri okunur. Okunan bilgi 16-bit uzunluğunda olmalıdır.
POP komutu ile alınacak bilgi stack üzerine yazılan son bilgidir. PUSH ve POP komutları ile
bilgi transferi yapılırken yazılan ve okunan bilgilerin sıralaması önemlidir. Programlar
yazılırken stack üzerindeki işlemlerde hesaplama hatası yapılması sık karşılaşılan
durumlardandır. Komutun genel kullanımı aşağıdaki gibidir.
POP alıcı_alan
Yukarıda alıcı alan bir bellek bölgesi veya register olabilir.
mov ax,1234 -> AX = 1234h
push ax -> AX > STACK , SP = SP-2
mov ah,01 -> AH = 01 ,AXin değeri değişti!
pop ax -> AX = 1234h
Örneğimizde önce AXe bir değer atanıyor ve daha sonra AHın değeri değiştirilmek sureti
ile dolaylı olarak AXinde değeri değiştiriliyor. Son işlemde de POP komutu ile AXin önceden
stack üzerine PUSH ile atılan eski değeri geri alınıyor.
POPF Komutu
POP komutu ile PUSH eşleştirilir ise PUSHF komutu ile de POPF komutunu eşleştirmek
yanlış olmaz. POPF komutu ile stack üzerinden 16-bitlik bilgi flag registera yazılır. Alınan 16
bitin hepsi işlemci tarafından dikkate alınmaz. Bitlerin word içerisindeki sıralarına göre işlemci
için ifade ettikleri değerler aşağıda verilmiştir.
0. bit -> Carry biti
2. bit -> Parity biti
4. bit -> Auxilary biti
6. bit -> Zero biti
7. bit -> Sign biti
8. bit -> Trap biti
9. bit -> Interrupt biti
10. bit -> Direction biti
11. bit -> Overflow biti
POPF komutu anlaşılacağı üzere flag registerın değerini tamamen değiştirmektedir. Komut
tıpkı PUSHF komutunda olduğu gibi tek başına kullanılır.
PUSH, PUSHF, POP ve POPF komutlarının stack üzerinde işleyişlerini tam olarak
kavrayabilmek için yazının daha önceki bölümlerinde yer alan Stack kısmını tekrar
okumanızı tavsiye ederim
LAHF Komutu
LAHF (Load AH from Flags) komutu AH registerına flag registerın düşük seviyeli baytını
kopyalar. Kopyalanan bitler sign, zero, auxilary, parity ve carry bitleridir. Bunların dışında
kalan overflow, direction, interrupt ve trace bitlerinin komut ile bir ilgisi yoktur. Komutun
kullanımı aşağıdaki gibidir.
lahf
Görüldüğü gibi komut tek başına kullanılmaktadır. Komutun icrası sırasında flag registerda
herhangi bir değişiklik olmaz.
SAHF Komutu
SAHF (Store AH into Flags) komutu da LAHF komutu gibi flag register üzerinde işlem
yapar. AH içerisindeki değer flag registerın düşük seviyeli baytına kopyalanır. Yine işlemden
etkilenen bitler sign, zero, auxilary, parity ve carry bitleridir. Komutun kullanımı LAHF
komutunda olduğu gibi tek başınadır.
MOV komutuna daha önce bellek adresleme bölümünde kısaca değinilmişti. Bu kısımda
komutun kullanımı hakkında daha ayrıntılı bilgi verilecektir. Mov komutunun çeşitli kullanım
biçimleri aşağıdaki gibidir.
Genel Form : mov hedef, kaynak
mov register, register
mov bellek, register
mov register, bellek
mov bellek, sabit değer
mov register, sabit değer
Yukarıda mov komutunun çeşitli kullanım şekilleri gösterilmiştir. Dikkat ederseniz kullanım
şekilleri arasında bellek-bellek arasında transfer yok. Yukarıdaki register ifadeleri hem genel
amaçlı registerları hem de segment registerlarını temsil etmektedir. Yalnız, kesinlikle bir sabit
değer doğrudan bir segment registerına atılamaz. Böyle bir işlem aşağıdaki gibi iki aşamada
gerçekleştirilir.
mov ax, 1234
mov cs, ax
Yukarıdaki örnekte CS içerisine 1234h değeri atanmıştır.
Dikkat edilmesi gereken bir başka önemli nokta da transferi yapılacak değerlerin boylarının
aynı olmasıdır. Yani AH içerisine 16-bitlik bir değer atamsı yapılamaz. Aynı şekilde 8-bitlik
bir registerdan 16-bitlik bir resgistera da transfer yapılamaz.
Herhangi bir bellek bölgesi dolaylı adresleme ile adreslenip içerisine sabit bir değer atanmak
istendiği zaman atanacak değerin uzunluğu belirtilmelidir.
mov [bx], 12 -> Hata !
mov byte ptr [bx], 12
yada
mov word ptr [bx], 1234
byte ptr ve word ptr önekleri ile transfer edilecek bilginin boyu hakkında işlemciye bilgi
verilmektedir.
NOT: 32-bit işlemcilerde ( 80386 ve sonrasında ) dword ptr öneki ile 32-bit bilgi transferi
yapılabilmektedir.
MOV komutu flag registerlar üzerinde herhangi bir değişiklik yapmamaktadır.
XCHG Komutu
XCHG (exchange) komutu iki değeri karşılıklı olarak değiştirmek için kullanılır. Tabi yine
değişiklik yapılacak değerlerin aynı boyda olması gerekmektedir. Genel formu aşağıdaki
gibidir.
xchg register, register
xchg bellek, register
xchg komutunun kullanımında operandların yerleri önemli değildir. Yani xchg bellek,
register ile xchg register, bellek aynı işi yapmaktadır.
mov ax,1234 -> AX=1234h
mov bx, 5678 -> BX=5678h
xchg ax,bx -> AX=5678h BX=1234h
XCHG komutu flag registerlar üzerinde herhangi bir değişiklik yapmamaktadır
,
LEA Komutu
LEA komutunun kullanımı MOV komutu ile benzerlik göstermesine karşın bazı durumlarda
programcıya iki yada üç komut ile yapılacak bir işlemi tek komut ile yapma olanağı
sağlamaktadır. Genel formu aşağıdaki gibidir.
lea register, bellek
Komutun kullanımına birkaç örnek verince programcıya sağladığı kolaylıklar daha basit
anlaşılacaktır.
lea ax, [bx] -> mov ax, [bx]
lea bx, 3[bx] -> BX = BX+3
Yukarıdaki kullanımlar lea komutu dışında tek bir komut ile icra edilebilecek durumlardır.
(BX = BX+3 ifadesinin assembly dilindeki karşılığı daha anlatılmadığı için normal bir gösterim
kullanılmıştır) Aşağıdaki örnekler incelenirse komutun sağladığı kolaylık açıkça fark
edilecektir.
lea ax, 3[bx] -> BX = BX+3 -> mov ax, bx
lea ax, 8[bx+di]
LEA komutunun genel kullanım amacı herhangi bir registera bir bellek adresi saklamaktır.
Komut kullanımı sırasında flag registerlar üzerinde herhangi bir etki yapmamaktadır.
PUSH Komutu
PUSH komutu herhangi bir bilgiyi bilgisayarın stack adı verilen bölümüne kaydetmek için
kullanılır. PUSH komutu ile stack üzerine atılacak bilgi 16-bit uzunluğunda olmalıdır.
Komutun genel formu aşağıdaki gibidir.
PUSH değer
Yukarıda değer ile gösterilen kısım daha öncede belirtildiği gibi 16-bit uzunluğunda
olmalıdır. Bunun yanı sıra değer ile gösterilen kısım sabit bir değer alamaz. Yani PUSH ile
stack üzerine yazılacak değer ya bir register içerisindeki değer yada bir bellek bölgesindeki
değer olmalıdır.
PUSH komutu ile stack üzerine bilgi yazıldığı için SPnin değeri değişmektedir. İcra edilen
her PUSH komutu SPnin değerini 2 azaltacaktır (PUSH ile 2 bayt bilgi aktarıldığı için).
Aşağıda PUSH komutu ile stack üzerine bilgi aktarılmasına bir örnek verilmiştir.
mov ax,1234 -> AX = 1234h
push ax -> AX > STACK , SP = SP-2
Stack üzerine bilgi yazma işlemi gerekli değerlerin geçici bir süre saklanması için ve bazı
UNIX sistemlerde kesme kullanımında gerekli parametrelerin aktarılması için işaretçiler ile
birlikte kullanılır.
PUSHF Komutu
PUSHF komutu ile PUSH komutuna benzer olarak stack üzerine bilgi aktarılır. Yalnız burada
tek fark, PUSHF komutu ile aktarılacak bilginin herhangi bir register yada bellek bölgesinden
değil de flag registerdan alınmasıdır. Komutun kullanımı aşağıdaki gibidir.
PUSHF
Görüldüğü gibi komutun kullanımı sırasında hiçbir register yada bellek adresi
kullanılmamıştır. Onun yerine stack üzerine atılacak bilgi doğrudan 16-bit uzunluğundaki flag
resigter içerisindeki değerdir.
Komut herhangi bir işlem sırasında flag registerın mevcut değerini korumak için kullanılır.
Yine PUSH komutunda olduğu gibi PUSHF komutu da SPnin değerini 2 azaltacaktır.
POP Komutu
POP komutu ile stack üzerinden bilgi okuması yapılır. Yani PUSH komutu ile stack üzerine
yazılan bilgi POP komutu ile geri okunur. Okunan bilgi 16-bit uzunluğunda olmalıdır.
POP komutu ile alınacak bilgi stack üzerine yazılan son bilgidir. PUSH ve POP komutları ile
bilgi transferi yapılırken yazılan ve okunan bilgilerin sıralaması önemlidir. Programlar
yazılırken stack üzerindeki işlemlerde hesaplama hatası yapılması sık karşılaşılan
durumlardandır. Komutun genel kullanımı aşağıdaki gibidir.
POP alıcı_alan
Yukarıda alıcı alan bir bellek bölgesi veya register olabilir.
mov ax,1234 -> AX = 1234h
push ax -> AX > STACK , SP = SP-2
mov ah,01 -> AH = 01 ,AXin değeri değişti!
pop ax -> AX = 1234h
Örneğimizde önce AXe bir değer atanıyor ve daha sonra AHın değeri değiştirilmek sureti
ile dolaylı olarak AXinde değeri değiştiriliyor. Son işlemde de POP komutu ile AXin önceden
stack üzerine PUSH ile atılan eski değeri geri alınıyor.
POPF Komutu
POP komutu ile PUSH eşleştirilir ise PUSHF komutu ile de POPF komutunu eşleştirmek
yanlış olmaz. POPF komutu ile stack üzerinden 16-bitlik bilgi flag registera yazılır. Alınan 16
bitin hepsi işlemci tarafından dikkate alınmaz. Bitlerin word içerisindeki sıralarına göre işlemci
için ifade ettikleri değerler aşağıda verilmiştir.
0. bit -> Carry biti
2. bit -> Parity biti
4. bit -> Auxilary biti
6. bit -> Zero biti
7. bit -> Sign biti
8. bit -> Trap biti
9. bit -> Interrupt biti
10. bit -> Direction biti
11. bit -> Overflow biti
POPF komutu anlaşılacağı üzere flag registerın değerini tamamen değiştirmektedir. Komut
tıpkı PUSHF komutunda olduğu gibi tek başına kullanılır.
PUSH, PUSHF, POP ve POPF komutlarının stack üzerinde işleyişlerini tam olarak
kavrayabilmek için yazının daha önceki bölümlerinde yer alan Stack kısmını tekrar
okumanızı tavsiye ederim
LAHF Komutu
LAHF (Load AH from Flags) komutu AH registerına flag registerın düşük seviyeli baytını
kopyalar. Kopyalanan bitler sign, zero, auxilary, parity ve carry bitleridir. Bunların dışında
kalan overflow, direction, interrupt ve trace bitlerinin komut ile bir ilgisi yoktur. Komutun
kullanımı aşağıdaki gibidir.
lahf
Görüldüğü gibi komut tek başına kullanılmaktadır. Komutun icrası sırasında flag registerda
herhangi bir değişiklik olmaz.
SAHF Komutu
SAHF (Store AH into Flags) komutu da LAHF komutu gibi flag register üzerinde işlem
yapar. AH içerisindeki değer flag registerın düşük seviyeli baytına kopyalanır. Yine işlemden
etkilenen bitler sign, zero, auxilary, parity ve carry bitleridir. Komutun kullanımı LAHF
komutunda olduğu gibi tek başınadır.
