You are on page 1of 17

8086

BİLGİ TRANSFER KOMUTLARI


1. GENEL AMAÇLI BİLGİ TRANSFERİ
Bu komutlar;
• MOV
• XCHNG
• XLAT
• PUSH
• POP ‘ dur.
MOV komutu
• MOV komutu bir byte veya bir word uzunluklu
bilgilerin; registerregister, registerbellek
bölg, bellek bölgregister, sabit
değerregister, sabit değerbellek bölg.
arasında transferi sağlar.
Gönderici Alıcı alandaki Alıcı alandaki Alıcı alandaki
alandaki operand tipi operand tipi operand tipi
operand tipi REGISTER BELLEK SABİT
BÖLGESİ
REGISTER Evet Evet Hayır
BELLEK Evet Hayır Hayır
BÖLGESİ
SABİT Evet Evet Hayır
• İki ayrı bellek bölgesi arasında değer transferi
yapılacaksa bu transferi iki MOV komutu ile
gerçekleştirebiliriz. Örneğin; [200] deki değeri [100] e
göndermek için
MOV AX, [200] ;[200] adresindeki değeri AX registerina at
MOV [100], AX ;AX registerindeki değeri [100] adresine at

• Bir bellek bölgesine sabit bir değer aktarırken,


aktarılacak sabitin uzunluğunun ne olacağı
belirtilmelidir. Sabit değer, bir byte uzunlukta iste MOV
komutunun hemen yanından itibaren BYTE PTR
bildirisi, bir word uzunlukta ise WORD PTR bildirisi
yazılmalıdır.
• Örnekler;
Mov [Si], 100 ; yanlış
Mov [Si], 3F ; yanlış
Mov Word Ptr [Si], 100 ; doğru
Mov Byte Ptr [Si], 3F ; doğru

• Ön eki bildirisi olarak byte ptr kullanıldığında,


gönderici alandaki sabit değerin de en fazla bir
byte uzunluğunda olması şarttır. Örneğin; MOV
Byte Ptr [Si], 89AF örneği yanlıştır.
• Ön eki bildirisi olarak word ptr kullanıldığı halde,
gönderici alandaki sabit değer byte uzunlukta ise,
bu sabit değer, sol tarafına yeteri kadar 0’lar
eklenerek word e dönüştürülür.
• Bir bellek bölgesine değer aktarılırken,
gönderici alan olarak bir register kullanılmış ise
ön ek bildirimi yapılmasına gerek yoktur.
Mov [Si], AL ; AL registeri zaten 8 bit uzunluğunda
Mov [Si], AX ; AX registeri zaten 16 bit uzunluğunda

• Alıcı ve gönderici alandaki operandların tipleri


ne olursa olsun aynı olmak zorundadır.
Mov AL, 100 ;yanlış
Mov AH, BX ; yanlış
Mov Byte Ptr [Si], 89AF ;yanlış
• Bir sabit değeri veya bir segment registerinin
değerini doğrudan doğruya bir başka segment
registerine aktaramayız. Bunun için genel
amaçlı registerlardan birini kullanmalıyız.
Mov Ds, B800 ;yanlış
Mov Es, Ss ;yanlış

; örneğin B800 değerini doğru bir şekilde data segmente atalım


Mov Ax, B800
Mov Ds, Ax
;başka bir örnek, Ss yi Es e aktaralım
Mov Ax, Ss
Mov Es, Ax
• MOV komutunun işlemi sırasında gönderici
alan üzerinde değişiklik olmaz, alıcı alanın
önceki değeri kaybolur yeni gelen değer eski
değerin üzerine yazılır.
XCHG komutu
• Bu komut iki registerin yada bir register ile bir
bellek bölgesinin değerlerini takas etmek
üzere kullanılır(swap etmek). XCHG komutunu
anlamak için iki örneği inceleyelim
;Örnek 1
Push AX ; Ax in saklanması
Mov AX, BX ; AxBx
Pop BX ; saklanan değerin Bx e aktarılması

