- 8 Eyl 2016
- 1,647
- 1,007
Merhabalar. Bu konumuzda Assembly ile giriş ve çıkış işlemlerine değineceğim. Giriş ve çıkış komutlarını inceleyeceğiz.
Input ve Output yani kısaca I/O komutları verilerin mikroişlemci-port arasındaki aktarım ilişkisini sağlamaktadır.
Veriler giriş portundan alınırsa verinin boyutuna göre işlemci mimarisine uygun registerlardan alınır. Yani 8 bitlik veri Al, 16 bit AX, 32 bit EAX registerlarına alınır. Veriler çıkış portuna gönderilecekse yine uygun registerlara alındıktan sonra çıkış portuna gönderilir.
Burada bahsi geçen port kavramını açıklamak gerekirse sistemin dış dünyayla ilişkisini kuran kapı numaraları gibi düşünebiliriz. Mikroişlemcilerimiz giriş çıkış işlemlerinde bellek haritalı ve yalıtılmış giriş çıkış işlemlerini kullanırlar. Giriş çıkış işlemlerindeki port adresleri statik ve dinamik formatlarda tanımlanabilir. Statik adreslemede A7 ve A0 hatlarına yerleşilir 0-255 arası değer alınır. Dinamik adreslemede adresler DX kaydedicisine alınır 0 ile 65535 arasında toplamda 65536 port tanımlanabilir. Bu da adres yolunda A0 ile A15 hatlarının tamamını kapsar.
Temel teorik bilgilerden sonra birkaç Assembly kodu inceleyelim.
OUT instruction
OUT, bir bağlantı noktasına byte yani 8bit veya Word yani 16bitlik verileri çıktılar. AL ve AX kaydedicilerini kullanır.
AL kaydedicisinin içeriğini 3BH bağlantı noktası adresine kopyalar.
Bu da AX kaydedicisi içeriğini 2CH bağlantı noktasına kopyalar.
İlgili satırları incelersek MOV komutu ile 0FFF8H port adresi DX kaydedicisine kopyalanıyor. Yani DX adres olarak 0FFF8H adresini tutuyor. Sonraki iki satırda ise AL ve AX kaydedicilerine de bu adresler yükleniyor. Burada aslında bir dinamik adresleme yapılıyor. 0000H FFFFH arasında bir değer tanımlanıyor.
IN instruction
Bu talimatımız verileri kopyalanacak bir bağlantı noktasından AL veya AX yazmaçlarına yazar.
0C8H port adresinden AL kaydedicisine 1 bayt giriliyor.
Burada ise AX kaydedicisinden dolayı 2 baytlık değer 34H adresinden giriliyor.
String Giriş ve Çıkış Komutları
INS ve OUTS komutları aynı IN ve OUT komutlarının işlevini gerçekleştirir. Bu komutlarla giriş çıkış işlemleri yapılırken bellekten porta veya porttan belleğe veri aktarımı dizin şeklinde yapılır. String aktarımında da veriler byte, word, dword şeklinde aktarılabilir. Yani bu komutların sonuna ilgili tanımlar eklenir.
INSB: Byte(1 byte) değerinde giriş işlemi gerçekleştirir.
INSW: Word(2 byte) değerinde giriş işlemi gerçekleştirir.
INSD: Dword(4 byte) değerinde giriş işlemi gerçekleştirir.
Hedefdizi adresi ES: DI kaydedicisinin adresinden başlar. Kaynakdizi adresi DS:SI kaydedicisinin adresinden başlar.
Bu konuda temel olarak bahsedeceklerim bu kadar. Okuduğunuz için teşekkür ederim. Diğer konularımıza assembly bölümünden erişebilirsiniz.
Input ve Output yani kısaca I/O komutları verilerin mikroişlemci-port arasındaki aktarım ilişkisini sağlamaktadır.
Veriler giriş portundan alınırsa verinin boyutuna göre işlemci mimarisine uygun registerlardan alınır. Yani 8 bitlik veri Al, 16 bit AX, 32 bit EAX registerlarına alınır. Veriler çıkış portuna gönderilecekse yine uygun registerlara alındıktan sonra çıkış portuna gönderilir.
Burada bahsi geçen port kavramını açıklamak gerekirse sistemin dış dünyayla ilişkisini kuran kapı numaraları gibi düşünebiliriz. Mikroişlemcilerimiz giriş çıkış işlemlerinde bellek haritalı ve yalıtılmış giriş çıkış işlemlerini kullanırlar. Giriş çıkış işlemlerindeki port adresleri statik ve dinamik formatlarda tanımlanabilir. Statik adreslemede A7 ve A0 hatlarına yerleşilir 0-255 arası değer alınır. Dinamik adreslemede adresler DX kaydedicisine alınır 0 ile 65535 arasında toplamda 65536 port tanımlanabilir. Bu da adres yolunda A0 ile A15 hatlarının tamamını kapsar.
Temel teorik bilgilerden sonra birkaç Assembly kodu inceleyelim.
OUT instruction
OUT, bir bağlantı noktasına byte yani 8bit veya Word yani 16bitlik verileri çıktılar. AL ve AX kaydedicilerini kullanır.
Kod:
OUT 3BH, AL
AL kaydedicisinin içeriğini 3BH bağlantı noktası adresine kopyalar.
Kod:
OUT 2CH,AX
Bu da AX kaydedicisi içeriğini 2CH bağlantı noktasına kopyalar.
Kod:
MOV DX, 0FFF8H
OUT DX, AL
OUT DX, AX
İlgili satırları incelersek MOV komutu ile 0FFF8H port adresi DX kaydedicisine kopyalanıyor. Yani DX adres olarak 0FFF8H adresini tutuyor. Sonraki iki satırda ise AL ve AX kaydedicilerine de bu adresler yükleniyor. Burada aslında bir dinamik adresleme yapılıyor. 0000H FFFFH arasında bir değer tanımlanıyor.
IN instruction
Bu talimatımız verileri kopyalanacak bir bağlantı noktasından AL veya AX yazmaçlarına yazar.
Kod:
IN AL,0C8H
0C8H port adresinden AL kaydedicisine 1 bayt giriliyor.
Kod:
IN AX, 34H
Burada ise AX kaydedicisinden dolayı 2 baytlık değer 34H adresinden giriliyor.
String Giriş ve Çıkış Komutları
INS ve OUTS komutları aynı IN ve OUT komutlarının işlevini gerçekleştirir. Bu komutlarla giriş çıkış işlemleri yapılırken bellekten porta veya porttan belleğe veri aktarımı dizin şeklinde yapılır. String aktarımında da veriler byte, word, dword şeklinde aktarılabilir. Yani bu komutların sonuna ilgili tanımlar eklenir.
INSB: Byte(1 byte) değerinde giriş işlemi gerçekleştirir.
INSW: Word(2 byte) değerinde giriş işlemi gerçekleştirir.
INSD: Dword(4 byte) değerinde giriş işlemi gerçekleştirir.
Kod:
INS hedefdizi, DX
OUTS DX, kaynakdizi
Hedefdizi adresi ES: DI kaydedicisinin adresinden başlar. Kaynakdizi adresi DS:SI kaydedicisinin adresinden başlar.
Bu konuda temel olarak bahsedeceklerim bu kadar. Okuduğunuz için teşekkür ederim. Diğer konularımıza assembly bölümünden erişebilirsiniz.