;Örnek 2
Xchg Ax, Bx ;ax ile bx registerindeki değerler karşılıklı olarak yer değişti
• Genel tanım Xchng operand1, operand2
• Operand olarak segment registerlar
kullanılamaz. Ayrıca operandların her ikisi de
bellek bölgesi olamaz. Sabit değerler operand
olarak kullanılamaz. Kullanılan operandların
uzunlukları aynı olmalıdır.
• Aşağıdaki örnekler yanlıştır.
Xchg Ax, 15 ;yanlış
Xchg [100], [200] ;yanlış
Xchg Byte Ptr [100], [200] ;yanlış
Xchg Word Ptr [100], [200] ;yanlış
Xchg Al, Bx ;yanlış
Xchg Es, Ax ;yanlış
Xchg Ds, Es ;yanlış
Xchg Ip, Sp ;yanlış
XLAT komutu
• XLAT, bir byte’lar bloğunun (veya dizisinin)
istenilen bir elemanına erişmek için kullanılır.
• Genel formu XLAT ‘ dır. Yani operandsız
kullanılır. Bu komut belirli registerları gizlice
kullanır.
• Aşağıdaki program parçasında XLAT komutu, tablo
adındaki dizinin 12. elemanına erişip ASCII karakterin hex
karşılığını AL’ye yükler.
jmp start
tablo db '0123456789ABCDEF'
start:
mov al, 0bh
lea bx, tablo
xlat

• Yukarıdaki örnekte dizi elemanlarının bir komut kodu


şeklinde işlem görmemesi için jmp ile üzerinden
atlanmıştır. Lea ile ise, tablonun offset adresi bx e
yüklenir. Bu komutlara ilerde bakılacaktır.
PUSH komutu
• PUSH komutu stack’a bilgi yerleştirmek için
kullanılır. Genel formu ‘PUSH Gönderici’
şeklindedir. PUSH ile kullanılacak operandın
mutlaka bir word uzunluğunda olması gerekir.
• PUSH komutu operandının bir bellek bölgesi
veya bir word uzunluğuna sahip bir register
olması zorunludur. Operand olarak bir sabit
veya IP registeri kullanılamaz. Aşağıdaki
örnekler yanlıştır.
Push 100 ;yanlış
Push AL ;yanlış
• PUSH komutu kullanılmadan evvel, SP (stack
pointer) registerinin gösterdiği pozisyon, yığına
son olarak terleştirilen bilginin adresidir. PUSH
komutunun icra görmesi ile SP’nin değeri 2
azalır ve SP’nin yeni değeri ile gösterilen yığın
pozisyonuna, operand olarak verilen değer
yerleştirilir.
POP komutu
• Stack’ten bilgi almak için kullanılan POP
komutu, bir tek operanda sahiptir. ‘POP Alıcı’
bu operandın word uzunluğunda bir register
ya da bir bellek bölgesi olmak zorundadır.
• POP komutunun icrası ile, SP’nin stack
üzerinde gösterdiği noktada bulunan bir
word’lük bilgi, POP ile kullanılan bir word’lük
operanda aktarılır ve SP’nin değeri 2 artar.
• POP ile stackdan alınacak bilginin, stacka en son
yerleştirilen bilgi olacağına dikkat edilmelidir. Bu
bilgi PUSH haricindeki bir yol ile de stacka
yerleştirilmiş olabilir.
• Stacka en son giren ilk çıkacak olandır.
Push Ax ; Ax in stack a gönderilmesi
Push Es ; es in stack a gönderilmesi
Push Ds ; Ds in stack a gönderilmesi
…………. ; ax es ds ile ilgili işlemler
Pop Ds ; ilk çıkan ds
Pop Es ; sonra es
Pop Ax ; en son ax çıkacaktır

• XCHG komutundaki ilk örneğimizi de inceleyiniz.

You might also like