1
D1 CPU (CENTRAL PROCESSING UNIT): Merkezi İşlem Birimi; programla sürülen saat modlu ardışıl bir devre olup görevleri: 1) Program emirlerini almak, çözümlemek ve uygulamak 2) BUS’ larla donatılmış sistemi denetlemektir. En basit bir bilgisayar bir CPU ve bir bellekten oluşur. BUS, CPU ve Bellek arasındaki etkileşimleri sağlar. BUS: CPU ve diğer birimler arasındaki adres veya data etkileşimini sağlayan hatlardır. Bir tek BUS bir cihaz tarafından sürülüp bir çok cihaz tarafından kullanılabilir. Data Bus dataların transferinin yapıldığı çift yönlü yoldur. KONTROL BUS: CPU’ nun yapacağı işlem türünün belirtildiği Bus. Yazma, okuma, interrupt,...vs. GİRİŞ/ÇIKIŞ ARAYÜZ ELEMANLARI: Sistem ile dış dünya arasındaki etkileşimin arttırılması sisteme bazı eklemelerin yapılması ile olabilir. Harici cihazlar (yazıcı, çizici, disk, vs...) bu tip eklemelerdir. Bu tip cihazların sisteme doğrudan bağlanmasının doğurduğu sakıncaları ortadan kaldırmak için arayüz veya yüzleştirme elemanları kullanılır. Aksi takdir harici cihazlar hatların kullanımında karışıklıklara neden olabilirler. PIA (paralel interface acces) paralel arayüz elemanı, SIO (serial input output) seri giriş çıkış elemanı, giriş/çıkış arayüz elemanlarına örnek olarak verilebilir. DMA (DIRECT MEMORY ACCES): Direk bellek erişimi elemanı. Hızlı data transferi gerektiğinde kullanılır. CPU ile yaptığı bir dizi haberleşme sonucunda CPU’ yu devre dışı bırakıp bus’ ları teslim alır ve harici cihaza daha hızlı erişilmesini sağlar. APU (ARITMETIC PROCESSING UNIT): Aritmetik işlemci birimi. CPU’ lar sadece alınan emirlerin icrası ile ilgilenirler. Aritmetik işlemciler ise emirlerin icrası sırasında gerekli olan aritmetik işlemleri yapabilen co-processor’lerdir. CPU’ya yardımcı olduklarından hızı arttırırlar. CO-PROCESSOR: Yardımcı işlemci. CPU ile birlikte çalışır. Kendi belleği vardır. ALU (ARITMETIC LOGIC UNIT): CPU içinde bulunur ve emirlerle ilgili lojik işlemleri icra ederler. Kontrol Birimi: Kontrol emir kaydedicinin içeriği ile sürülür ve emir kaydedicisinin kodu bu birim tarafından çözülür. Bellekten alınan emir kodları CPU’ nun içinde bulunan Kontrol Birimi Ünitesinde daha küçük ve basit mikro emir kodlarına çözülür ve ne iş için kullanılacağı anlaşılır. Emir kodları bu şekilde basit mikro emir kodları yardımıyla icra edilir. Program belleğe ilk erişimde her zaman ilk kodun emir olduğu varsayılır ayrıca her bir emrin icrası tamamlandıktan sonra, program bellekteki bir sonraki kod yine CPU tarafından emir kodu olarak algılanır. Yani CPU her emrin icrasından sonra tekrar emir bekler.
1
2
1) MİKROBİLGİSAYAR DONANIMI Mikrobilgisayarlar kullanım amacına göre uygun bir donanım içerirler. Tasarımdaki önemli sorunlar, kullanılacak olan bellek elemanlarının, Giriş/Çıkış kapılarının vs. amaca uygun biçimde adreslenebilmesidir. Açıkçası RAM/ROM ve değişik amaçlı Giriş/Çıkış kapılarına bellek haritasında uygun adreslerin karşı düşürülmesi sağlanmalıdır. ADRES BUS 10 BİT 0-1023
CPU CPU (MPU)
DATA BUS ROM
Clock INPUT/
Output
Şekil 1-1 Verilen bir adresteki elemanın (RAM,ROM,PIO,SIO) seçimi uygun donanımla yapılmaktadır. Adres bilgisi bir kod çözücünün girişine uygulanmakta ve kod çözücünün çıkışı adres bölgesinde kullanılacak olan RAM’ ı veya ROM’ u seçmektedir. Arayüz elemanının seçimi ise benzer biçimde olmaktadır. Genelde arayüz elemanındaki tüm registerlerin (yazmaç veya kaydedici) seçimi için adres bus’ ın en anlamsız hatlarından yararlanılır. Adres bus’ ın en anlamlı hatları ise arayüz elemanını aktif yapacak işareti üretmek için diğer uygun kontrol işaretleri ile birlikte, bir kod çözücünün girişine uygulanır. CPU tarafından üretilen okuma/yazma (R/W) işareti R/W bacağına sahip tüm cihazlara ortak bir hat üzerinden bağlanır. Data Bus ve Adres Bus, bu bus’ ları kullanan tüm elemanlar ve CPU tarafından ortak olarak kullanılmaktadır. CPU’ nun data bus’ ına bağlanan tüm elemanların herhangi bir data çarpışmasına yol açmaması için Yüksek-Empedans (üç konumlu/three state ) özelliğine sahip olmaları gerekmektedir. Şekil 1-1’ de basit bir mikrobilgisayar sisteminin yapısı verilmiştir. Mevcut bir mikrobilgisayar sisteminde bellek kapasitesi veya giriş/çıkış kapısı yeterli değilse ek bir donanımla bu sorun çözülebilir. Yani bir mikrobilgisayara bellek ilavesi yapmak veya seri veya paralel giriş/çıkış kapısı ilave etmek mümkündür. Şekil 2’ deki örnekte bir RAM ve ROM belleğin, bir mikrobilgisayara nasıl eklendiği gösterilmiştir.
Şekil 1-2’ de görüldüğü gibi bu kapasite arttırma işleminde RAM ve ROM belleğin databus’ı CPU’nun databus’ına bağlanır. CPU’ nun adres bus’ı ise gerekirse bazı kontrol hatları ile birlikte bir kod çözücüye uygulanır ve kod çözücünün çıkışından üretilen işaretle istenen RAM veya ROM seçilir. Seçilen bellek elemanının ulaşılmak istenen hücresi de anlamsız adres hatlarının bellek elemanının ilgili adres bacaklarına uygulanması ile sağlanır. 2
3
Şekil 1-3’ de ise 8 bitlik (databus) bir CPU’ nun bellek ve PIA cihazlarıyla nasıl bir mikrobilgisayarı oluşturduğu görülmektedir. Adresbus’ ın, databus’ın, kontrolbus’ ın CPU ile diğer elemanlar arasında etkileşimi teşkil etmek için nasıl kullanıldığını dikkatlice inceleyin.
DATA BUS
DO-D7
R/W
MİKRO İŞLEMCİ
R/W
D0-D7 D0-D7
Kontrol Bus
KOD ÇÖZÜCÜ
__ CS RAM
ROM
A0-A15
A0-A15 __ CS A0-A17
A0-A15
ADRES BUS
Şekil 1-2 16 BİT ADRES BUS
8 BİT DATA BUS
10 BİT 0-1023
6 BİT Adres Kod çözücü
Adres Kod çözücü
PROGRAM BELLEK
CS CE
CPU
DATA BELLEK
APU
WR
8 bit kapı RD
PIA
HARİCİ CİHAZ
Kontrol
DMA
3
Hatları
4
Şekil 1-3
KONTROL BUS
ADRES UZAYINDA BELLEK HARİTAMA ve KOD ÇÖZÜCÜLERLE BELLEK ORGANİZASYONU 16 bit adres busa sahip cpu’ ya 4Kb bellek segmenti, A000H adresinden itibaren Erişilecek şekilde eklenmek isteniyor. Gereken bellek adres organizasyonunu vererek (bellek erişim başlangıç ve erişim son adresleri) kod çözücüde kullanılacak adres Uçlarını belirleyip kod çözücüyü tasarlayınız. A15 1
A14 0
A13 1
A12 0
A11 X
A10 X
A9 X
A8 X
A7 X
A6 X
A5 X
A4 X
A3 X
A2 X
A1 X
A0 X
1
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
1
0
1
1
1
1
1
1
1
1
1
1
1
1
A ADRES KOD ÇÖZÜ İÇİN
F F F BELLEK ERİŞİM ADRESLERİ, 12BİT ADRES UÇLARI İLE 4Kb BELLEK ALANI
(AXXXH) Başlangıç (A000H) Son (AFFFH) Son hexal
Hexal 16’lı notasyonda veri ve adres yazımı için AFFFH, AFFF$ veya 0XAFFF Kullanılabilir. Bu derste H harfi ile AFFFH yazım biçimi kullanılacaktır. Adres uzayında yukarıdaki tabloda harilanan 4kb bellek segmenti (A000H-AFFFH): 12 bit bellek erişimi için ve 4 bitte adres kod çözücü için kullanılması gerektiği açıkça görülmektedir. Genelde değişmeyen en anlamlı adres bitleri belleği seçecek İşareti üreten kod çözücü tasarımında kullanılırlar.
A15
A14
AXXXH
CS alçak aktif
A13
A12
16 bit adres busa sahip cpu’ ya 4Kb bellek segmenti A000H adresinden itibaren Erişilecek şekilde eklenmesi için gereken kod çözücü Adres uzayın 4kb bellek segmenti bu kod çözücü ile seçilebilir. Bellek erişim adres aralığı A000H-AFFFH olacaktır.
4
5
2000H adresinden itibaren erişilemek istenen 2Kb EEPROM (2716) bellek elemanı için gereken bellek adres organizasyonunu vererek (bellek erişim başlangıç ve erişim son adresleri) kod çözücüde kullanılacak adres uçlarını belirleyip kod çözücüyü tasarlayınız. A15
A14
A13
A12
A11
A10
A9
A8
A7
A6
A5
A4
A3
A2
A1
A0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
1
1
1
1
1
1
1
1
1
1
1
ADRES KOD ÇÖZÜ İÇİN
Başlangıç (2000H) Son (27FFH)
BELLEK ERİŞİM ADRESLERİ, 11BİT ADRES UÇLARI İLE 2Kb BELLEK ALANI
Adres uzayında yukarıdaki tabloda haritalanan 2kb bellek segmenti (2000H-27FFH): 11 bit bellek erişimi için ve kalan 5 bit adres kod çözücü için kullanılması gerektiği açıkça görülmektedir. A15+A14+A13+A12+A11 = 2000H…..27FFH olacaktır. Bellek elemanın seçimini Sağlayan bellek ucuna gelecek işareti (burada yine alçak aktif olsun) üreten kod çözücü Değişik yöntemlerle tasarlanabilir, gereken işareti en anlamlı adres bitlerinden Üretecek kod çözücü basit kombinasyonel lojik devrelerle yapılabildiği gibi NAND, NOR Tasarımıyla veya özel kod çözücü entegreleriyle (örnek 74LS138 3 to 8 line decoder) de yapılabilir
A15 * A14 * A13 * A12 * A11 = 2000H…..27FFH NAND kapılarıyla gerçekleme A15 74LS04 hex inverter
A14
2000H…..27FFH CS alçak aktif
74LS30 8 girişli NAND
A13 A12 A11
Böylelikle adres hattına uygulanan 2000H…27FFH arasındaki tüm adresleri için kod çözücü bellek seçme ucu için gereken işareti üretecek, geriye kalan 11bit adres uçları ile de bellek hücreleri seçilebilecek gereken okuma yazma yapılabilecektir.
Intel 8086 işlemcinin adres bus genişliği 20 bittir. 00000H den başlayan 128Kb RAM bellek için gereken bellek adres organizasyonunu vererek (bellek erişim başlangıç ve erişim son adresleri) kod çözücüde kullanılacak adres uçlarını belirleyip kod çözücüyü tasarlayınız. A19
A18
A17
A16
A15
A14
A13
A12
A11
A10
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
ADRES KOD ÇÖZÜ İÇİN
A9
A8
A7
A6
A5
A4
A3
A2
A1
A0
BELLEK ERİŞİM ADRESLERİ, 11BİT ADRES UÇLARI İLE 2Kb BELLEK ALANI
Adres uzayında yukarıdaki tabloda haritalanan 128kb bellek segmenti (00000H-1FFFFH): 16 bit bellek erişimi için ve kalan 4 bit adres kod çözücü için kullanılması gerektiği açıkça görülmektedir.
5
6
A19
A18
CS alçak aktif
A17
A16 Böylelikle adres hattına uygulanan 00000H…1FFFFH arasındaki tüm adresleri için kod çözücü bellek seçme ucu için gereken işareti üretecek, geriye kalan 16bit adres uçları ile de bellek hücreleri seçilebilecek gereken okuma yazma yapılabilecektir.
2) BASİT BİR CPU (MİKRO İŞLEMCİ) İÇ MİMARİSİ Basit bir CPU’ nun iç mimarisi Kontrol Birimi,Genel Amaçlı Kaydediciler, Özel Amaçlı Kaydediciler, Aritmetik ve Lojik Birim ve diğer Teknoloji Bağımlı Birimlerden oluşur. 1) Programcıya açık olan kısım (Kaydediciler) 2) Programcıya açık olamayan kısım (ALU,Kontrol Birimi) Burada işlemcinin 8 bit DataBus’a ve 16 bit AdresBus’a sahip olduğu düşünülecek. Aşağıda böyle bir CPU’ için kullanılabilecek, programcıya açık olan en genel kaydediciler görülmektedir. 7 6 5 4 3 2 1 0 Akümülatör Data Counter Program Counter Instruction Register Index Register Stack Pointer Genel Amaçlı Reg.
Akümülatör (A): İşlem sonuçlarının tutulduğu, belleğe gönderilecek veya bellekten okunacak bilgilerin tutulduğu birim. Sadece kaydedicidir, D Flip-Flop’ lardan oluşmuş bir dizi gibi düşünülebilir. Her CPU’ da mutlaka en az bir tane bulunmalıdır. Genişliği databus genişliği kadardır.
6
7
Data counter Register (DC) : Data belleği adreslemeye yarayan bir kaydedicidir. Her CPU’ da bulunması gerekmez. Genişliği adres-bus genişliği kadardır. Program Counter (PC) : Program belleği adreslemeye yarayan ve her program bellek erişiminden sonra içeriği otomatik olarak artan bir sayıcıdır. Başka bir deyişle programı oluşturan emir kodlarını sırasıyla işleme hazırlar. JMP (atlama, dallanma) emirleriyle yüklenir. Düşük seviyeli dillerde buna RUN karşılık gelir. Reset yapıldığında PC’ nin içeriği sıfırlanır ki bu çok önemlidir. Adres-bus genişliğindedir. Instruction Register (I;Emir Kaydedici) : Program bellekten, program counterin adreslediği yerdeki emrin, kodunun çözülüp icrası işlemleri sırasında kaydedildiği register. Emir kodları CPU’ nun içinde bulunan Kontrol Ünitesinde mikro program kodlarına çözülür ve ne iş için kullanılacağı anlaşılır. Program belleğe ilk erişimde her zaman ilk kodun emir olduğu varsayılır ayrıca her bir emrin icrası tamamlandıktan sonra, program bellekteki bir sonraki kod yine CPU tarafından emir kodu olarak algılanır. Yani CPU her emrin icrasından sonra tekrar emir bekler. Index Register: Data belleği adreslemek için kullanılır, adres-bus genişliğindedir. Stack Pointer (SP): Stack (yığın) belleği adreslemeye yarayan, adres-bus genişliğinde bir kaydedicidir. Belleğin (özellikle program belleğin) kullanıcı tarafından adreslenmesi ve kaydedicilerin değişik amaçlar için kullanılması sırasında, aynı zamanda CPU tarafından da kullanılan kaydedicilerin içeriğinin değişmesinden dolayı bazı sakıncalar ortaya çıkar, program bir nevi virüslenmiş olur. Böyle durumlarda kaydedicilerin içerikleri gerektiğinde tekrar buradan alınmak için stack pointerde tutularak bu sakıncalardan kaçınılabilir. Altprogramlı çalışmalarda veya interruptlı çalışmalarda; alt programdan veya interrupt servis programlarından önce ve bunlardan dönüşte kaydediciler stack belleğe önce atılır ve dönüşte buradan geri çağrılarak ana programın icrasının devamlılığı sağlanmış olur. Bu tip çalışmalarda ana program kesilir ve alt veya interrupt servis programı CPU tarafından koşulmaya başlar, bu işlem bitince CPU’ nun ana programın neresinde ve hangi işlemde kaldığını bilmesi veya CPU’ ya bu bilgilerin (A, DC,PC,SP....) bildirilmesi kesin gerekmektedir. Genel Amaçlı Registerler: Akümülatöre benzerler. Ara sonuçların sık kullanılan bilgilerin tutulduğu kaydedicilerdir. D2 Aşağıdaki şekilde basit bit CPU’ nun programcıya açık ve kapalı olan birimleriyle beraber genel fonksiyonel gösterimi verilmiştir. Durum bayrakları ALU’ da yapılan işlemler sonucu oluşan durumlara ilişkin (Elde, Taşma, Sıfır, İşaret…vs) özelliklerin tutulduğu bir kaydedicidir. Tümleyici en başta çıkarma işlemi için olmak üzere gerekli bir aritmetik işlem alt birimidir.
7
8
CPU’ nun iç mimarisindeki Data ve Adres BUS genişlikleri CPU’ dan dışarı olan Data ve Adres BUS genişlikleriyle eşit veya daha uzun olabilir. Örneğin 16 bitlik bir CPU’ ya ait iç Data BUS 32 bit genişliğinde olabilir. DATA BUS ALU
A
Durum Bayrakları (Status Flags)
DC PC I
Kaydırıcı (Shifter) Tümleyici (Complementer)
Toplama ve Boole Lojiği (Addition and Bole Logic)
KONTROL BİRİMİ Buffer Kaydedici
DATA BUS
*Bir BUS bir cihaz tarafından sürülebilir ve bir BUS’ dan tüm cihazlar bilgi alabilir. * 16 bitlik bir Adres BUS (0000H…..FFFFH) 216 =65536 adet kombinasyon demektir ki bu değer 64K olarak kabul edilir. 8 bit 6 BİT Adres Kod Çözücü
1111111111
C0 C1
3FFH
C63
10 bit 6
2 =64 adet seçim kombinasyonu ve 10 bitlik adres yolu ile 1024 adet bellek alanı sonuç olarak toplam 64x1024=64K lık bellek alanı bu şekilde adreslenebilir ve kullanılabilir.
0000000000 0000H
8
000H
9
Stack (Yığın) Bellek: Alt programlı veya interrupt (kesme) ile çalışıldığı zaman CPU’ nun ana programa dönüşünü sağlamak ve işlemi kaldığı durumdan tekrar devam ettirebilmek için bazı veri veya kayıtçıların tutulduğu bellek bölgesidir. Alt program veya interrupt’ dan önce gerekli bilgiler (AX,BX,CS,DS….gibi) stack belleğe atılır, alt program veya interruptlı çalışma bitince daha sonrada tekrar bu bilgiler yığından alınarak ana programın çalışmasına kalınan yerden devam etmesi sağlanır. POP ve PUSH
0001H
------------
CPU Tarafından Program Bellek Data Bellek Stack (Yığın) Bellek
FFFFH
** 0A30H ve 0A31H adreslerindeki 1 byte’lık verileri toplayarak sonucu 0A31H adresine yazan bir programın icrası için; 1) 2) 3) 4) 5) 6)
Toplanacak ilk veri için data bellek adresini belirle, Bu adresteki veri CPU’ ya transfer et (A akümülatörüne yaz) Toplanacak ikinci veri için data bellek adresini belirle, Bu adresteki veri ile 2. adımda CPU’ ya alınan veriyi topla, Sonucun saklanacağı bellek adresini belirle, Sonucu bu adrese yaz.
Bu işlem adımlarını sırasıyla yapacak olan komutların program bellekte emir kodları olarak mevcut olması yani CPU’ nun programlanması gerekmektedir. Her adımın icrası bir emir kodu gerektirir ve her emirin kodu mevcuttur. Emir kodları program belek bölgesinde 1 veya daha fazla byte uzunluğunda yer kaplayabilirler. Program bellek, data bellek, …..vs bölgeleri aslında aynı bellek yongası üzerindedirler ve bazı durumlarda iç içe yer alabilecekleri bir yerleşime de sahip olabilirler. Programlama esnasında programcı tarafından bu bölgeler tahsis edilebilmektedir. **Motorola 6802 cpu için bu adımları sırasıyla gerçekleyecek program kodları oluşturulacak olursa: 9C emir kodu kendinden sonra gelen 2 byte veriyi alarak data belleğin adresi (DC=0A30) olarak yorumlar ki bu 1. adımı oluşturur. 40 emir kodu 1.adımda belirlenen data bellek adresindeki veriyi CPU’ ya (Akümülatöre) transfer
9
10
Eder ki bu da 2. adımı oluşturur. 3. adım ile 1. adım birbirinin aynısıdır sadece adres değeri değiştirilir. 80 emir kodu toplama işlemini yapar yani 4. adım. Önceki sonraki emir kodları tarafından gerçekleştirildiğinden 5. adım gereksizdir. 60 emir kodu A’ da tutulan sonucu data belleğin belirlenen adresine yazar, bu esnada kontrol BUS içindeki W ucu CPU tarafından aktif edilir. CPU program bellekten aldğı emir kodları ile belirlenen tüm bu işlemleri yaparken; kontrol biriminde çözülen emir kodundan oluşan mikro emirlere bağlı olarak A, DC, IP, PC kayıtçılarının içeriğini de gerekli ve sürekli bir şekilde değiştirir veya günceller.
9C 30 0A 40 9C 31 0A 80
60
Emir Kodu IMMEDIATE DATA Data bellekten Transfer
A’ya
Toplanacak 2. verinin adresini belirle 2. adımda CPU’ya alınan veri ile 0A31 adresindeki veriyi topla sonucu CPU’ da tut, sonuç A’ da kalır Toplamı0A31 adresine yaz
**CPU Kayıtçılarının bu örnekte kullanımı: Programın 0400H adresinden itibaren program bellekte mevcut olduğu varsayılırsa ilk önce PC=0400H adresi ile yüklenerek programın ilk koduna erişilmiş olur. 7 A DC PC I
6
5
4
3
2
1
0
------------0A—30 0400H---04001H---04002H-9C----40----------9C
-------7A----------0A31 --0403H
Program Bellek
Yukarı program icra edilirken kayıtçıların içeriğinin sırasal bir biçimde emir kodlarına uygun biçimde değiştiği görülmektedir.
Adres/ PC 0400H 0401H
Emir kodu 9C 30
9C EMİR KODU ALINIR 30H ALINIR (ADRESİN DÜŞÜK BYTI) 10
11
0402H 0403H
0A 40
0404H 0405H 0406H 0407H
9C 31 0A 80
0408H
60
Data Bellek
------------------
0409H 040AH
0A ALINIR (ADRESİN YÜKSEK BYTI) DC=0A30H YAP 0A30H DATA BELLEK ADRESİNDEN CPU’ YA (AKÜMÜLATÖRE) VERİ TRANSFERİ, PC=0404H OLUR 9C EMİR KODU ALINIR 31H ALINIR (ADRESİN DÜŞÜK BYTI) 0A ALINIR (ADRESİN YÜKSEK BYTI) DC=0A31H AKÜMÜLATÖRDEKİ 07AH İLE 0A31H ADRESİNDEKİ 02FH VERİLERİNİ TOPLA (BU ARİTMETİK İŞLEM ALU TARAFINDAN YAPILIR) VE SONUCU A’ YA YAZ. A=0A9H A’ NIN İÇERİĞİNİ DATA BELLEĞE YAZ. A’ NIN İÇERİĞİ DEĞİŞMEZ. A’ DAKİ SONUC DC’ NIN İÇERİĞİNDE EN SON 0A31H OLDUĞUNDAN BU ADRESE YAZILIR. İşlem bittiğinden bundan sonra programın ya sonlandırılması ya da dallandırılması gerekmektedir çünkü son emirden sonra 0409H’ dan itibaren emir kodu yazılmamıştır. JMP veya RESET ile bu işlem gerçekleştirilebilir.
0A30H
07AH
0A31H
02FH
JMP ile PC istenilen program bellek adresiyle yüklenerek çalışma akışı değiştirilebilir. Örneğin JMP 0400H ile PC=0400H olur yani tekrar başa dönülerek program bir kez daha koşulmuş olur ve dikkat edilirse eğer sistemin enerjisi kesilmezse aynı program bloğunun sonsuza kadar yinelemeli çalışması söz konusudur. Bu durumda 0400H ile 0409H arasında bir sonsuz döngü oluşturulmuş olur ki aynı emir kodlar aynı verileri aynı bellek bölgelerine saniyede binlerce kez yazarlar veya okurlar yani aynı işlemler tekrar edilmiş olur. Bu çok fazla istenen ve sıhhatli olan bir durum değildir. Bu yöntem yerine: 1) Sonlandırma: 0409H---JMP, 040AH---0409H ile programın sadece bir kere çalışması sağlanmış olur. Üst üste veri yazma okuma ve aynı kodların tekrar tekrar çalışması böylece engellenmiş olur. 0409H 040AH
JMP 0409H
2) Reset: sistem reset yapılarak 0000H adresine atlama yapılmış olut. Bu durumda yukarıdaki programın tekrar başlaması için PC=0400H yüklemesi tekrar yapılmalıdır. 0000H 0001H
JMP 0400H
11
12
D3 3) EMİR İCRASI CPU saat kontrollü bir lojik devre olduğundan çalışması için mutlaka bir saate ihtiyaç duyar. Bundan dolayı her CPU’ nun bir veya birden fazla saat girişi olmalıdır. Sağlıklı bir saat işareti için (Ф) gerekli olan saat devresi CPU’ nun içinde olabileceği gibi dışından da sağlanabilir. Tüm işlemler saatle eşzamanlı olarak yapılması gerektiğinden CPU emirlerinin icrasında da saatle yapılan bir zamanlama söz konusudur. Bir CPU emri birden çok makine periyodundan oluşur. Her makine periyodu ise birden çok saat periyodundan oluşmaktadır. Makine Periyodu: Bütünlük arz eden en küçük işlem dilimine makine periyodu adı verilir. Örneklerde verilen 9C emrinin alınması sonra program bellekten 30 ve 0A sayılarının alınarak adres oluşturulması ve data belleğin bu adresinden verinin alınması işlemlerinin her biri buna örnektir. Bir CPU’ da bulunması gereken uçlar:
A15
---D7 READ WRİTE ---
Emir ve Data Alma (Okuma):
D0 D1 CPU
VCC GND Ф A0 A1 -------
Genellikle değişmekle birlikte VCC=+5V ve GND=0V dur. D0……D7 8 bitlik data bus, A0 A1 …..A15 16 bitlik adres busdır. Read, Write kontrol hatları olup bunların dışında daha başka kontrol hatları da CPU’ larda olmalıdır.
Ф PC İçeriği A0-A15
Adres Kararlı Geçiş
READ (okuma)
D0-D7
Emir kodu Emir Kodu Alma Periyodu
Program bellekten emir kodunun alınması için PC’ nin içeriği ile adres bus sürülerek program bellek adreslenmiş olur. Bu işlem yapılırken önce adres, adres busa gönderilerek bu busdan faydalanacak olan cihazlar için gereken zaman sağlanmış olmalıdır. 12
13
Read aktif olursa (alçak seviye) adres busa yerleşen adresle adreslenen program bellekteki bilgi okunur ve data busa yerleştirilir. Bundan dolayı CPU’ da Read ucunun bulunması gerekmektedir. Read ucu alçak aktif seviyede iken örnekleme yapılır. Örnek sayısı kontrol biriminin içindeki mikro programların (mikro emirlerin) sayısı kadardır.
Ф PC İçeriği Emir Kodu Adresi
A0-A15
DC İçeriği Data Adresi
Geçiş
READ (okuma)
D0-D7
Emir kodu Emir Kodu Alma Periyodu
Data
Data Alma Periyodu
Yukarıda ise basit bir emir kodu alma ve data alma (okuma) işlemine olan ait zamanlama periyodları görülmektedir. İşlemler sonucunda emir kodu emir kaydedicisine, data akümülatöre yerleştirilir. Data alma periyodu esnasında; CPU önce PC’ nin içeriğini adres busa yerleştirir. Adresin önceden gönderilmesinde yarar vardır. Adres adres busa yerleştikten sonraki belli bir noktada read aktif yapılır. Aktiflik süresi de yeterli olmalıdır. Sürenin sonuna doğru read seviyesi örneklenir ve ilgili mikro programlar için gerekli olan mikro emirler sırasıyla icra olur ve bilgi akümülatöre konur. Emir kodu alma ile data alma arasıda bir fark yoktur. Fazladan bir kontrol hattına da gerek duyulmaz Genellikle bir emir için mutlaka en az iki periyoda gerek duyulur. İlki emir alma işlemi için, ikincisi de data ve CPU dışındaki işlemler içindir. Aslında bir makine periyodu birçok saat periyodundan oluşmakla birlikte verilen örneklerde kolaylık olsun diye bir saat periyodunda gösterilmiştir.
Emir Alma ve Data Yazma: 13
14
Ф PC İçeriği Yazma Emir Kodu Adresi
A0-A15
DC İçeriği Yazılacak Data Adresi
Geçiş
READ (okuma)
WRITE (Yazma)
D0-D7
Emir kodu Emir Kodu Alma Periyodu
Data
Data Yazma Periyodu
Bu durumda belleğe yazma işlemi için CPU’ nun WRITE hattına ihtiyacı vardır. Emir almada read işareti yazma işini yapacak emirle ilgili olacak olan datadan önce aktif olur. Yazmada is yazılacak datanın adresi alındıktan sonra yani DC bu adresle sürüldükten sonra write aktif edilir yani DC nin adreslediği data belleğe veri yazılır. Bu işlem sırası bilginin kararlı olması için gereklidir. Write seviyesi süresince data yazılır. Yukarıda zamanlamaları verilen ve basit olarak bahsedilen işlemler için günümüz mikroişlemcilerinde daha fazla sayıda kontrol ucu ve yardımcı işaretler devreye girerek emir okuma, data okuma ve data yazma işlemleri gerçekleştirilir.
14
15
D4
4) INTEL 8086 MIKROİŞLEMCİSİ
Daha önceki bölümlerde basit bit 8-bit mikroişlemcinin temel bazı özelliklerine değinilmişti. Bir mikroişlemci aslında tüm işlemlerden sorumlu merkezi işlem birimidir (CPU). Bir mikroişlemcinin en temel görevleri; bellekten komut okuma, komutun kodunun çözülmesi ve komutun işlevini yerine getirilmesidir. Bunların yanı sıra bulunduğu sistemdeki cihazların kontrol edilmesi, sisteme aritmetik ve lojik işlem yapma olanağı sağlamak, giriş/çıkış birimleri arasında veri transferinin sürekli sağlanması ve çevre birimlerinin hizmet istek sinyallerine cevap vermek de başlıca görevleri arasındadır. Bundan sonraki konularda günümüz modern kısaca x86 mikroişlemcilerinin (….,Pentium, 80486, 80386, 80286, 80186/188) 16-bit çekirdeğini oluşturan 8086 mikroişlemcisi üzerinde durulacaktır. İç Mimari: Aşağıda x86 ailesinin 16-bit çekirdek mimarisinin basit bir gösterimi verilmiştir. Buna göre mikroişlemci iki temel ayrı çalışma birimine sahiptir; Yürütme birimi (Execution Unit-EU) ve Yol arabirimi (Bus Interface Unit-BIU). EU komutları yorumlamakta ve yürütmektedir. BIU ise yol işlmlerini (işlem kodu okuma, operand okuma ve griş/çıkış cihazlarıyla haberleşme gibi) yerine getirir.
Yürütme Birimi: EU,komut çözme ve komutlar yürütme için bir kontrol birimine, ALU’ ye, genel amaçlı saklayıcılara (AX,BX,CX,DX), işaretçi (BP, SP) ve indis(DI, SI) saklayıcılar ile bayrak (Flags) saklayıcısına sahiptir. Kontrol birimi, BIU tarafından komut kuyruğuna (Instruction queue) sırasıyla yerleştirilen makine dilindeki komutların yorumlanmasını, kodunun çözülmesi ve yürütülmesi için gereken ve işlemleri kontrol eder. EU hafızadan bir operanda ihtiyaç duyarsa veya yazmak isterse bu işi BIU’ ya yönlendirir. Bu sırada BIU için gereken fiziksel hafıza adresi hesaplama işlemlerini de sağlar. 15
16
Yol Arabirimi: BIU; bütün dış yol işlemlerini kontrol eden bir kontrol birimine, EU’ nun yürüteceği komut byte’ larını tutan komut kuyruğuna, fiziksel hafıza adresleri üretmek için bir toplayıcıya, 4 segment saklayıcısına (CS, DS, SS, ES), komut işaretçisine (IP) sahiptir. Anlaşılacağı gibi BIU hafıza ve Giriş/çıkış işlemleri dahil bütün dış yol işlemlerinden sorumludur. BIU komut kuyruğuna yerleştirmek üzere örneğin 8086 mikroişlemci için 6 byte komut kodunu önden okuyabilir. Komut kodunun bu şekilde önden okunması BIU ve EU birimlerinin paralel çalışmasına imkan verir. Önceden okunan komutlar icra edilirken yenilerinin bu esnada okunabilmesi işlemcinin performansını arttırır. Bu tarz çalışan mikroişlemci mimarisine işhatlı mimari (pipelined architecture) adı verilir. Aşağıda bu özelliği bulunmayan 8-bit 8085A mikroişlemcisi ile 8086 mikroişlemcisinin yol zamanlaması gösterilmektedir.
Şekil b’ de birinci komutun icra edilirken ikinci komutun okunması (Fetch2) aynı anda paralel yapılmaktadır. Aynı şey peşi sıra gelen komutlar içinde geçerlidir ve bu sayede işlemcinin veri işleme hızı arttırılmaktadır. Oysaki klasik mimariye sahip bir mikroişlemcide kod çözümü yapılırken yol boşta kalmakta bir iş yapılamamaktadır. Bellek ve Adresleme Mimarisi ( Lojik ve Fiziksel Bellek, Segment ve Ofset kavramı): 8086 mikroişlemci 20 bit adres yolu ile 1048576 (1M) byte bellek hücresi adresleyebilmektedir. Lojik bellek genelde yazılım tarafından programcıya görülen hafızaya denir. 8086 işlemci 16-bit mimarisine sahip olmasına rağmen lojik bellek genişliği yine 8-bit’ tir. Ancak saklayıcı genişliği (16-bit mimari) ve fiziksel bellek tasarımı sayesinde 16bit yazma ve okuma yapılabilir. 8086 işlemci 00000H-FFFFFH arasında 1M byte adres uzunluğunda 8-bit yani 1 byte lojik belleğe sahiptir. Mikroişlemci ile adreslenebilen 16-bit (2 byte) bellek kelimesi (word) herhangi bir byte adresinden başlar ve 16
17
peş peşe iki byte işgal eder. Yani programcı için bellek her zaman 8-bit’ tir fark sadece donanım tasarımındadır.
Fiziksel bellek ise daha çok donanım tasarımcısı tarafından görülen gerçek hafıza yapısını tanımlar ve lojik hafızadan farklı olabilir. Yanda görülen fiziksel bellek yapısının avantajı byte veya word verisinin doğrudan adreslenebilmesinde yatar. 8086 işlemci bu sayede ve veri adresinin çift olması sağlandığında 16-bit bir veriyi bir işlemde okuyup yazabilmektedir. 8-bit işlemci olan 8088 16-bit veri aktarımı için ancak 2 okuma veya yazmaya ihtiyaç duyar. Yani 8086 16-bit veriye iki kat daha hızlı erişir.
16-bit veri yolu (data bus) genişliğine sahip olan 8086 işlemci 20 bit adres yolu (adres bus) genişliğine sahiptir. Ancak bellek adresleme işlemleri için gereken bir 20 bit saklayıcısına sahip değildir. Bu durumda çözüm 16 bit saklayıcıların adres verilerinin aşağıdaki şekilde gösterildiği gibi kullanılmasıyla elde edilir.
İşte bu yapı segment ve ofset kavramlarını doğurur. 8086 işlemcisinde bellek erişimi segment saklayıcılar ile sağlanır. Her segment saklayıcı 20-bit adresin 16-bit kısmını tutar. Bu 16-bit adresin düşük değerli bölümüne 0H (00002) eklenir. Sonrada 16-bit bir ofset(indis) bu adresle toplanarak 20-bit gerçek adres elde edilir. Bu işleme lojik adresin fiziksel adrese çevrilmesi denir. segment: Belleğin daha kolay adreslenebilmesi amacıyla bölündüğü düşünülen bellek kesimleridir. Diğer bir deyişle her bir bellek hücresini küçük bir kutucuk olarak düşünürsek segment kavramını da bu küçük kutucuklardan oluşan büyük kutucuklar olarak düşünebiliriz. Yani Segment adresin setlenmesi ile bu büyük kutucuklardan birisinin başlangıç adresi setlenmiş olur. ofset: Segment içerisinde belleğin her bir hücresi olarak düşünebilir. Segment adresin setlenmesinden sonra bu segment içindeki veya bu adresten sonra ulaşılmak istenen bellek hücrelerinin her biridir. Yani yukarıda bahsi geçen büyük kutucukların içindeki her bir küçük kutucuklardır. 17
18
örnek: Ulaşılması amaçlanan bellek hücresi için segment adres: c230H ve ofset adresi: 1200H ise gerçek adres: segment adres x 10h + ofset adres , c230hx10h+1200h= c3500h olarak bulunur. Segment adresler ileride de görüleceği gibi mikroişlemcinin ilgili saklayıcılarında tutulurlar, ofset’ ler ise değişik saklayıcılardan gelebilir. Kod segment genelde program ve veri alanı olarak kullanılabildiği gibi esasında program kodlarının bulunduğu bellek alanıdır. CS saklayıcısı bu alanın başlangıç adresini işaret eder. 8086 tarafında yürütülecek bir sonraki kodun adresi CSx10H+IP ile elde edilir. IP komut işaretçisi olup kod segmentin ofset adresini içerir. DS saklayıcısı veri alanının başlangıç adresini işaret eder. Verinin Ofseti veya ofseti içeren diğer saklayıcılar DSx10H değerine eklenerek verinin gerçek adresi elde edilir. Her segment 16-bit ofset adresten dolayı 64K byte’ lık bir bellek bloğunu içerir.
Segment’ li bellek yapısı sayesinde kod, veri ve gerekli diğer bellek alanları farklı hafıza bölgelerinde çalışabilmektedir. Örneğin DS saklayıcısına farklı bir adresi işaret eden adres yazılarak program ve data bellek alanları birbirinden kolayca ayrılabilir. CS her zaman program kodlarının bulunduğu taban adresi içerir dolayısıyla 8086 mikroişlemci CS’ nin işaret ettiği adresten itibaren emir kodlarını almaya başlar. Segment’ li bu yapı sayesinde sadece CS değiştirilerek değişik bellek alanlarındaki programlar çalıştırılabilir veya program kodları belleğin istenilen yerine yazılarak ve CS’ nin bu alanı göstermesi sağlanarak çalıştırılabilir. Bu ise programlara tekrar yerleştirilebilirlik (relocatable) özelliğini ve gücünü katar. Bu sayede programlar belleğin her hangi bir yerinde çalıştırılabilmektedir. 5) 80886 MİKROİŞLEMCİDE SAKLAYICI VEYA KAYDEDİCİ (REGISTER) YAPISI: Bir mikroişlemcinin programlanması bu işlemcinin dahili kaydedicilerinin yapısının tam olarak anlaşılmasını gerektirir. Bu bölümde bu yapıdan ve belleğin segment kaydediciler ve offset adresler kullanılarak nasıl adreslendiği açıklanacaktır. INTEL ailesi bir 8086 mikroişlemcinin (Günümüz PC’ lerinde yaygın olarak kullanıla gelen işlemcilerin atası saylır) dahili kaydedicileri şekilde gösterilmektedir. Programcıya açık olan bu dahili kaydedicileri üç gurup altında toplayabiliriz: Genel Amaçlı Kaydediciler, Pointer (gösterici) ve Index (işaret) kaydediciler, Segment Kaydediciler. Bunlara ek olarak bir diğer gurup olarak da APU’ nun (aritmetik işlem birimi veya ALU aritmetik ve lojik birimi) yaptığı 18
19
işlemler hakkında çeşitli bilgilerin veya koşulların gösterildiği Flag (bayrak) Kaydedici’yi sayabiliriz. 32 bitlik kaydediciler EAX, 16 bitlik kaydediciler AX, 8 bitlik kaydediciler AH veya AL biçiminde gösterilmektedir. Burada AX örnek teşkil etmesi bakımından bir genel amaçlı kaydedicidir. AH ile AX’ in yüksek byte’ ı ve AL ile de AX’ in alçak byte’ ı gösterilmektedir.
Genel Amaçlı Kaydediciler: Genel amaçlı kaydediciler programcının isteğine bağlı olarak her hangi bir şekilde kullanılabilir. Bunların her biri şekilde gösterildiği gibi 32-bit (EAX, EBX, ECX, EDX), 16-bit (AX, BX, CX, DX) ve 8-bit (AH, AL, BH, BL, CH, CL, DH, DL) kaydediciler olarak kullanılabilir. Aynı zamanda bazı emirler, genel amaçlı kaydedicileri özel işlemler için de kullanırlar ve bu yüzden dolayı da her birine değişik bir isim verilmiştir. AX (Accumulator): Aritmetik veya lojik işlemlerden sonra geçici sonuçların tutulmasında kullanılır. EAX, AX, AH, AL formlarında kullanılabilir. BX (Base): Belleğin her hangi bir lokasyonunda bulunan bir datanın base (offset) adresinin tutulmasında kullanılır. EBX, BX, BH, BL formlarında kullanılabilir. CX (Count): Belirli emirlerin icrası için sayma sayısının tutulduğu yerdir. Örneğin kaydırma ve döndürme işlemleri için gereken kaydırma sayısı CL’ de veya LOOP emri ile icra edilen döngünün sayısı CX, veya ECX kaydedicisinde tutulur. ECX,CX,CH,CL formlarında kullanılabilir. DX (Data): Genel amaçlı kullanımının yanında; aynı zamanda 16 veya 32-bit çarpma işleminden sonra çarpımın en anlamlı kısmının tutulmasında, bir bölme işleminden önce 19
20
bölünenin en anlamlı kısmının tutulmasında ve en önemlisi de I/O işlemlerinde değişken I/O port numarasının tutulmasında kullanılır. EDX,DX,DH,DL formlarında kullanılabilir. D5 Pointer ve Index Kaydediciler: Bu tip kaydedicilerin genel amaçlı bir yapıya sahip olmalarının yanında daha çok sıklıkta bir çok emir için, mevcut segment içrerisinde olmak üzere işlenen datanın tutulduğu bellek lokasyonunu göstermek (pointing) veya işaret etmek (indexing) için kullanılır. SP (Stack Pointer): LIFO (last in first out, son giren ilk çıkar) organizasyonuna sahip Stack (yığın) bellekteki dataların adreslenmesinde kullanılır. PUSH ve POP emirlerinin icrası esnasında veya bir altprogramın çağrıldığı CALL emrinin icrasında veya bir altprogramdan ana programa geri dönüş yapıldığı sırada SS ile birlikte yığın belleğin adreslenmesinde kullanılır. ESP,SP formlarında kullanılabilir. BP (Base Pointer): Genel amaçlı bir pointer kaydedici olmakla birlikte daha çok Stack bellekteki bir veri dizisini adreslemekte kullanılır. EBP,BP formlarında kullanılabilir. SI (Source Index): Genel amaçlı bir pointer kaydedici olmakla birlikte daha çok String komutlarında kaynak (Source) verinin dolaylı olarak adreslenmesinde kullanılır. ESI,SI formlarında kullanılabilir. DI (Destination Index): Genel amaçlı bir pointer kaydedici olmakla birlikte daha çok String komutlarında hedef (Destination) verinin dolaylı olarak adreslenmesinde kullanılır. EDI,DI formlarında kullanılabilir. IP (Instruction Pointer): Daima, mikroişlemci tarafından icra edilecek olan bir sonraki emrin adreslenmesinde kullanılır. Bir sonraki emrin gerçek fiziksel adresi CSx10h kod segment adresine IP ofset adresinin eklenmesi ile bulunur yani CSx10h+IP’dir. EIP, IP formlarında kullanılabilir. Veriler bu beş kaydediciden dördü ile mevcut segment içinde ofsetleri belirlemek amacıyla 16-bit formunda daha sık adreslenebilirler ancak IP kullanarak asla adreslenmezler veya adreslenemezler. Bunun nedeni hakkında ne söyleyebilirsiniz. FLAGS Kaydediciler: Bayrak (Flag) kaydediciler hem mikroişlemcinin durumunu hem de onun çalışmasının kontrolünü gösterirler veya tutarlar. Bu kaydedicideki bitler bir çok aritmetik veya lojik emrin icrasından sonra değişir, bazıları ise mikroişlemci özelliklerinin kontrol edilmesinde kullanılır. 8086 flags kaydedici 16-bit genişliğinde olup yukarı doğru uyumludur. Bu anlamda her yeni x86 mikroişlemci bir öncekini aynen ihtiva eder. Aşağıda önce 8086 mikroişlemciye ait bayrak kaydedici FLAGS ve sonra da 80486 mikroişlemciye ait 32-bit EFLAGs (Extended FLAG register) bayrak kaydedici ve ilgili bitleri gösterilmektedir.
20
21
31
30
29
28
27
26
25
24
23
22
21
20
19
18 17 16 15 14 13 12 11 AC VM RF NT IOP IOP O 1 0
10 D
9 I
8 T
7 S
6 Z
5
4 A
3
C (Carry): toplama işleminden doğan elde veya çıkarma işleminden doğan ödünç için kullanılan bittir. Bu bayrak biti aynı zamanda bazı programlar için hata koşullarını, özel işlem durumları ve sonuçları ile ilgili boolean bayrak olarak kullanılır. P (Parity): Bu bayrak tek eşlik (Odd Parity) işlemi için lojik 0, çift eşlik (Even Parity) işlemi için lojik 1 değeri lır. Eşlik çift veya tek olarak olmak üzere bir byte veya word içinde yer alan 1 ‘ lerin sayısıdır. A (Auxilary Carry): Yapılan bir işlem sonucunda 3. ve 4. bit pozisyonları arasında olan (en sağdai bit 0. bittir), toplamadan sonraki eldeyi ve çıkarmadan sonraki ödüncü belirtir. Özellikle BCD toplama (DAA) ve çıkarma (DAS) emirleri bu biti test ederek (3. ve 4. biti arasında doğan yardımcı elde) AL’ nin değerini ayarlarlar. Bunun haricinde mikroişlemci tarafından kullanılmaz. Z (Zero): Aritmetik veya lojik işlemlerden sonra sonucun sıfır olması halinde lojik 1, diğer durumlarda lojik 0 olur. S (Sign): Toplama veya çıkarma işlemlerinden sonra sonucun aritmetik işaretini belirtir. Sonuç negatif ise lojik 1, pozitif ise lojik 0 olur. Bayrakları etkileyen her hangi bir komuttan sonra en anlamlı bit S bit’ ine yerleştirilir. I (Interrupt): Mikroişlemcinin INTR (Interrupt request, kesme gereksinim) giriş bacağının çalışmasını kontrol eder. I=1 ise INTR bacağı yetkilendirilir yani dışarıdan CPU’ ya kesme isteği bildirilebilir. I=0 ise INTR bacağına dışarıdan kesme isteği bildirilse bile mikroişlemci bunu dikkate almaz. Bu bitin durumu STI (Set Interrupt)ve CLI (Cear Interrupt) emirleri ile kontrol edilir. D (Direction): String emirleri esnasında DI ve/veya SI kaydedicileri için; D=1 ise kaydediciler otomatik olarak azaltılırlar, D=0 için arttırılırlar. Bir dizi boyunca tekrar edilen işlemler için artmanın veya azalmanın yönünü kontrol ederler. STD (Set Direction) ile lojik 1, CDT (Clear Direction) ile lojik 0 yapılır. O (Overflow): İşaretli sayıların aritmetik işlemleri sırasında oluşan sonuç hedef kaydedicinin veya belleğin alabileceği kapasiteyi aşarsa lojik 1 olur. Örneğin 8-bit işaretli kaydedicilerle yapılan; 7fH (+127) ile 01H (+1) sayısı toplandığında sonuç 80H (-128) olacaktır. Bu durumda işaretli toplama için taşma olmuş demektir ve O biti lojik 1 olur. İşaretsiz sayılar için bu bayrağı dikkate alınmaz. Segment Kaydediciler: Segment (kesim) kaydediciler mikroişlemci içindeki diğer kaydedici yardımı ile bellek adreslerinin üretilmesi ve belleğin adreslenmesi maksadıyla kullanılırlar. CS (Code): Kod Segment, programlar tarafından kullanılan diğer program veya altprogramların oturduğu bellek bölgesidir. CS kodun bulunduğu bellek bölgesinin başlangıç adresini tanımlar. 21
2 P
1
0 C
22
DS (Data Segment): Data Segment, program tarafından kullanılan verilerin bulunduğu bellek bölgesidir. DS verilerin bulunduğu bellek kesiminin başlangıç adresini tanımlar. Bu adrese ilgili verinin ofset adresinin veya ofset adresi içeren diğer bir kaydedicinin içeriğinin eklenmesi ile bu dataya erişilmiş olur. ES (Extra Segment): Özel bazı emirlerin (String emirleri) kullandığı ek veri kesimidir. SS (Stack): Stack (Yığın) Segment, Stack tarafından kullanılan bellek bölgesini tanımlar. Yığın kesiminde o anki kullanılabilir bellek giriş noktası (özellikle yazma: PUSH veya okuma: POP komutları için) adresi SP kaydedicisi tarafından belirlenir. BP (Base Pointer) kaydedicisi de aynı zamanda stack segment içindeki bir veriyi adreslemede kullanılır. FS ve GS kaydedicileri de çeşitli işlemler için kullanılan ek segment kaydedicileridir. Aşağıda ilgili segment kaydedicilerin adreslenmesi esnasında kullanılan segment ve ofset kaydediciler gösterilmiştir. Her hangi bir bellek kısmı adreslenirken belleğin türüne göre (program bellek, data bellek ....) segment adres o bölgeyi adresleyen kaydediciye yazılır, bu yeni değer veya daha önce yazılmış olan değer kullanılarak belleğin ilgili segmenti seçilmiş olur. Aşağıda her segment veya kaydedici için kullanılabilecek offset kaydediciler de gösterilmektedir. Bunlara da belleğin offset adresi yazılarak bu işlem tamamlanmış olur. Segment CS SS DS ES
Offset EIP,IP ESP,EBP veya SP,BP EAX,EBX,ECX,EDX,EDI,ESI veya bunların 16-bitlik formları,8-bit,16-bit veya 32-bit bir sayı EDI,DI
Sonuç olarak belleğin her bölgesi için gerçek fiziksel adres SEGMENTx10h+OFSET ifadesiyle hesaplanabilir. 6) VERİ YAPILARI: Mikroişlemci programlamada iyi bilinmesi gereken ASCII, BCD, işaretli
(signed) 8-bit (byte), 16-bit (word) tamsayılar (integers), işaretsiz (unsigned) 8-bit, 16-bit tamsayılar; kısa (short) ve uzun (long) gerçek sayılar (floatin point numbers-kayan noktalı sayılar) ASCII KOD TABLOSU: Aşağıda kullanılan standart 7 bitlik karakter tablosu verilmiş olup günümüz kişisel bilgisayarlarında genişletilmiş (7FH-FFH’ a kadar olan kodlarla birlikte) ascii tablosu kullanılır SAĞ
22
23
BASAMAK
SOL BASAMAK
0X 1X 2X 3X 4X 5X 6X 7X
X0
X1
X2
X3
X4
X5
X6
X7
X8
X9
XA
XB
XC
XD
XE
XF
0 @ P ` p
! 1 A Q a q
" 2 B R b r
# 3 C S c s
$ 4 D T d t
% 5 E U e u
& 6 F V f v
' 7 G W g w
( 8 H X h x
) 9 I Y i y
* : J Z j z
+ ; K [ k {
, < L \ l |
= M ] m }
. > N ^ n ~
/ ? O _ o •
BCD (Binary Coded Decimal): Bellekte paketlenmiş ve paketlenmemiş halde tutulurlar. Pakelenmiş BCD, iki BCD hanenin tek bir byte içine yazılmasıyla oluşur. Paketlenmemiş BCD ise her hane tek bir byte içine yazılmasıyla oluşur. Sayı 23 237
Paketlenmiş 00100011 00000010 00110111
Paketlenmemiş 00000010 00000011 00000010 00000011 00000111
BYTE: Byte veriler bellekte işaretsiz veya işaretli olmak üzere iki formatta tutulurlar. Aşağıda her iki durum için bit değerleri belirtilmiştir. İşaretsiz Byte Veri 27 128
26 64
25 32
24 16
23 8
22 4
21 2
20 1
22 4
21 2
20 1
İşaretli Byte Veri -27 -128
26 64
25 32
24 16
23 8
Görüldüğü gibi aralarındaki tek fark en anlamlı bitin (en sağdaki bit) yani işaret bitinin ağırlığından kaynaklanmaktadır. Örneğin 80H sayısı işaretsiz olarak 128 değerine sahipken, işaretli olarak -128 değerine sahip olmaktadır. 81H sayısı işaretsiz olarak 129 değerine sahipken, işaretli olarak -127 değerine sahip olmaktadır. Görülebileceği gibi işaretli negatif sayıların en anlamlı bit değerinin -128 olması aslında bu sayının işaretsiz pozitifinin 2’ li tümleyeninden elde edilmesinden kaynaklanır. Yani negatif sayılar 2’ li tümleyen halinde kullanılırlar. WORD: Byte veri için söylenenler word veri içinde geçerlidir. Bellekte düşük byte yüksek byte’ dan önce yer alır. Örneğin 1000H adresin de yer alan 1234H word sayısı için 1000H adresinde 34H ve 1001H adresinde 12H yerleşir. 23
24
REAL NUMBERS (Gerçek Sayılar): x86 mimarisinde gerçek sayılar veya kayan noktalı sayılar (floating point numbers) iki parça halinde ifade edilir: bir mantissa (normalizeli taban) ve bir exponent (üs). Bellekte 4-byte veya 8-byte veya daha fazla genişlikte tutulurlar. Aşağıda 4-byte; 1-bit işaret biti, 24-bit mantissa, 8-bit exponent için olmak üzere short real bir kayan noktalı sayının gösterimine yer verilmiştir. Bu tanım 33-bit gerektirmesine rağmen gösterim 32-bit’ tir. Bunun nedeni mantissanın gizli 1-bit içermesidir dolayısıyla 23-bit ile ifade edilebilmektedir çünkü bu bit normalize edilen gerçek sayının soldaki ilk bitidir. Sayı normalize edildiğinde değeri 2’ den küçük ve 1’ den büyük olacak şekilde tekrar düzenlenir. Örneğin +12 sayısı ikili (binary) olarak 1100B ile gösterilir. Normalize edilmiş hali 1.1x2+3 olacaktır. 31 S
24
23
16
15
Excess-127 exponent
8
7
0
23-bit mantissa
Exponent ise 4-byte short real sayı için artık-127 (excess-127), 8-byte long real sayı için artık1023 (excess-1023) şeklinde tutulur. Dolayısıyla 2+3 üssü 127+3= 130 (82H) olarak short real sayı için ve 1023+3=1026 (402H) long real sayı için ifade edilir. Aşağıda değişik sayılara ilişkin 4-byte short real sayının kayan noktalı formatta gösterim örnekleri yer almaktadır. Decimal (10’lu) +12 -12 +100 -1.75 0.25 0.0
Binary (2’li) 1100 1100 1100100 1.11 0.01 0.0
Normalized Sign (işaret) 1.1x2+3 0 -1.1x2+3 1 1.1001x26 0 0 -1.11x2 1 1.0x2-2 0 0.0 0
Artık üs (excess 127) 10000010 10000010 10000101 01111111 01111101 00000000
Mantissa 1000000 00000000 00000000 1000000 00000000 00000000 1001000 00000000 00000000 1100000 00000000 00000000 0000000 00000000 00000000 0000000 00000000 00000000
8-byte’ den oluşan long real sayılar ise aynı yöntemle ancak bu sefer 1-bit işaret, 11-bit excess-1023 exponent ve 53-bit mantissa olmak üzere toplam 64 bit ile kayan noktalı formatta gösterilir ve ifade edilir. 7) 16-BIT x86 ÇEKİRDEĞİNİN ADRESLEME MODLARI: Adresleme kavramı mikroişlemcinin veri ya da programlara erişmek için sürekli kullandığı bir kavramdır. MOV komutu ve değişik kullanım şekilleri veri adresleme modlarının açıklanmasında, program icrasının ve akışını değiştiren CALL ve JMP komutları program adresleme modlarının açıklanmasında, PUSH ve POP gibi komutlar ise yığın adresleme modlarının açıklanmasında kullanılacaktır. 24
25
MOV komutu kaydedici veya saklayıcılar arasında, saklayıcılarla bellek arasında 8, 16, 32-bit veri atarımı yapabilen ve çok sık kullanılan bir komuttur.
Yukarıdaki komutta kaynak olan BX içindeki 2-byte (word) veri hedef olan AX içerisine transfer edilir. Bu komutta kaynak hiçbir zaman değişmez. Veri Adresleme Modları Saklayıcı Adresleme (Register Addressing): Yandaki tabloda bazı değişik saklayıcı adresleme kullanım şekilleri gösterilmektedir. Komutlarda saklayıcılar aynı genişliğe sahip olmalıdırlar karışık kullanıma izin verilmez. Segment saklayıcıları arasında aktarımına da izin verilmez.
adres
CS saklayıcısı mov komutu değiştirilemez. NEDENİ?????????
ile
İvedi Adresleme (İmmediate Addressing): Verinin program bellekte hexadecimal opcode içinde yer aldığı moddur. Yani veri bellekte işlem kodunu takip eden byte veya byte’ larda yer alır. Yandaki tabloda bazı değişik ivedi adresleme kullanım şekilleri gösterilmektedir.
D6 Doğrudan Adresleme (Direct Addressing): Doğrudan veri adresleme iki şekilde yapılır. 1)doğrudan bir hafıza hücresi ile AL veya AX arasında gerçekleşen doğrudan adreslemeli veri adreslemesi MOV AL, DATA komutunu ele alacak olursak ;DS veri segmentinde bulunan ve ofset adresi DATA sembol harfleri ile gösterilen 8-bit veri AL’ ye kopyalanır. DATA ile sembolize edilen ofset 1234H ise komut mov al, [1234H] komutuna eşit olacaktır. Assembly programlama da daha çok adreslerin bu şekli yerine ofset adresleri temsil eden bu tip sembol adresler 25
26
kullanılır. Assembler bu tip sembolik adresler (DATA) derleme esnasında sayılara ofsetlere çevirir. Aşağıda bu komut için adresleme ve adreslenen veri hücresine erişim gösterilmiştir.
Aşağıdaki tabloda ise AX, AL ile hafıza arasında yapılan veri aktarımındaki doğrudan adreslemeye örnekler verilmektedir. Çok sık kullanılan bu komutlar 3-byte uzunluğundadırlar. Hafıza ile diğer saklayıcılar arasında veri transferi yapan diğer komutlar 4byte ya da daha fazla uzunluktadır ve yer değişim (displacement) adreslemesi kullanırlar.
2) x86 komut kümesinde yaklaşık her komut için kullanılabilen yer değişim (displacement) adreslemesi. Doğrudan adreslemenin bir benzeri olup komut uzunluğu 3-byte yerine 4-byte dir. Örneğin MOV CL, [3000H] komutu 4-byte iken MOV AL, [1234H] 3-byte olarak derlenir. 0000 A0 1234 MOV AL, [1234H] 0003 8A 0E 3000 MOV CL, [3000H] Aşağıda bu adresleme ile çalışan komut örnekleri verilmiştir.
26
27
Saklayıcı Dolaylı (Indireck Addressing): Hafızanın herhangi bir yerindeki veri BX, BP, DI, SI saklayıcılarıyla adreslenir. Bu yolla kullanılan saklayıcılar mevcut segmentteki ofset adresleri içermiş olmaktadırlar. BX, DI, SI ile saklayıcı dolaylı veya diğer tip adresleme modlarında segment veri segmenttir yani DS’ dir. BP kullanılmış ise segment olarak yığın yani SS seçilmiş demektir. Aşağıda saklayıcı dolaylı adreslemeye örnek komut ve yapılan adreslemenin işleyişi gösterilmektedir.
Şimdiye kadar ki açıklamalardan da anlaşılacağı gibi [..] operatöre daima dolaylı adresleme için kullanılır. Ayrıca derleyici tarafından sayısal adrese dönüştürülen sembolik adres (örnek mov al, DATA) ile mevcut çalışılan segment içinde gösterilen ofset adrese OFFSET derleyici bildirisi ile erişilir. MOV AX, OFFSET DATA komutu ile DATA ile sembolik olarak ifade edilen verinin ofset adresi alınarak AX saklayıcısına kopyalanır. Dolaylı adresleme kullanırken bazı durumlarda hafızada işaretlenen veri uzunluğunun açık olarak belirtilmesi gerekir. Bunun için BYTE PTR, WORD PTR veya DWORD PTR derleyici bildirisi kullanılır. MOV AX, [DI] komutunda hedef 16-bit AX olduğundan DS’ de DI’ nin içeriği ile ofseti adreslenen veri de 16-bit olacaktır. MOV [DI], 10H komutunda ise 10H verisinin ne kadar genişlikte bir hafıza alanına yazılacağı belli değildir. Bunun için, örneğin MOV BYTE PTR [DI], 10H ile DI ile 1-byte hafızanın adreslendiği belirlenmiş olur.
TEKRAR:
MOV BX, OFFSET TABLO MOV CX, 50 IN AL, INPORT MOV [BX], AL
;TABLO’ nun ofsetini BX’ e kopyala ;Döngü için sayaç değerini yükle ;Giriş portunu oku ;Veriyi [BX]’ e kopyala 27
28
INC BX LOOP TEKRAR
;İşaretçiyi 1 arttır ;CX=0 oluncaya kadar döngüyü tekrar et
Burada TEKRAR: ifadesi ile LOOP döngüsü için bir geriye dallanma etiketi (Label) tanımlanmış olup aslında derleyici tarafından CS’ de ‘IN AL, INPORT’ komutunun ilk byte’ nın bulunduğu program bellek adresinin LOOP komutu (CX≠0 ise) ile geri dönüş için tekrar kullanılacağı (IP’ ye bu adres yazılarak Program bellek adreslenmiş olur) adresin belirlenmesine neden olur. LOOP ile programın çalışması yukarıda bahsedilen etiket ile belirlenen adresten tekrar sağlanır yani bir döngü kurulmuş olur. LOOP komutu döngünün her icrasında CX içeriğini 1 azaltır ve kontrol eder. Eğer CX=0 ise geri dallanma olmaz program LOOP komutundan sonra gelen komuttan devam eder. Döngüye girilmeden önce TABLO ofset adresi ile yüklenen BX saklayıcısının içeriği, her döngüde 1 arttırılarak porttan okunacak 50 adet verinin saklanması için gereken ardışık ofset adresler üretilmiş olur. Taban-artı İndis (Base Plus Indis addressing): Esasında saklayıcı dolaylı adreslemeden yola çıkılarak taban saklayıcılardan BX veya BP’ den birisi ile bir indis saklayıcısı (DI veya SI) kullanılarak yapılan adreslemedir. Taban saklayıcı çoğu zaman bir hafıza dizisinin başlangıç adresini ve indis saklayıcı da dizideki verinin göreceli pozisyonunu tutar. Aşağıdaki tablo çeşitli kullanım örneklerini göstermektedir.
Aşağıdaki komut örneği TABLO veri dizisinin 10 no’ lu elemanın 30 no’ lu pozisyonuna kopyalanması işlemini yerine getirir. MOV BX, OFFSET TABLO ;Diziye işaret et yani ofset başlangıç taban adresini al MOV DI,10 MOV AL, [BX+DI] MOV DI, 30 MOV [BX+DI], AL BX sabit taban olarak kalırken DI değişerek veriye işaret etmektedir. MOV AX, [BX+SI] komutu MOV AX, [BX][SI] şeklinde de kullanılabilir. Saklayıcı Göreceli Adresleme (Register Relative Addressing): Taban-artı-İndis adreslemede taban adresi saklayıcısı yerine bir değişim ve indis saklayıcısı kullanılır. 28
29
MOV TABLO[SI+2],CL ;CL DS alanında OFSET TABLO+SI+2’ ye kopyalanır.
MOV DI,10 MOV AL, TABLO[DI] ;OFSET TABLO+DI MOV DI, 30 MOV TABLO[DI], AL Bu kullanımda TABLO[DI] = [OFSET TABLO+DI] adresini üretmektedir. Taban Göreceli-artı-İndis (Base Relative-plus-Indis): Genellikle iki boyutlu hafıza dizilerinin adreslenmesinde taban saklayıcı+indis saklayıcı+değişim adresleri eklenerek kulanılır.
Aşağıdaki assembly programı ve sonrasındaki şekil taban göreceli-artı-indis adreslemenin çalışmasını açık şekilde göstermektedir. Hafızada DOSYA sembolik adresi ile bir dosyada saklanan ve bir çok kayıttan oluşan veri bloğu içerisinden istenilen kayıttan veri okunup başka bir kayıta kopyalanması: MOV BX, OFFSET KAYITA MOV DI, 10 MOV AL, DOSYA[BX+DI] MOV BX, OFFSET KAYITF MOV DI, 20 MOV DOSYA[BX+DI], AL
;KAYIT A başlangıç, ofset adresini, taban al ;DOSYA’ DAN KAYIT A’ YI OKU ; KAYIT F başlangıç, ofset adresini, taban al ;A’ NIN YENİ YERİ
29
30
Ölçeklenmiş İndisli Adresleme (Scaled Indıs Addressing): 80386 ve 80486 işlemcilerde kulanılan ve iki 32-bit saklayıcı gerektiren bir veri adresleme şeklidir. Aşağıdaki kullanım şekillerini inceleyiniz. MOV EAX, [EBX+4*ECX] MOV [EAX+2*EBX], CX MOV AX, [EBP+2*EDI+100H] MOV TABLO[EAX+2*EBX+10H], DX
PROGRAM HAFIZA ADRESLEME (PROGRAM MEMORY ADDRESSİNG): JMP ve CALL komutlarıyla yapılan program bellek adresleme üç ayrı yapıda karşımıza çıkar: doğrudan, göreceli ve dolaylı. Doğrudan Program Hafıza Adresleme: Bu tür adresleme programlama dillerindeki GOTO komutlarının kullanımına benzerdir. Programda dallanılacak program bellek adresi yani dallanma adresi işlem koduyla birlikte program bellekte yer alır. Program hafıza adresi CS:IP saklayıcı çifti ile belirlendiğinden dolayı dallanma bir segmenden diğer segmente (intersegment) ve JMP komutuyla yapılacaksa 2-byte sonraki segment adresi için ve 2-byte bu segmentdeki ofset adresi için olmak üzere 5-byte hafıza adresine gerek vardır. Aşağıda JMP [20000H] komutuyla yapılan bu tür bir dallanma için işlem kodu (opcode-operation code) verilmiştir. Böylelikle 20000H fiziksel adresine dallanılmış olur. Bu tip bir adreslemeyle program belleğin istenilen fiziksel adresine erişilebilir. Gerçek (real) modda belleğin ilk 1Mb bölümüne CS:IP yüklemeleriyle erişilebileceğinden doğrudan program bellek adresleme far jump olarak da anılır.
30
31
Anlaşılacağı üzere CS=2000H ve IP=0000H değerlerini alacaktır. JMP ile yapılacak dallanma yeri aynı segment içinde farklı bir ofset adrese ise sadece bu ofset adrese gerek vardır dolayısıyla işlem kodu 3-byte uzunluğundadır. Sadece IP bu ofsetle yüklenir. Doğrudan hafıza adresleme kullanan bir diğer komutta CALL komutudur. Assembly programlarda genellikle doğrudan hafıza adresi yerine dallanılacak hafıza adresini temsil eden etiketler kullanılır. Etiket kullanıldığında derleyici uygun adresleme şeklini seçerek 3 veya 5-byte uzunluğunda komut üretir. Göreceli Program Hafıza Adresleme: Mikroişlemcide şu an bir komut icra edilirken IP bir sonraki komut adresini işaret eder. İşte IP’ nin içerdiği bu adres değerine yapılacak ekleme veya çıkarma IP’ ye göre göreceli bir hafıza adresleme şekli oluşturur. Aşağıda JMP [2] komutu icra edilirken IP 2002H adresiyle yüklü olacaktır. IP göreceli adres 2 ile toplandıktan sonra 2004H olur ve program akışı bu adresten itibaren devam eder.
Göreceli CALL ve JMP komutlarında işlem kodundan sonra gelen yer değişim 1-byte veya 2byte’ dir. 1-byte (short jump) ile +127 ve -128 byte ileri geri dallanma 2-byte (near jump) yer değişimi +32767 ve -32758 ileri geri dallanma sağlanabilir. Yer değişim 2-byte’ dan büyükse derleyici tarafından doğrudan adresleme seçilir ve buna göre uzunlukta işlem kodu seçilir. [ 1] 0000: B8 00 00 mov ax,0000H [ 2] 0003: EB 01 jmp art ;IP şu anda 0005H dir, komut icrasıyla IP=IP+0001H=0006H olacaktır bu da art: etiketine dallanmaya neden olacaktır. [ 3] 0005: 48 dec ax [ 4] 0006: art: [ 5] 0006: 40 inc ax [ 6] 0007: son: Not: 0003: EB xx komutu icra edilirken IP=0005H gösterir ve IP=IP+xx’le dallanılır.
Dolaylı Program Hafıza Adresleme: JMP ve CALL komutlarıyla çok çeşitli dolaylı hafıza adresleme kullanımı söz konusudur. Bu moda 16-bit saklayıcıların herhangi biri (AX, BX, CX, DX, SP, BP, SI, DI) doğrudan kullanılarak, bir göreceli saklayıcı kullanılarak ([BX], [BP], [SI], [DI]) veya bir yer değişim ile herhangi bir göreceli saklayıcı kullanılarak dallanma yapılabilir. Aşağıdaki tabloda bunlara ait örnekler verilmiştir.
31
32
JMP [DI+2] mevcut kod segmentte içerisinde, DSx10H+DI+2 ile adreslenen bellekte tutulan adrese dallan Her bir örnekte 16-bit ofset adres esas alınarak dallanma yapılır. TABLO DW
ALT0 DW ALT1 DW ALT2 DW ALT3 ; Her biri 2-byte olan 4 farklı altprogram adresini içeren TABLO değişkeni tanımlanıyor. Buna dallanma tablosu (Jump Table) adı verilir. MOV BX, 4 JMP TABLO [BX]
;ALT2 ofseti ;ALT2’ ye dallan
YIĞIN HAFIZA ADRESLEME (STACK MEMORY ADDRESSİNG): Yığın tüm mikroişlemcilerde büyük bir öneme sahiptir. Verileri geçici olarak tutar, alt programlardan dönüş adreslerini saklar. Yığın 8086’ da son-giren-ilk-çıkar (Last-in-First-out LIFO) yapısına sahiptir. PUSH komutlarıyla veri yığının üstüne yerleştirilir. POP komutlarıyla veri yığından çekilir. Ayrıca CALL komutu icra edilirken alt programın dönüş adresini yığında saklarken, RET komutu icra edilirken yığından bir adresin okunması gerçekleşir. Aşağıda 8086 ile kullanılabilecek PUSH ve POP komut örnekleri verilmiştir.
POPF ile yığından bayrak saklayıcısına 2-byte okuma yapılarak 2-byte’ lık verinin yığında işgal ettikleri adresler boşaltılmış olur. Yığın hafıza SS:SP saklayıcı çifti ile gösterilir. Aşağıdaki şekilde ilk komut PUSH BX yürütülmeden önce SP=0100H ve SS=3000H’ dır. Bu 30100H fiziksel bellek adresine karşılık gelir, SSx10H+SP. Komut yürütülürken önce SP bir azaltılır ve BX’ in yüksek byte’ ı (BH) 12H SP ile işaretli 00FFH (fiziksel 300FFH) adresine kopyalanır. Sonra SP bir daha azaltılarak 00FEH 32
33
olur. Bu sefer BX’ in düşük byte’ ı (BL) 34H SP ile işaretlenen 00FEH (fiziksel 300FEH) adresine kopyalanır. Böylece PUSH komutu yürütüldüğünde SP?SP-2 olur. SP her zaman yığın hafızanın üstüne işaret eder. Bir POP komutunun icrası ile yığın üstünden mikroişlemciye peş peşe 2-byte okunur. Örneğin POP DX yürütülürken SP (00FEH) ile işaret edilen yığın hafızadaki değer 34H DL’ ye kopyalanır ve sonra SP bir arttırılarak SP=00FFH olur. SP (00FFH) ile işaret edilen yığın hafızadaki değer 12H DH’ ye kopyalanır. Böylece yığında düşük adreste (300FEH) tutulan veri DX’ in DL’ sine ve yüksek adreste (300FFH) tutulan veri DX’ in DH’ sine kopyalanır. Böylelikle SP=SP+2 olmuş olur.
VERİ TRANSFER KOMUTLARI 8086 mikroişlemcide şimdiye kadar kullanılabilen MOV, PUSH ve POP veri transfer komutları dışında LEA, LODS, STOS, MOVS, XCHG, LAHF, SAHF, XLAT, IN ve OUT komutları da mevcuttur. 33
34
Adres Yükleme Komutları Bir saklayıcıya veya bir saklayıcı ile bir segment saklayıcısına bir adres yüklemede kullanılmaktadır. Aşağıdaki Tablo bu komutların 3 değişik şeklini göstermektedir. LEA (Load Effective Address) LEA komutu, bir saklayıcıya operand ile belirtilen adresi yükler. Tabloda birinci örnekte, AX saklayıcısı, operand SUBADR içeriği ile değil (yani bu adresteki veri ile değil) SUBADR adresiyle yüklenmektedir. Bu emir MOV AX,OFFSET SUBADR komutu ile eşdeğerdir. Adres yükleme komutlarının değişik kullanımları. Assembly Dili
Yapılan İşlem
LEA AX, ADR
AX ADR’ nin ofset adresiyle yüklenir
LDS DI, LIST E
DI ve DS LISTE’ de tutulan adres ile yüklenir
LES BX, VECTOR
BX ve ES VECTOR’ de tutulan adres ile yüklenir
LDS ve LES LDS ve LES komutları, bir 16-bit saklayıcıya bir ofset adres ve DS (LDS ile) veya ES (LES ile) segment saklayıcısına yeni bir segment adresi yükler. Bu komutlardan her birinde hafızadan mikroişlemciye iki tane 16-bit kelime, yani toplam 4-byte veri transferi olur. LDS ve LES komutları ile, bir program içinde farklı bir DS ve ES alanlarına işaret edilirken, ofset saklayıcılara da yeni ofset yüklenir. Şekil LDS BX, [SI] komutu ile SI ile işaretli hafıza alanından bir 32-bit sayı BX ve DS saklayıcılarına kopyalanmasını göstermektedir.
Dizi (String) Komutları Dizi (string) veri transfer işlemleri için LODS, STOS ve MOVS komutları kullanılır. Bu komutlar mikroişlemci ile hafıza arasında, bir blok, tek bir byte veya kelime (word) transferinde kullanılır. Daha önce de bahsedildiği gibi yön (direction) bayrağı (D) dizi işlemlerinde DI ve SI saklayıcılarının otomatik artımı/azaltımı işlevi için kullanılır. Yön Bayrağı (D) Yön bayrağı, dizi işlemleri sırasında, DI ve SI saklayıcı için otomatik-arttırma (D = O) veya otomatik-azaltma (D = 1) çalışma modunu seçer. D bayrağı CLD komutu ile 0' lanır ve STD komutu ile l' lenir. Yani CLD otomatik-arttırmayı ve STD otomatik-azaltmayı seçer. Bir dizi 34
35
komutu ile yapılan veri transferinden sonra, D bayrağı ile seçilen çalışma moduna göre, eğer veri 1 byte ise DI ve/veya SI 1 arttırılır veya azaltılır. Benzeri şekilde, transfer edilen veri 2 byte ise, bu kez DI ve/veya SI 2 arttırılır veya azaltılır. String Komutları için Kaynak ve Hedef Saklayıcılar (DS:SI ve ES:DI) Dizi komutlarında DS, SI ve ES, DI çiftlerinin her ikisi de kullanılabilir. Normalde SI, DS için ve DI, ES için ofset adres olmaktadır. SI için segment atanması, bir segment ön eki (averride prejıx) ile değiştirilebilir ancak DI segment ataması her zaman ES' tir ve bu atama değiştirilemez. LOOS (Load String) LODS komutu DS’ de SI ile işaretli hafıza hücresinden AL' yi 1-byte veya AX' e 2-byte (kelime) yüklemektedir. Tablo LODS komutunun bazı kullanım örneklerini göstermektedir. LODSB ve LODSW komutları 1-byte veya kelime transferine neden olur. Örneğin, LODSB komutu yürütülürken, önce DS’ de SI ile işaretli hafıza alanından 1-byte veri AL saklayıcısına kopyalanır. Hemen sonra, SI, D bayrağının durumuna göre, 1 arttırılır veya 1 azaltılır. STOS (Store String) STOS komutu, AL veya AX' i ES’ de DI ile işaretli hafıza hücresine saklamaktadır. Tablo STOS komutunun bazı kullanım örneklerini göstermektedir. LODS' te olduğu gibi, STOS' dan sonra B veya W kullanılarak 1-byte veya kelime transferi yapıldığı belirtilir.
AssemblyDiIi LODSB LODSW LODS BUF LODS DATA
LODS komutunun bazı değişik kullanım örnekleri. Yapılan İşlem AL= [SI], SI= SI± 1 AX=[SI], SI = SI±2 AL= [SI], SI= SI± 1 (Eğer BUF byte ise) AX = [SI], SI = SI ± 2 (Eğer DATA kelime (word) ise)
AssemblyDili STOSB STOSW STOS BUF STOS DATA
STOS komutunun bazı değişik kullanım örnekleri. Yapılan İşlem [DI]=AL, DI=DI±l [DI] = AX, DI = DI±2 [DI] = AL, DI = DI ± 1 (Eğer BUF byte ise) [DI] = AX, DI = DI±2 (Eğer DATA kelime ise)
REP ile STOS Komutu REP (repeat) öneki (prefıx) herhangi bir dizi komutuna eklenebilir. Bu sayede bir dizi işleminin, CX sayma değeri sıfır oluncaya kadar tekrarlanması sağlanabilir. Aşağıda verilen örnek program parçasında, BUFFER adresli yerden başlayan 10-bytelık alan sıfır ile temizlenmektedir. Bu işlem peş peşe 10 tane STOS komutuyla veya REP önekli bir tane STOS komutuyla yapılabilir. Önce LES komutuyla ES ve DI saklayıcıları yüklenmekte daha sonra, CX sayacı yüklenmekte ve D bayrağı sıfırlanarak, her STOS komutu yürütüldükten sonra DI' nın otomatik-arttırması sağlanmaktadır. LES DI, BUFFER MOV CX, 10
; BUFFER’ deki ofset ve segment adreslerini yükle ; sayacı yükle otomatik 35
36
CLD MOV AX, 0 REP STOSB
; arttırmayı seç hafıza ;temizleme için AX=0 ;BUFFER alanını temizle
LES komutuyla yüklenen adresler BUFFER’ da tutulmaktadır. Bu yüzden aşağıdaki tanımlamada olduğu gibi 4-byte veri içermelidir. BUFFER DW 0100H,0400H ;0100H ofset, 0400H segment için Aynı işlem REP STOSW komutunu kullanarak CX sayacı 5 ile yüklenerek de yapılabilir. Çünkü 5 tane 0000H kelimesi 10-byte hafızayı temizler. Aşağıda bu işlememi yapan program parçası verilmiştir. LES DI, BUFFER MOV CX, 5 CLD MOV AX, 0 REP STOSW MOVS (Move String) MOVS dizi veri transfer komutu ile hafızanın bir alanından diğer bir alanına 1-by te veya kelime aktarımı yapılabilir. Bu komut MOV komutu ile yapılamayan hafızadan-hafızaya veri transferi işlemini yapar. Bir MOVS komutu, veri segment' te (DS) bulunan ve SI saklayıcısı ile adreslenen hafıza hücresini, ES' de bulunan ve DI ile adreslenen hafıza alanına aktarır. MOVS komutunun bazı değişik kullanım örnekleri. AssemblyDili Yapılan İşlem MOVSB [DI] = [SI], DI = DI ± 1, SI = SI ± 1 MOVSW [DI] = [SI], DI = DI±2, SI = SI±2 MOVS DATA1, DATA2 [DI] = [SI], DI = DI ± 1, SI = SI ± 1 MOVS WORD1, WORD2 [DI] = [SI], DI = DI ± 2, SI = SI ± 2 Aşağıda verilen örnek program parçasında, BUFFER2 alanından 100-byte veri BUFFER1 alanına aktarılmaktadır. Yine MOVS kullanılmadan önce, LES ve LDS komutları ile hafıza işaretçileri DI ve SI yüklenerek, BUFFER1 ve BUFFER2 alanlarına işaret etmeleri sağlanır daha sonra MOVS komutu yürütülürken SI ve DI' de bulunan ofset adreslerin otomatik-arttırması CLD komutuyla seçilir ve CX sayacı 100 ilk değeriyle yüklenir. REP komutuyla kullanılan MOVS komutu ardışık 100 adet veri transferini gerçekleştirir. LES DI, BUFFER1 LDS SI, BUFFER2 CLD MOV CX, 100 REP MOVSB
;BUFFER1 adresini yükle ; BUFFER2 adresini yükle
Diğer Veri Transfer Komutları (IN, OUT, XCHG, XLAT, IAHF ve SAHF ) IN ve OUT
36
37
IN ve OUT komutları ile 8086 mikroişlemcisi giriş/çıkış cihazlara (port' lara) erişir. 8086 mikroişlemcisinde veri aktarımı mikroişlemcinin AL veya AX saklayıcısı ile 8-bit bir sabit adres veya DX ile belirtilen (adreslenen) bir dış port arasında olur. Veri için hedef veya kaynak her zaman AL, AX veya EAX (386 ve 486’ da) saklayıcılarıdır. Giriş/çıkış cihazları için port adres alanı 16-bit olarak tasarlanmıştır. Bu alan 0000H-03FFH arasındadır ancak günümüzde bu port adres 03FFH’ dan büyük olabilmektedir. Aşağıda OUT 19H, AX komutu için 8086 mikroişlemcinin data, adres ve kontrol uçlarında oluşan veri ve adres yapısı gösterilmektedir. Port Data AX içeriği
Data BUS (D0-D15)
Port Adres 0019H
Port Kontrol
Adres BUS (A0-A15)
IOWC (I/O Write Control)
Burada ilgili kontrol bus ucunun sadece giriş/çıkış cihazlarını aktif etmek için (bellek veya diğer harici birimler değil) aktif edildiğine dikkat edin (IOWC=0). IN komutu için IORC ucu aktif olmaktadır. A16 ve daha büyük adres uçları IN ve OUT komutlarında tanımlanmamıştır.
IN ve OUT komutlarının değişik kullanım örnekleri. AssemblyDili
IN AL,IPORT IN AX,IPORT IN AL,DX IN AX, DX OUT OPORT, AL OUT OPORT, AX OUT DX,AL OUT DX,AX
Yapılan İş1em
IPORT' tan 8-bit veri AL' ye okunur IPQRT' un 16-bit veri AX’ e okunur DX ile işaretli port' tan 8-bit veri AL' ye okunur DX ile işaretli port' tan 16-bit veri AX' e okunur AL' nin içeriği OPORT' a gönderilir AX' in içeriği OPORT' a gönderilir AL' nin içeriği DX ile işaretli port' a gönderilir AX 'in içeriği DX ile işaretli port' a gönderilir
XCHG Herhangi bir saklayıcının içeriğini diğer bir saklayıcı veya bir hafıza hücresi ile değiştirmektedir. XCHG komutu, segment saklayıcılarının içeriğini veya hafızadan hafızaya veri içeriği değiştirmede kullanılamaz. XCHG komutunu 16-bit AX saklayıcısı ile diğer bir 16-bit saklayıcının içeriklerini değiştirmede kullanma en etkin ve hızlı yer değişim yöntemidir. Çünkü, bu komut hafızada 1-byte işgal eder.
37
38
XCHG komutunun değişik şekilleri. Yapılan işlem Saklayıcı içeriklerini değiştir Saklayıcı ile hafıza içeriklerini değiştir
AssemblyDiIi XCHG sak, sak XCHG sak, hafıza XLAT
XIAT (translate) komutu, AL'nin içeriğini hafızada bir tabloda saklı bir sayıya çevirmektedir. Bu komut, bir kodu diğerine çeviren, doğrudan bakma tablosu bakla (look-up) tekniğinde kullanılır. XLAT komutu, önce AL'nin içeriğini BX saklayıcısına ekleyerek DS için bir hafıza adresi oluşturur. Daha sonra bu adreste saklı veriyi AL saklayıcısına geri yükler. Örneğin, bir 7-segment LED gösterge bakma tablosunun DISPLAY adresinde saklandığını varsayalım. XLAT komutu, AL saklayıcısında bulunacak O ile 9 arasında değişik BCD (Binary Coded Decimal) sayıların 7 -segment kod karşılığını bulmada kullanılır. MOV BX, OFFSET DISPLAY XLAT
;DISPLAY ADRESİNİ YÜKLE ;AL’ DEKİ BCD KODU 7-SEGMENT KOD ÇEVİR
ARİTMETİK VE LOJİK KOMUTLAR Toplama: ADD, ADC ve INC Komutları ADD Komutu Tabloda ADD toplama komutunun değişik adresleme modlarına göre bazı kullanım örnekleri yer almaktadır. Toplama komutunun değişik kullanım örnekleri. AssemblyDiIi
Yapılan İş1em
ADD AL, CL
AL=AL+CL
ADD DX, SI
DX= DX+ SI
ADD BL,20H
BL= BL+ 20H
ADD CX, 4000H
CX= CX + 4000H CL, DS’ de BX ile adreslenen veri ile toplanır sonuç yine bu veri alanına yazılır CX, DS’ de SI+2 ile adreslenen veri ile toplanır sonuç CX'e yazılır
ADD [BX],CL ADD CX, [SI+2] ADD AL, BUF ADD AL, BUF[DI] ADD [BX+DI], DL
AL, DS' de bulunan BUF hücresi ile toplanır sonuç AL' ye yazılır AL, DS' de bulunan ofset-BUF ve DI toplami ile adreslenen veri ile toplanır sonuç AL' ye yazılır DS' de bulunan BX ve ofset DI' nin toplamı ile adreslenen veri DL ile toplanır ve sonuç yine bu veri alanına yazılır
38
39
İvedi toplama (immediate addition) adreslemesine bir örnek verilmiştir. Bu adreslemede bir operand saklayıcıdan diğer operand hafızadan gelen sabit bir sayıdır. SI, DI, BP veya BX saklayıcıları ile yapılan adreslemeyle hafızadan saklayıcıya toplama (memoryregister addition) gerçekleştirilir. Bir taban ve ofset değerinin toplanmasıyla oluşan adresle işaretlenen verinin bir saklayıcı ile toplanması ile dizi toplaması (araya ddition) gerçekleştirilir. Aşağıda bir byte dizisi olan ARRAY'in ilk 3 elemanı ARRAY[0], ARRAY[ 1] ve ARRAY[2] toplanmaktadır. MOV AL,0
MOV SI, 0 ADD AL, ARRAY[SI] ADD AL, ARRAY[SI+l] ADD AL, ARRAY[SI+2l
;TOPLAMI SIFIRLA ;Dizinin ilk elemanı ;ilk eleman
ADC Komutu (Eldeli Toplama): ADC eldeli toplama komutunda operand ile beraber elde bayrağı da (C) toplamaya dahil edilir. Bu komut 8086-80286'da 16-bit' ten ve 80386-Pentium'da ise 32-bit' ten daha geniş sayıları toplamada kullanılır.
INC Komutu Segment saklayıcılar dışında herhangi bir saklayıcıya veya bir hafıza hücresi içeriğine 1 ekler.
39
40
Çıkarma: SUB, SBB ve DEC Komutları SUB Komutu
AssemblyDili SUB AL, CL SUB DX, SI
Çıkarma komutunun değişik kullanım örnekleri. Yapılan İşlem AL= AL-CL DX= DX-SI
SUB BL, 20H
BL = BL- 20H
SUB CX, 4000H
CX= CX- 4000H DS’ de BX ile adreslenen veriden CL çıkartılır sonuç yine bu veri alanına yazılır CX' den DS’ de SI+2 ile adreslenen veri hücre çıkartılır sonuç CX' e yazılır AL' den DS' de bulunan BUF verisi çıkartılır sonuç AL' ye yazılır AL'den DS'te bulunan BUF ve ofset DI' nin toplamı ile adreslenen veri çıkartılır sonuç AL' ye yazılır DS' de bulunan BX ve ofset DI' nin toplamı ile adreslenen veriden DL çıkartılır ve sonuç yine bu veri alanına yazılır
SUB [BX],CL SUB CX, [SI+2] SUB AL, BUF SUB AL, BUF[DI] SUB [BX+DI], DL
SBB Komutu (Ödünçlü çıkartma) SBB ödünçlü çıkartma komutunda operand ile beraber elde bayrağı da (C) çıkar işlemine dahil edilir. 8086-80286'da 16-bit'ten ve 80386-Pentium'da ise 32-bit'ten daha geniş sayıları çıkarmada
kullanılır.
AssemblyDiIi SBB AL, CL SBB AX, BX SBB [BX],AL SBB AX, [BP+2]
SBB komutunun değişik kullanım örnekleri. Yapılan İşlem AL=AL-CL-C AX=AX-BX-C DS' de bulunan BX ile adreslenen 1-byte veriden AL ve C çıkartılır ve sonuç aynı veri alanına yazılır AX' den SS' de bulunan ve BP+2 ile adreslenen 16-bit veri ve C çıkartılır sonuç AX' e yazılır
DEC Komutu Segment saklayıcılar dışında herhangi bir saklayıcı veya bir hafıza hücresi içeriğini 1 azaltır.
AssemblyDili DEC AL DEC SP DEC BYTE PTR [BX] DEC WORD PTR[SI]
Azaltma komutunun değişik kullanım örnekleri. Yapılan İşlem AL=AL-1 SP=SP-I DS' de bulunan ve BX ile adreslenen 1-byte hafıza içeriği azaltılır DS' de bulunan ve SI ile adreslenen 16-bit hafıza içeriği azaltılır 40
41
Karşılaştırma Karşılaştırma komutu CMP (Compare) ile sadece bayrak bit' lerini değiştiren bir çıkarma işlemi gerçekleştirilir. Karşılaştırma işlemine giren operand' larda bir değişme olmaz, sadece bayraklar etkilenir. Karşılaştırma işlemi bir saklayıcı içeriği ile diğer bir saklayıcı veya hafıza içeriği arasında yapılır. Genelde bir karşılaştırma komutundan hemen sonra bayrakların durumunu test eden bir dallanma komutu gelir. Karşılaştırma komutu hafızadan-hafızaya ve segment saklayıcı karşılaştırması dışında daha önce verilen tüm adresleme modlarını kullanır.
AsumblyDili CMP AL,CL CMP DX,SI CMP BL,20H CMP CX. 4000H CMP [BX],CL CMP CX, [SI+2] CMP AL,BUF CMP AL, BUF[DI] CMP [BX+DI], DL
Karşılaştırma komutunun değişik kullanım örnekleri. Yapılan İşlem AL-CL işlemi yapılır. DX-SI işlemi yapılır. BL-20 işlemi yapılır. CX-4000H işlemi yapılır. DS’ de BX ile adreslenen veriden CL çıkartılır. CX' den DS’ de SI+2 ile adreslenen veri çıkartılır. AL' den DS' de bulunan BUf hücresi çıkartılır. AL' den DS' de bulunan BUF ve ofset DI' nin toplamı ile adreslenen veri çıkartılır. DS' de bulunan BX ve ofset DI' nin toplamı ile adreslenen veriden DL çıkartılır.
Çarpma ve Bölme ilk 8-bit mikroişlemciler donanım çarpma ve bölme birimine sahip değildi. Bu birim 16bit mikroişlemcilere eklenen ilk önemli donanım birimi oldu. Ancak bu temel birim sadece tamsayı (integer) çarpma ve bölme desteği sağlamaktadır. Kayan nokta işlemleri ya yazılım alt programları ile veya ilk zamanlar, 8087 (8086/8088 için), 80287 (80286 için) ve 80387 (80386 için) gibi bir dış nümerik işlemci ile sağlandı. 80486 ve daha sonraki Pentium işlemcilerinde kayan nokta aritmetik işlemleri, artık tüm devre üzerinde gerçekleştirildi. Çarpma (MUL ve IMUL) Çarpma işlemi 8-bit veya 16-bit işaretsiz (MUL) veya işaretli (IMUL) tamsayılar üzerinde yapılır. İşlem sonucu (çarpım) operand'lar 8-bit ise, 16-bit; 16-bit ise 32-bit olur. Çarpma komutlarında, ivedi adresleme modunun dışındaki adreslerne modları kullanılabilir. Çarpma ve bölme komutlarında ilk operand her zaman AL (8-bit işlemde) veya AX (16bit işlemde) saklayıcısında bulunur. 8-Bit Çarpma 8-bit çarpma işleminde çarpanlardan biri her zaman AL saklayıcısında bulunur. Programcı ikinci çarpanı komut ile belirtir. Aşağıda görüldüğü gibi 16-bit çarpım sonucu AX saklayıcısında bulunur. 41
42
İşaretli çarpmada operand' lar donanım tarafından işaretli (2'nin tümleyeni) olarak yorumlanır ve çarpım yine 2'nin tümleyeni şeklinde olur. Bu tür çarpma işleminde IMUL komutu kullanılır. Sayıların yorumlanması ve işlemleri programcıya bağlıdır. 16-Bit Çarpma Çarpanlardan biri her zaman AX saklayıcısında bulunur. İkinci çarpan komut ile belirtilir. Aşağıda görüldüğü gibi 32-bit çarpım sonucu DX ve AX saklayıcılarında bulunur.
Çarpma komutunun değişik kullanım örnekleri. AsstmblyDili Yapılan İşlem AL' de bulunan işaretsiz tamsayı DL ile çarpılır. MUL DL Çarpım AX' de bulunur. AL' de bulunan işaretli tamsayı CH ile çarpılır. IMUL CH Çarpım AX' de bulunur. DS' de bulunan BX ile adreslenen veri AL ile çarpılır. MUL BYTE PTR[BX] Çarpım AX' de bulunur. DS' de OPR adresinde bulunan işaretli tamsayı AL IMUL BYTE PTR OPR ile çarpılır. çarpım AX’de bulunur. AX' deki işaretli tamsayı CX ile çarpılır. çarpım IMUL CX DX:AX' te bulunur. DS' de bulunan ve SI ile adreslenen 16-bit veri AX MUL WORD PTR[SI] ile çarpılır. Çarpım DX:AX' de bulunur
Bölme (DIV ve IDIV) 8-BitBölme 8-bit bölme işleminde bölünen her zaman AX saklayıcısında bulunur. Bölen sayıyı komut ile belirtir. 42
43
Bölünecek sayı 8-bit ise bu sayıyı 16-bit' e çevirmek için CBW (Convert Byle to Word) komutu kullanılır. Bu komut AL saklayıcısında bulunan işaretli 8-bit sayıyı AX saklayıcısına 16-bit olarak çevirir. Bu komut genellikle 8-bit bölme işleminden önce kullanılır.
Aşağıda AL saklayıcısındaki 12H sayısı CL saklayıcısındaki 2 sayısına bölünmektedir. Bölme işleminden önce kalan sayısının saklandığın AH saklayıcısı temizlenmektedir. MOV AL, 12H MOV CL, 2 MOV AH, 0 DIV CL 16-Bit Bölme 16-bit bölme işleminde bölünen her zaman DX:AX saklayıcı çiftinde bulunur. Bölen sayıyı komut ile belirtir. Bölünecek sayı 16-bit ise bu sayıyı 32-bit'e çevirmek için CWD (Convert Word to Double word) komutu kullanılır. Bu komut AX saklayıcısında bulunan işaretli 16-bit sayıyı DX:AX saklayıcı çiftine 32-bit olarak çevirir. Bu komut genellikle 16-bit bölme işleminden önce kullanılır.
Aşağıda AX' teki -200 CX' de bulunan 9 ile bölünmektedir. Bölme işleminde, önce CWD komutu ile AX'teki işaretli sayı DX:AX saklayıcı çiftine 32-bit olarak çevrilir. Bölme işleminden sonra AX'te bölüm (-22) ve DX'te kalan (-2) bulunur. MOV AX, -200 MOV CX, 9 43
44
CWD IDIV CX
BCD ve ASCII Aritmetik 8086/8088 mikroişlemcide bu komutlar sayesinde ikili kodlanmış ondalık (Binary Coded Decimal - BCD) ve ASCII formatında saklanan sayılar üzerinde işlemler yapılabilir. BCD Aritmetik DAA (Decimal Adjust af ter Addition) DAS (Decimal Adjust af ter Subtraction) AAM (AdjustAfter Multiplication) AAD (Adjust Before Division) DAA, DAS ve AAM komutları BCD sayıların toplama, çıkarma ve çarpma işlemlerinden sonra; AAD ise DIV komutunu kullanmadan önce sayıları ayarlama için kullanılır. Sayılar toplama ve çıkarmada 1-byte olarak 2 hane paketlenmiş BCD formatında AL' de saklanır.Eğer 1- byte içeriği 25H ise ve bu bir BCD sayıyı belirtiyorsa bu sayı BDC kodlu 25 sayısıdır. Yani bu byte 2 ve 5 BCD hanelerini içermektedir. Çarpma ve bölmede ise sayılar 1-byte 1 hane olacak şekilde paketlenmemiş BCD sayılar olarak saklanır. Örneğin AL 04 ise, bu sayı BCD 4'e karşılık gelir. DAA komutu için örnek : Aşağıdaki örnekte BX ve CX saklayıcılarında bulunan 4 haneli BCD sayıları toplamakta, sonucu DX saklayıcısında saklamaktadır. İlk DAA komutunun kullanımından önce, 99 ve 34 sayıları toplanarak BCD olmayan CD sayısı üretilmiştir. DAA komutu bu işlemi C bayrağında 1 ve AL' de 33 yaparak düzeltmektedir. Daha sonra 12 ve 30 elde bayrağıyla beraber toplanmakta ve 43 bulunmaktadır. Bu sayının haneleri BCD olduğundan, ikinci DAA komutundan sonra bu sayıda bir değişiklik olmaz. Sonuç olarak, DX saklayıcısında 4333H veya 4333 BCD kodu bulunur. 44
45
MOV MOV MOV ADD DAA MOV MOV ADC DAA MOV
BX, CX, AL, AL,
1234H 3099H BL CL
DL, AL, AL,
AL BH CH
DH, AL
DAS komutu için örnek: Aşağıdaki örnekte BX ve CX saklayıcılarında bulunan 4 haneli BCD sayıları çıkartmakta ve sonucu DX saklayıcısında saklamaktadır. DAS komutu DAA gibi çalışmaktadır. Bu komut çıkarma işleminden sonra AL' yi ayarlamada kullanılır. ADD ve ADC komutları SUB ve SBB ile ve DAA komutu DAS ile yer değiştirmiştir. Bu program çalıştırıldığında DX saklayıcısında 1865 BCD sayısı bulunur. MOV BX, MOV CX, MOV AL, CL
1234H 3099H
SUB AL, BL DAS MOV DL, AL MOV AL, CH SBB AL, DAS
BH
MOV DH, AL AAM İki tane tek haneli paketlenmemiş BCD sayının çarpma işleminden sonra kullanılır. Aşağıdaki örnekte AL saklayıcısında bulunan 5 ile CL’ deki 6 sayıları çarpılmaktadır. Çarpma işleminden sonra AX saklayıcısında 1EH (30) bulunur. Bu BCD olarak doğru bir gösterim değildir. AAM komutundan sonra AX saklayıcısı 0300H veya 2haneli paketlenmemiş 30 BCD sonucuna çevrilir. MOV AL, 5 MQV CL, 6 MUL CL AAM AAD Bu komut öncekilerden farklı olarak bölme işleminden önce kullanılmaktadır. AAD komutu AX saklayıcısında 2-haneli paketlenmemiş bir BCD sayının var olduğunu varsayar (AH en değerli haneyi, AL ise diğer haneyi tutar). Bu 2-haneli BCD sayı, tek-haneli bir BCD sayı ile 45
46
bölünmeden önce AAD komutuyla ikili sayıya ayarlanmalıdır. Bu sayede yapılan bölme işlemi sonucunda, AL saklayıcısında tek-haneli sonuç ve AH' te kalan üretilir. AAD komutu paketlenmemiş BCD sayıları 00 ile 99 arasında ikili sayılara çevirir. Aşağıda paketlenmemiş BCD 72 sayısının 9 ile bölünme işlemini gerçekleştirmektedir. AAD komutuyla AX saklayıcısında bulunan 0702H sayısı, yine AX' de 0048H sayısına çevrilir. Bu şekilde BCD sayı ikili sayıya çevrilir. Böylece, ikili bölme komutu DIV ile doğru bölme işlemi yapılarak AL' de 08H ve AH' da 00H bulunur. MOV BL, 9H MOV AX, 0702H AAD DIV BL
ASCII Aritmetik ASCII aritmetik komutları 0 ile 9 arasındaki sayıların ASCII-kodları (30H-39H) ile yapılacak işlemlerde kullanılır. AAA (Adjust for ASCII Addition) AAS (Adjust for ASCII Subtraction) Bu komutlar her zaman AX. saklayıcısını ayarlama işleminden önce kaynak ve sonra hedef olarak kullanır. AAA Örneğin 31H (1) ile 39H (9) sayılarını toplarsak sonuç 6AH olur. Bu ASCII toplama (1 + 9) işlemi 10 ondalık sayısına karşı gelen 31H ve 30H ASCII-kodlu 2-haneli bir ASCII sonucu üretmelidir. Eğer bu toplamadan sonra, AAA komutu yürütülürse, AX saklayıcısı 0100H içerir. Bu sonuç ASCII olmamakla beraber, 3030H eklenerek ASCII koda çevrilir ve 3130H elde edilir. MOV AX, 0031H ; ASCII 1 yükle, AH' i temizle ADD AL, 39H ;ASCII 9 ile topla AAA ; ASCII toplama sonu ilk ayarlama ADD AX, 3030H ;Sonucu ASCII olarak ver AX=3130H AAS AAS komutu AAA gibi, ASCII çıkarma işleminden sonra AX. saklayıcısını ayarlar. LOJİK İŞLEMLER Lojik işlem komutları yardımıyla ikili bit kontrolü rahatlıkla yapılabilir. Bütün lojik işlemler bayrak bit' lerini etkilerler: her zaman elde ve taşma bit' leri temizlenir ve diğer bayraklar sonucun durumuna göre değer alırlar.
AND, OR ve XOR Komutları Lojik çarpma işlemi AND komutuyla gerçekleştirilir. İkili sayılarda her hangi bir bit'i sıfırlama (temizleme) işlemine maskeleme (masking) adı verilir. AND işlemi sayesinde bir veri kelimesinde istenmeyen bit' ler temizlenebilir. 46
47
Aşağıda 16-bit bir ASCII sayının AND komutuyla yani ASCII sayıdaki her bir veri hanesinin en sol 4 bit' i temizlenerek (maskeleme) BCD koda çevrilmesi gösterilmektedir. MQV CX, 3531H AND CX, 0F0FH
;2 haneli ASCII sayıyı yükle ;CX’ i maskele
Lojik toplama işlemi OR komutuyla gerçekleştirilir ve İkili sayılarda her hangi bir bit'i 1’ leme (setleme) işleminde kullanılabilir. Aşağıda iki sayı çarpıldıktan sonra AAM komutu kullanılarak 2-haneli paketlenmemiş BCD sayıya çevrilmektedir. OR AX,330H işlemiyle AX’ deki sayı 2-haneli ASCII-kodlu sayıya çevrilir. OR komutundan önce AX saklayıcısı 0305H içermektedir. OR komutundan sonra AX=3335H olmaktadır. MOV AND MUL AAM OR
AL,5 Veriyi yükle BL, 7 BL AX = 5*7 Paketlenmemiş 2-haneli BCD ayar AX=0305H A X 3030 ASCII'ye çevir ,
XOR işlemi tanımı gereği (XOR işleminde girişler farklı ise çıkış lojik 1 aynı ise çıkış lojik 0) karşılaştırma işlemi olarak da değerlendirilebilir. XOR AX, 0FFC0H
; AX saklayıcısında bulunan bit' lerin en-sağındaki 6 bit değiştirilmeden en-solundaki 10 bit' nin tersi alınmaktadır.
XOR AL, AL
; Bu komutla AL temizlenmektedir bu işlem MOV ile yapılsaydı daha uzun sürecekti çünkü fazladan bir hafıza okuma işlemi gerektirmektedir
MOV AL, 0
TEST Komutu 47
48
TEST aslında bir AND işlemi gerçekleştirir ancak işlem sonucunda hedef veya kaynak operandlar değişmemektedir sadece TEST sonucuna göre bayrak saklayıcısının durumunu etkilenir.
TEST komutu yaptığı işlem itibariyle bir karşılaştırma CMP (Compare) komutu gibi kullanılır. TEST işlemi normalde tek bir bit'i test eder CMP komutu ise bütün bir byte veya kelimeyi (word) test eder. Test edilen bit sıfır ise Sıfır bayrağı (Z) lojik l'dir (Z = 1, sonuç sıfır), sıfır değil ise lojik 0' dır (Z = O, sonuç sıfır değil). CMP komutunda olduğu gibi TEST komutundan sonra JZ (Jump Zero) veya JNZ (Jump Not Zero) gibi bir dallanma komutları kullanılır. Aşağıda verilen örnek program bu kullanımı göstermektedir. TEST AL, 1 ;en sağdaki bit’ i test et JNZ RIGHT ;eğer 1 ise dallan TEST AL, 128 ;en soldaki bit’ i test et JNZ LEFT ;eğer 1 ise dallan
NOT ve NEG Komutları NOT işlem ile Lojik ters-alma veya verinin 1' li tümleyeni ve NEG işlemiyle aritmetik işaret tersleme veya 2' li tümleyeni elde edilir. Sadece tek operand kullanırlar. NOT bir lojik işlem olarak; NEG ise bir aritmetik işlem olarak düşünülebilir. NOT ve NEG komutlarının bazı kullanım örnekleri. AssemblyDiIi Yapılan işlem NOT CL CL = CL' NEG CL CL= CL' + 1 (2'nin tümleyeni) NEG AK AX=AX' + 1 (2'nin tümleyeni) DS'te bulunan TEMP ile adreslenen verinin bit'leri NOT TEMP terslenir. TEMP ile adreslenen verinin boyu TEMP' in tanımlanmasına bağlıdır. NOT BYrE PTR[BX] DS'te bulunan BX ile adreslenen l-byte verinin bit'leri terslenir. Kaydırma ve Döndürme Kaydırma (Shift) ve döndürme (Rotate) komutları, AND, OR, XOR ve NOT komutlarında olduğu gibi ikili sayılar üzerinde ikili bit seviyesinde işlem yapmaktadır. Kaydırma Komutları 48
49
Kaydırma komutları 2' nin katları ile çarpma (sola kaydırma) ve bölme (sağa kaydırma) işlemlerinde kullanılır. SAR komutu ile aritmetik sağa kaydırma işlemi (eğer sayı pozitif ise, sola '0' kaydırılır negatif ise, en sola '1' kaydırılır) gerçekleştirilir yani işaret bit'i kendi üzerinde dönmektedir. En sağdaki bit elde bayrağına (C) girer. Görüldüğü gibi SAR komutu işaretli sayıyı 2' ye bölmektedir. Aritmetik kaydırmada kaydırma adedi komuta operand olarak girilen CL içeriği ile belirlenebilir. SHR komutu ise lojik sağa kaydırma işlemi gerçekleştirir yani işaretsiz sayıyı 2’ ye böler.
Kaydırma komutlarının bazı kullanım örnekleri. AssernblyDili
Yapılan İşlem
SHL CX
Lojik olarak CX'i sola kaydır
SHR AX
Lojik olarak AX'i sağ;ı kaydır Aritmetik olarak DS' de bulunan BUFFER' ı sola CL'de bulunan sayı kadar kaydır
SAL BUFFER, CL SAR SI
Aritmetik olarak SI' yı sağa kaydır
Döndürme Komutları Döndürme komutları bir saklayıcı veya hafıza adresindeki veriyi bir ucundan diğerine veya elde bayrağı üzerinden döndürmektedir. Döndürme işleminde döndürme adedi komuta operand olarak girilen CL içeriği ile belirlenebilir. Döndürme komutlarının bazı kullanım örnekleri. AssemblyDili Yapılan İşlem ROL DI DI sola 1 bit döner. RCL CL CL sola elde üzerinden 1 bit döner. ROR AH,CL AH sola elde üzerinden CL' de bulunan sayı kadar döner. 49
50
RCR WORD PTR[BP]
SS' de bulunan ve BP ile adreslenen 16-bit kelime sağa 1 bit döner.
PROGRAM KONTROL KOMUTLARI Program icrasını yönlendirmek ve program akışının değişmesini kontrol etmek maksadıyla JMP (dallanma), CALL (altprogram çağırma), RET dönüş, kesme (INTERRUPT) ve işlemci kontrol komutları gibi Program kontrol komutları kullanılabilir. Dallanma ile yapılan programların akış kontrolü genellikle bir CMP veya TEST komutuyla bir test işleminden sonra koşula bağlı dallanma komutuyla gerçekleştirilir. Dallanma Komutları JMP komutu hafızanın bir bölümünden diğer bir bölümüne program akışını yönlendiren temel program dallanma komutudur. Koşula bağlı dallanma komutları ise bayrak bit' lerinin durumuna göre (bir durum testi sonucu) program akışını değiştirir. DOĞRUDAN DALLANMALAR Daha önce de bahsedildiği gibi JMP komutu 3 değişik şekilde kullanılır: Kısa (short) dallanma, yakın (near) dallanma ve uzak (far) dallanma.
Kısa Dallanma 50
51
Bellekte herhangi bir yere değişiklik yapılmadan taşınabildiğinden Göreceli (relative) dallanmalar olarak da bahsi geçen kısa dallanma 2-byte komut uzunluğuna sahip olup işlem kodundan sonraki ikinci byte işaretli adres bilgisidir ve bu sayede kendisini takip eden hafıza adresinden itibaren, + 127 ile -128-byte arasında bir hafıza hücresine dallanmayı sağlar. Program bellekte EB (DISP) ile IP=IP+(DISP) yapılarak dallanma sağlanır Yakın Dallanma Kısa dallanmaya benzeyen yakın dallanma 3-byte bir komuttur ve o anki CS içinde herhangi bir adrese dallanmayı sağlar. İşlem kodundan sonra CS için 16-bit Ofset adres yer alır.
Uzak Dallanma Kısa ve yakın dallanmalar genellikle segment içi dallanma (inter segment jump) olarak uzak dallanma ise segmentler arası dallanma (intersegment jump) olarak adlandırılır dolayısıyla uzak dallanma komutları mikroişlemcinin hafıza adres alanındaki herhangi bir adrese dallanmayı sağlar. Programcı dallanmalarda JMP komutundan sonra bir adres etiketi (Iabel) kullanır. Kullanılan assembler dallanmanın uzunluğuna göre işlem kodu ve adres üretir. Bu yüzden programcı için yapılacak tek şey JMP' tan sonra dallanılacak yerin etiketini yazmaktır. Saklayıcı Operand' lı Dallanma Bu dallanma komutu bir 16-bit saklayıcıyı operand alarak dallanılacak adresi belirlemede kullanılabilir bu yüzden dallanma tablosu kullanarak dallanılan programlar için çok uygundur. Bu tür dallanma, dolaylı dallanmadır ve saklayıcının içindeki veri dallanma adresi olarak kullanılır. Saklayıcının içerdiği adresi IP olarak alınır ve program bu adresten itibaren devam eder. Aşağıda, TABLO adresinden başlayan bir dallanma tablosunda bulunan 4 farklı altprogram adresine erişen bir örnek verilmektedir. Altprogram adresleri 16-bit olduğu için, bu adresler, TABLO başlangıç adresinden itibaren TABLO+0, TABLO+2, TABLO+4 ve TABLO +6 adreslerinde yer almaktadır. Program başında SI' da 0,1,2 veya 3 olduğu varsayılmakta ve iki katı alınmaktadır. Daha sonra TABLO taban adresiyle bu adres toplanarak dallanılacak altprogram adresi bulunur ve JMP AX ile bu adrese dallanılır.
ADD SI, SI ADD SI, QFFSET TABLO MOV AX, CS: [SI] JMP AX TABLO DW SUBO DW SUBI DW SUB2 DW SUB3
; SI' nin 2 katı ;altprogram adresleri için taban adres ;adresi AX' e al ; altprograma dallan
;4 ALTPROGRAM ADRES TABLOSU
İndisli Adresleme Kullanan Dolaylı Dallanma 51
52
Bu tip dallanmada indisli adresleme kullanarak bir dallanma tablosuna erişebilir. Dallanma tablosu yakın (near) dolaylı dallanmada ofset adresleri veya uzak (far) dolaylı dallanmada segment ve ofset adresleri içerir. Yukarıdaki programın indisli adresleme kullanan şekli aşağıda verilmiştir. ; Dallanma tablosu örneği ADD SI, SI ; SI'nin 2 katı ADD SI, OFFSET TABLO ;altprogram adresi JMP CS: [SI] ;altprograma dallan TABLO:
DW SUBO DW SUBI DW SUB2 DW SUB3
;4 ALTPROGRAM ADRES TABLOSU
Yukarıda verilen programda, dallanma tablosuna erişim, normal hafızaya erişim gibidir. Burada kullanılan JMP CS:[SI] formundaki komut CS hafızada bulunan ve SI ile adreslenen program bellek adresine işaret eder. Programın icrası bu hafıza adresinde saklı olduğu varsayılan adresle işaret edilen adrese dallanır. Saklayıcı ve indisli adreslemeli dallanma komutunun her ikisi de yakın dallanmadır. Yani, bu dallanmalarda 16bit ofset (IP) kullanılır ve dallanma segment içidir. Eğer segmentler arası dallanma yapılmak isteniyor ise FAR PTR eki kullanılır. Örneğin, JMP FAR PTR [SI] komutu ile mikroişlemci SI ile işaretli hafıza bölgesinde 32-bit adres (IP ve CS) olduğunu varsayar. Duruma Bağlı Dallanmalar 8086 mikroişlemcide koşullu (duruma bağlı) dallanmalar kısa dallanmalardır ve daima bir sonraki komuttan sonra + 127 ile -128 byte arasındadır. Genellikle koşullu dallanmalardan önce koşulla ilgili olarak ya TEST yada CMP komutu ile bayrak bitlerinin duruma göre değer alması sağlanır.
52
53
Koşullu dallanmalar işaret (S), sıfır (Z), elde (C), eşlık (P) ve taşma (O) bayrak bit' lerini test eder. Test edilen durum doğru ise program akışı dallanma komutuyla belirtilen adresten devam eder, yanlış ise dallanma olmaz ve bir sonraki sıradaki komut yürütülür. JG, JGE, JE, JNE, JL ve JLE komutları işaretli sayıların karşılaştırılmasında kullanılır. JA, JAE, JB, JBE, JE ve JNE komutları işaretsiz sayıların karşılaştırılmasında kullanılır. JCXZ komutu sadece CX saklayıcısının içeriğini ele alır, bayrakları test etmez. Bu komutta CX = O ise dallanma gerçekleşir, aksi durumda sıradaki komut yürütülür. LOOP Komutu LOOP komutunda CX saklayıcısının içeriği bir azaltılır ve CX = 0 değilse komut ile belirtilen program satır adresine dallanılır. CX sıfır olduğunda bir sonraki komut yürütülür.
Duruma Bağlı LOOP Komutları LOOPE (LOOP while eqııal):Bir eşitlik durumu (Z=1) varken ve CX≠0 ise, etiketle belirtilen yere dallanır. CX=0 sıfır olduğunda veya bayrak bit' leri ile bir eşitsizlik durumu belirtildiğinde bir sonraki komuttun icrasına geçilir. LOOPNE (LOOP while not equal): Bir eşitlik durumu (Z ≠1) yokken ve CX≠0 ise, etiketle belirtilen yere dallanır. CX=0 sıfır olduğunda veya bayrak bit' leri ile bir eşitlik durumu belirtildiğinde bir sonraki komuttun icrasına geçilir. ÖRNEK ASSEMBLY PROGRAMLARI *AX içeriğini 10 ile çarpar;
*AX=BX+CX+DX
SHL AX,1 (2*AX) MOV BX,AX SHL AX,2 (4*2*AX) ADD AX,BX (2*AX+8*AX=10*AX)
ADD BX,CX ADD BX,DX MOV AX,DX
53
*TEST komutu TEST AL,1 JNZ RIGHT TEST AL,128 JNZ LEFT
54
*ilk elemanında aynı dizideki byte veri sayısının tutulduğu bir data dizisindeki (DT[ ] dizisi) sayıların 0Ah değerinden büyük ve küçük olanlarının sayısını veren program. MOV SI,OFFSET DT ;(Dizinin başlangiç adresini al) XOR BX,BX XOR CX,CX MOV CL,BYTE PTR [SI] ;(Dongu sayisi dizinin ilk elemani) MOV DX,CX INC SI REPS: CMP BYTE PTR [SI],0Ah ;( Sayiyi karsilastir) JA REPS1 JB REPS2 REPS1: INC AX INC SI DEC CX CMP CX,0 JNE REPS JMP STOP REPS2: INC BX INC SI DEC CX CMP CX,0 JNE REPS STOP: HLT DT db 10, 11, 21, 3, 41, 51, 44, 46, 12, 13, 27 *Aşağıda ekranın ilk koordinatına ‘A’ karakterini basan assembly programını çalıştırıp inceleyin. Mov dx,0b8000h Mov ds,dx Mov bx,0 Mov byte ptr [bx],041h * İkili tabanda çok byte’lı çarpma işlemi Özel çarpma emri olmayan bir mikroişlemcide 8 bitlik iki sayının kağıt-kalem yöntemi ile çarpılması aşağıdaki örnekle gösterilmiştir. Sonuç kaydedicisinin, çarpılan sayı kaydedicileri uzunluğunun iki katı olması gerektiğine dikkat edin. Burada çarpan sayının bitlerinin aldığı değere bağlı olarak kısmi veya ara toplam adımlarına gelen sayının; her adım için sola kaydığına (sayısal olarak 2 ile çarpıldığını) ve sadece çarpan bitinin 1 olması durumunda çarpılan sayının kaydırılmış haline eşit olduğuna, 0 olduğunda ise 00h sayısının geldiğine dikkat ederek bu işlemi yapan assembly programının nasıl olacağı hakkında fikir yürütün. İkili tabanda çarpma işlemine ilişkin başka bir algoritma aşağıda verilmiştir. 54
55
1) Çarpan ve çarpılan sayıları kaydet. 2) Çarpım kaydedicisini sıfırla. 3) Çarpan sayının en anlamsız bitinden başlamak üzere bitlerini tek tek kontrol et. a)Eğer kontrol edilen bit sıfır ise çarpım kaydedicisini bir bit sağa kaydır. b)Eğer kontrol edilen bit bir ise çarpım kaydedicisini çarpılan sayı ile topla ve bir bit sağa kaydır. 4) Tüm bitlerin kontrolü bittiğinde çarpım sonucunun içeriği çarpım sonucudur.
A 3 x C 4 = 7 C C C 1010 0011x1100 0100 =0111110011001100 çarpılan çarpan = sonuç çarpılan A3 (163)
10100011 x 11000100 00000000 00000000 10100011 00000000 00000000 00000000 10100011 +10100011 0111110011001100
çarpan C4 (196)
ara sonuç ve sonuç 16 bitten oluşur
XOR AX,AX ;sola kayan carpilan icin XOR BX,BX ;BX ara toplam ve sonuc XOR CX,007h ;kaydirma sayisi MOV AX,000A3H ;A3H carpilan sayi MOV SI,00200h ;carpan sayi Bellek adresi MOV WORD PTR [SI],000C4H ;C4H carpani bellege yaz SHR BYTE PTR [SI],1 ; ilk kaydırma JC ON JMP BASLA ON: CLC ADC BX,AX 55
56
BASLA: SHR BYTE PTR [SI],1 JC CBIR SHL AX,1 DEC CX JCXZ DUR JMP BASLA CBIR: SHL AX,1 CLC ADC BX,AX DEC CX JCXZ DUR JMP BASLA DUR: HLT *Aşağıdaki program INT 15h / AH = 86h - BIOS BEKLEME FONKSİYONU ile yaklaşık 5 sn’ lik (5 milyom mikro saniye) gecikme sağlar: mov cx, 4Ch mov dx, 4B40h mov ah, 86h int 15h
; 004C4B40h = 5,000,000 mikro saniye
ALTPROGRAMLAR Altprogramlar yapısal programlama tekniği açısından yazılım mimarisinde önemli bir önceliğe sahiptirler. Belirli ve tekrar yapılması gereken görevler altprogramlar halinde tanımlanarak bir programda bir çok kere kullanılabilirler. ProgramcI böylece hem aynı kodu tekrar tekrar yazma zahmetinden kurtulmuş olur hem de hafıza alanından tasarruf eder. Bir anaprogramdan altprogram çağırma CALL komutu yapılır. Altprogramdan anaprograma geri dönüş ise altprogramın son komutu olan RET komutu ile sağlanır. Altprogramlarla çalışmanın dikkat edilecek yanı altprogram ile ana program arasındaki çağırma ve geri dönüş işlemlerinin fazladan bir zaman kaybı meydana getirmesi ve parametre aktarımlarında çok daha dikkatli olunması gerekliliğidir. Yığın (stack) hafıza; anaprogramdan altprogram CALL komutu ile çağırılırken CALL komutundan sonraki komutun adresini saklamada kullanılır. Altprogramda ise RET komutu ile yığından okunan bu dönüş adresinden itibaren anaprogramın devam etmesi sağlanır. Assembler ortamında altprogram PROC yönlendiricisi (directive) ile başlar ve ENDP yönlendiricisi ile biter. Böylelikle bir altprogramı tanımlanmış olur. PROC yönlendiricisinden sonra altprogramın tipi NEAR (segment içi) veya FAR (segment'ler arası) yönlendiricisi ile bildirilir.
56
57
Yukarıdaki iki altprogram arasındaki fark assembler tarafından RET komutu için üretilen kodun NEAR RET komutu için C3H ve FAR RET komutu için CBH olmasıdır. NEAR tanımlanan altprogramdaki RET komutu yığın hafızadan bir 16-bit sayı çekerek bunu altprogramdan anaprograma dönmek için IP saklayıcısına yerleştirir. FAR tanımlanan altprogramdaki RET komutu ise yığın hafızadan bir 32-bit sayı çekerek bunu altprogramdan anaprograma dönmek için IP ve CS saklayıcısına yerleştirir. Eğer bir altprogram bir çok program tarafından global olarak kullanılacak ise bu altprogram FAR olarak tanımlanmalıdır.
CALL Komutu Aslında bir dallanma komutu olan CALL (çağırma) komutunun JMP komutundan farkı CALL komutu yürütülürken mikroişlemci tarafından otomatik olarak dönüş adresinin yığında saklanması ve altprogramdaki RET komutuyla bu dönüş adresinin yığından çekilerek anaprogramda CALL komutundan sonraki satıra dönülebilmesidir. Bu sayede program akışı bir altprograma aktarılabilir ve tekrar geri dönülebilir. Yakın CALL: 8086-80286 mikroişlemcilerde yakın CALL komutu toplam 3-byte uzunluğa sahiptir: ilk byte işlem kodu, ikinci ve üçüncü byte' lar ise ±32K değişim adresidir. Yakın CALL komutu bu haliyle yakın JMP komutuna benzemektedir. Kısa CALL komutu bulunmamaktadır. 80386 ve üstü mikroişlemciler korumalı modda çalıştıklarında 32-bit değişim kullanarak ±2G byte' lık bir alan sağlarlar. Uzak CALL: Uzak CALL komutu 1-byte işlem kodu ve işlem kodundan sonra dallanılacak altprogramın 2’ şer byte lık IP ve CS adresleri olmak üzere toplam 5-byte uzunluğundadır. FAR CALL komutu yürütülürken dallanmadan önce yığına o anki IP ve CS yerleştirilir. Bu sayede hafızanın herhangi bir yerine yerleştirilmiş bir altprogram çağırılabilir. Saklayıcı Operand' lı CALL: Bu tip dallanmada bir saklayıcı operand olarak kullanılarak (örneğin CALL BX komutunda olduğu gibi) önce o anki IP yığına atılır daha sonra saklayıcının (BX) içeriği o anki kod segment' te bulunan bir altprogramın çağırılması için IP adresi (kod segment ofset adresi) olarak alınır. Dolaylı Hafıza Adresi Kullanan CALL Bu tip dallanmalar farklı altprogramların belirli bir parametreye göre seçilip çağırılmasında 57
58
kullanılabilir. Aşağıdaki programda altprogram adresleri TABLO adresinden itibaren 2-byte aralıklarla saklanmaktadır bu yüzden tabloya erişirken DI saklayıcısındaki indisin iki katı alınır. CS:[BX+DI] ifadesi ile kod segmentte [BX+ DI] ile adreslenen tablo alanına erişilir ve buradan alınacak ofset adres ile DI ile indislenen altprogram çağırılmış olur.
Uzak adresler çağırılmak isteniyorsa FAR PTR kullanılmalıdır. CALL FAR PTR [SI] ile DS alanında SI ile işaretli alandan 32-bit bir adres okunur ve bu adres FAR olarak tanımlı bir altprogramın adresi olarak değerlendirilir. XOR AX,AX ; XOR CX,CX XOR DX,DX MOV Sİ,0200H MOV BYTE PTR[SI],008H CMP BYTE PTR[SI],0 JZ SIFIR MOV CL,BYTE PTR[SI] MOV AL,BYTE PTR[SI] DEC CX CALL FCT JMP SON: SIFIR: MOV AX,1 SON: HLT FCT PROC NEAR JCXZ DON MUL CX DEC CX CALL FCT DON: RET ENDP
58
59
RET Komutu Altprogramın son komutu olan RET dönüş komutu ile anaprograma (CALL komutundan sonraki komuta) sağlıklı bir dönüş gerçekleştirilir. RET ile yakın dönüş için yığın hafızadan 16-bit bir sayı çekilir ve IP saklayıcısına erleştirilir, uzak dönüş için 32-bit bir sayı çekilir IP ve CS saklayıcılarına yerleştirilir. Dönüş program adresleri için sadece yığın hafıza kullanıldığından dolayı alt programlarla çalışırken push ve pop komutlarının kullanımına çok dikkat etmek gerekmektedir. Yığın hafızanın RET komutundan önce düzgün olarak bırakılması yani yığının en üstünde dönüş adresinin olması gerekmektedir. Aşağıdaki TEST altprogramında yığına 4-byte daha veri eklenmiş ve pop komutlarıyla tekrar bu veriler okunmadığından en üstte olması gereken dönüş adresi 4-byte içerde kalmıştır. Bu yüzden RET 4 yani RET komutunun operandlı kullanımı ile SP=SP+4 yapılarak altprogramın başında PUSH AX ve PUSH BX komutlarıyla yığın hafızada içerde kalan ve bu altprogramı çağıran CALL komutundan sonraki dönüş adresine erişim sağlanır. TEST
TEST
PROC PUSH PUSH …… RET ENDP
NEAR AX BX 4
*** 0200h,0201h,0202h,0203h adreslerinde yer alan sıcaklık değişimi sürekli artan ise sogutma için 378h portundan 01fh ve süreli azalan ise 378h portundan ısıtmak için 02fh dış komut verisini gönderen bir assembly programını 8086 emir takımını kullanarak yazınız. mov cx,003h mov bx,0200h mov byte ptr[bx+5],0003h mov dx,0378h basla: mov ah,byte ptr [bx+1] cmp byte ptr [bx],ah jb sogut inc byte ptr[bx+5] jmp lp sogut: dec byte ptr[bx+5] lp: inc bx loop basla mov bx,0200h cmp byte ptr[bx+5],6 59
60
jne off mov al,02fh ;isit out dx,al ;sogut jmp son off: mov al,01fh out dx,al son: hlt
KESME (INTERRUPT)
60
KESME: Klavyeden Okuma
KESME: Yazıcıya Yazdırma
KESME: Ekrana Yazdırma
KESME: Klavyeden Okuma
Diğer işlemlerin yanında klavyeden kullanıcının giriş de yaptığı bir anaprogramı düşünelim. Mikroişlemcinin şimdiye kadar anlatılan dallanma ve altprogram yazılım teknikleriyle klavyeden yapılan karakter girişlerini okurken bu işlemin bitmesini beklemekten başka bir işlem yapması mümkün değildir. Oysa anaprogram normal çalışmasını sürdürürken sadece klavye ile ilgili bir olay olduğunda yapılan girişi okuması ve işine devam etmesi (Ekrana bir yazı yazılması veya yazıcıya yazırma..vs) daha mantıklıdır. Mikroişlemcilerdeki Kesme (interrupt) kavramı burada karşımıza çıkmaktadır.
Anaprogram
Anaprogram
Anaprogram
Anaprogram
Anaprogram
61
Kesmeler tipik olarak bir donanımın mikroişlemcinin INTR (Interrupt Request) ucundan interrupt isteğini bildirmesiyle donanımla veya “INT XX” komutuyla program içinde yazılımla başlatılan veya tetiklenen, aslında bir CALL altprogram çağırma işlemidir. Her iki durumda da herhangi bir anaprogram içindeyken kesme hizmet alt programı (Interrupt Service Routine - ISR) çağırılır. Kesme Vektörleri Kesme vektörü, her biri kesme vektör numarasıyla tanımlanan ve ulaşılan ve mikroişlemci gerçek modda çalışırken hafızanın ilk 1024 byte' lık alanında (003FFH00000H) saklı olan her biri 4-byte’ lık adreslerden oluşur. Bu adresler kesme vektör numarasıyla (Örneğin INT 10H) çağrılan kesme hizmet altprogramının bellek adresleridir. Her bir kesme vektörü bir kesme hizmet programının adresini oluşturan bir IP ve CS içerir. İlk 2 byte IP ve son 2 byte CS adresidir. Dolayısıyla 256 tane farklı kesme vektörü bulunur. Her kesme vektörü bu kesme numarası ile çağırılan bir kesme hizmet programının bellek adresini tutar. Intel ilk 32 kesme vektörünü (0-31) 8086-80486 ve gelecek ürünler için ayırmaktadır. Geri kalan kesme vektörleri (32-255) kullanıcı içindir. Ayrılan vektörlerden bazıları (bölme hatası, Taşma gibi) program yürütme sırasında oluşan hatalar içindir. Bazıları yardımcı işlemci için ayrılmıştır. Diğerleri sistemdeki diğer durumlar ve korumalı modda çalışmada oluşan hatalar içindir. Korumalı modda kesme vektör tablosu yerine her kesme için 8-byte içeren kesme tanımlayıcı (descriptor) tablosu yer alır. Aşağıdaki tabloda açıklamalarıyla beraber kesme vektörlerini ve gerçek modda her vektöre karşı gelen adresleri göstermektedir.
61
62
Kesme Komutları 8086-80486 üç farklı kesme komutuna sahiptir: INT, INTO ve INT 3. Gerçek modda bu komutlardan her biri vektör tablosundan bir vektör okur ve sonra bu vektörle adreslenen kesme hizmet programını çağırır. Korumalı modda bu komutlardan her biri kesme tanımlayıcı tablosundan bir kesme tanımlayıcısı okur. Bu okunan tanımlayıcı kesme hizmet programını belirtir. Kesme çağırma uzak CALL komutuna benzer çünkü dönüş adresi (IP ve CS) yığına yerleştirilir.
INT Programcının kullanabileceği 256 tane farklı yazılım kesme komutu (INT) bulunmaktadır. Her INT komutu 2-byte uzunluğunda olup değeri 0 ile 255 (00H- FFH) arasında değişen bir nümerik operand' a sahiptir. İlk byte işlem kodu ikinci byte vektör tipi numarasıdır. Sadece yazılım kesmesi INT 3 farklılık gösterir ve bu komut l-byte uzunluğundadır. INT komutu ile yapılan işlem FAR CALL komutu ile yapılana benzemektedir. INT komutu 2 byte olmasına karşın FAR CALL 5 byte uzunluğundadır. CALL yerine INT komutunun kullanılması INT komutunun çok kullanıldığı programlarda, önemli bir hafıza tasarrufu sağlar. Kesme vektörünün adresini hesaplarken, kesme tipi numarası 4 ile çarpılır. Örneğin, INT 10H komutu gerçek modda adresi hafızanın 40H hücresinde saklı olan bir kesme hizmet programını çağırır. 62
63
Korumalı modda ise bu sayı 4 yerine 8 ile çarpılır. Çünkü her kesme tanımlayıcısı 8-byte uzunluğundadır. Bir yazılım kesmesi yürütüldüğünde: 1) Bayrak saklayıcısı yığına atılır. 2) T ve I bayrakları temizlenir. 3) CS yığına atılır ve yeni CS için vektörden yeni bir değer okunur. IP yığına atılır ve yeni IP için vektörden yeni bir değer okunur. 4) Yeni CS:IP ile adreslenen yere dallanılır. INT komutu yürütüldüğünde harici donanım kesme giriş ucu INTR' i (Interrup Request) kontrol eden kesme bayrağı (I) temizlenir. I = O olduğunda mikroişlemci INTR ucunu pasifler (disabled) yani bu uçtan gelecek kesmelere cevap vermez. I bayrağı tekrar 1 olduğunda bu kesme giriş ucu aktif duruma gelir. Yazılım kesmeleri (DOS ve BIOS), genellikle sistem programlarını çağırmada kullanılır. Sistem programları, bütün sistem ve uygulama programları tarafından kullanılabilen programlardır. Örneğin, IBM PC'de yazılım kesmeleri, yazıcıları, video birimlerini ve disk sürücüleri gibi donanım birimlerini kontrol etmede kullanılır. ***Aşağıdaki örnek program 10h kesme vektör numaralı yazılım kesmesinin 0EH fonksiyonunu kullanarak AL saklayıcısındaki veri ile belirlenen ASCII karakteri ekrana yazarak sonraki yazmalar için imleç pozisyonunu ayarlar**** ORG 100h
;64K sınırlı program bellek alanı için.
MOV AH, 0Eh
;0Eh alt fonksiyonu için
MOV AL, 'H' INT 10h
; ASCII code: 72 ; print it!
MOV AL, 'e' INT 10h
; ASCII code: 101 ; print it!
MOV AL, 'l' INT 10h
; ASCII code: 108 ; print it!
MOV AL, 'l' INT 10h
; ASCII code: 108 ; print it!
MOV AL, 'o' INT 10h
; ASCII code: 111 ; print it!
MOV AL, '!' INT 10h
; ASCII code: 33 ; print it!
RET *****
; returns to operating system. 63
64
IRET/IRETD IRET komutu gerçek moda ve IRETD komutu ise korumalı modda kullanılır. Kesme dönüş komutu IRET yalnız yazılım veya donanım kesme hizmet programlarında kullanılır. Basit dönüş RET komutundan farklı olarak IRET komutu yığından IP ve CS olarak alınacak 2 tane l6-bit veri çektikten sonra bayrak saklayıcısına bir 16-bit veriyi yığından okur. IRET komutu yürütüldüğünde I ve T eski değerlerine döner. 80286-80486 mikroişlemcilerinde korumalı modda çağırılmış bir kesme hizmet programından dönüş için IRETD komutu kullanılır. IRET komutundan farklı olarak, yığın hafızadan 32-bit IP (EIP) çekilir. INT3 Özel bir yazılım kesmesi olan INT 3 programlarda durma noktası (break point) oluşturmada kullanılır ve uzunluğu l-byte' tır. Genellikle program hatalarını bulurken program akışını kırmada veya kesmede kullanılır. INTO Taşma durumunda oluşan bu kesme taşma bayrağını (O) test eden duruma bağlı bir yazılım kesmesidir. Eğer O = O ise INTO komutu bir işleme neden olmaz, fakat O = 1 ise ve INTO komutu yürütülmüş ise vektör tip numarası 4 olan bir kesme oluşur. INTO komutu işaretli ikili sayıları toplayan veya çıkaran programlarda kullanılır. Bu işlemlerde her zaman bir taşma durumu söz konusudur. JO veya INTO komutu bir taşma durumunu bulmak için kullanılabilir.
Kesme Hizmet Programı Bir kesme hizmet altprogramının tanımlanması daha önce verilen bir altprogram yazma işlemi gibidir. Tek fark bir altprogramda kullanılan RET komutunun yerine kesme hizmet programında IRET komutunun kullanılması ve bu kesme hizmet altprogramının adresinin programın başında ilk işlemler yapılırken kesme tablosuna yerleştirilmesidir. INTS PROC FAR . . . IRET 64
65
INTS ENDP *** org 100h start: ; Video modunu ayarla mod 3:- 16 color 80x25 mov ah, 0 mov al, 3 int 10h ;0000 segmentdeki vectör tablosuna erişim için ES yi sıfırla”0000": mov ax, 0 mov es, ax ; 90h numaralı kesme vektör adresini hesapla mov al, 90h ; ax= 90h * 4 mov bl, 4h mul bl mov bx, ax ; kesme hizmet programı test1 için ofset adresi kesme vector ofset adres alanına yaz mov si, offset [test1] mov es:[bx], si add bx, 2 ; segment adresi kesme vector ofset adres alanına yaz mov ax, cs mov es:[bx], ax int 90h ;yeni kesmeyi çağır ;bir tuşa basılana kadar bekle mov ah, 0 int 16h int 20h
; programı sonlandır
; kesme 90h hizmet programı kodları buradan itibaren başlamaktadır test1: pusha ; tüm kaydedicileri yığına at ; CS=DS olmasına dikkat et push cs pop ds ; set segment register to video memory: mov ax, 0b800h mov es, ax ;msg ‘nin her karakterini yüksek byte renk düşük byte ASCII şeklinde word olarak ekrana yaz lea si, msg ;msg’ nin ofset adresini SI’ ye yükle. mov di, 0 ; ekranın 0 satır 0 sütun noktasından başlamak için print: cmp [si], 0 ;msg sonuna gelindi mi? if "0" then stop. 65
66
je stop mov bl, [si] ;msg’ den ASCII karakteri oku mov bh, 0f1h ; renk ayarla: beyaz geri plan mavi karakter mov es:[di], bx ; ekran belleğe yaz add di, 2 ; sonraki ekran pozşsyonuna git inc si ; sonraki karater jmp print stop: popa ;tüm kaydedicileri yığından al iret ; kesmeden ana programa dön (sırasıyla bayrakları geri yükle dönüş IP ve CS’ yi geri yükle) msg db "test of custom interrupt!", 0 veya aşağıdaki gibi tanımlanan kesme hizmet altprogramı da kullanılabilir Test1 PROC FAR test1: pusha
; store all registers. ; make sure data segment is code segment:
push cs pop ds ; set segment register to video memory: mov mov
ax, 0b800h es, ax
lea si, msg mov di, 0 print: cmp [si], 0 je stop mov bl, [si] mov bh, 0f1h mov es:[di], bx add di, 2 inc si jmp print stop: popa iret Test1 ENDP
; print message, each character is written as ; a word, high byte is color and low byte is ; ascii code: ; load offset of msg to si. ; point to start of the screen. ; if "0" then stop. ; read ascii code from msg. ; set colors: white background, blue text. ; write to vidio memory. ; go to next position on screen. ; next char.
; re-store all registers. ; return from interrupt.
Kesme Kontrol INTR donanım kesmesini kontrol eden iki komut bulunmaktadır. STI (Set Interrupt flag) komutu I bayrağını 1' lemekte ve bu da INTR girişini aktif duruma getirmektedir. 66
67
CLI (Clear Interrupt flag) komutu I bayrağını 0' lamakta ve bu da INTR girişini pasif duruma getirmektedir. Bir yazılım kesme hizmet programının içinde ilk adım olarak genellikle donanım kesmeleri STI komutu kullanılarak aktif yapılır. Donanımla Kesme I bayrağı yetkilendirilmişse ve mikroişlemcinin INTR ucundan bir alçak seviye kesme isteği gelmişse mikroişlemcinin INTA ucu alçak aktif olarak (mikroişlemci kesmeye cevap verebilecek durumda ise) cihaza isteğin görüldüğünü bildirir. Bu durumda kesme isteği yapan cihaz mikroişlemcinin veri yoluna (Data Bus: D0-D7) 1-byte kesme vektör numarasını göndermelidir. Mikroişlemci veri yolundaki bu kesme numarasıyla, kesme vektör tablosuna erişerek ilgili alt programı çağırır. İŞLEMCİ KONTROL VE DİĞER KOMUTLAR Elde Bayrağını Kontrol Elde bayrağı uzun kelime toplama ve çıkarma işlemlerinde kullanılır. Ayrıca, bir altprogramdan dönerken bir hata durumu veya başka bir durumu 1 veya 0 ile çağıran programa bildirmede boolean bayrak olarak ta kullanılır. Elde bayrağını (C) kontrol etmeye yönelik 3 tane komut bulunmaktadır: Elde bayrağını l' le STC (Set Carry) Elde bayrağını 0’ la CLC (Clear Carry) Elde bayrağının tersini al CMC (Complement Carry). WAIT WAIT komutu 80286-80386'da BUSY donanım ucunu, 808618088'de ise TEST ucunu gözler. Bu ucun adı 80286 işlemcisinden itibaren TEST 'ten BUSY 'ye değiştirilmiştir. WAIT komutu yürütüldüğünde bu uç O ise bir şey olmaz ve bir sonraki komut yürütülür. Eğer bu uç 1 ve WAIT komutu yürütülmüş ise mikroişlemci bu ucun lojik O seviyesine dönmesini bekler.
67
68
IBM PC' de, mikroişlemcinin BUSY ucu, genellikle 8087-80387 gibi bir nümerik yardımcı işlemcinin BUSY ucuna bağlanır. Bu bağlantı ve WAIT komutu yardımcı işlemci görevini bitirene kadar 8086-80386 işlemcisinin beklemesini sağlar. HLT HLT komutu program yürütmesini durdurur. Bir durma işleminden çıkmak için 3 yol vardır: bir kesme ile, bir donanım kesmesi ile veya bir DMA işlemi sırasında. Bu komut normalde bir kesmeyi beklemek amacıyla kullanılır. Harici donanım kesmeleri ile yazılım sistemini senkronize etmede faydalıdır. NOP Mikroişlemci NOP (No Operation) komutuna rastladığı zaman, bir işlem yapmayıp sadece çok kısa bir zaman harcar. Bu zaman, bu komutun hafızadan okunma (fetch) süresidir. NOP komutu ayrıca yazılım gecikmeleri sağlamak amacıyla da sık olarak kullanılır.
LOCK Ön Eki LOCK ön eki bir komuta ilave edildiği zaman LOCK donanım ucu lojik O olur. Bu uç genellikle harici yol işlemlerini düzenleyici tüm devreleri ve diğer sistem birimlerini pasif duruma getirir. LOCK ön eki bir veya sıralı birden fazla komutun önünde olduğunda, bu komut veya komutlar kilitli durumda olur.
Bu komutların yürütülmesi sırasında; LOCK ucu lojik O seviyesinde kalır. LOCK: MOV AL, BUFFER[BX] komutu kilitli bir komuta örnektir. ESC ESC (Escape) komutu 8087-80387 nümerik işlemcisine mikroişlemciden bilgi aktarmada kullanılır. ESC komutu yürütüldüğünde mikroişlemci istenirse bir hafıza adresi sağlar, aksi durumda bir NOP işlemi yapar.
68
69
MİKROİŞLEMCİLERDE TEMEL GİRİŞ/ÇIKIŞ (I/O) Mikroişlemciler ve mikroişlemci temelli sistemler en genel ifadeyle günümüzde bir çok sorunun üstesinden gelinmesinde en faydalı yardımcı birer sistemlerdir ancak bu ifade mikroişlemcinin çevresiyle bir şekilde iletişim kurma veya haberleşme özelliği varsa anlamlıdır. Mikroişlemciden dışarıya veya dışarıdan mikroişlemciye veri transferi yani haberleşme işlemi temel olarak:
Haberleşm e Ortamı
Gönderici
Alıcı
1 0 1 0
0 1
1 1
Gönderilen Bitler
Gönderilecek Bitler
Alınan Bitler
Seri Haberleşme Haberleşme Ortamı D0
LSB
1
D1
1
D2 D3 Gönderici D 4
0
D5 D6 D7 MSB
1
Aıcı
0 1 1 0
Adres Yolu Kontrol Yolu
Paralel Haberleşme
1) Bellek Temelli Giriş/Çıkış ile SİSTEM VERİYOLU (DATABUS) üzerinden PARALEL ve SERİ haberleşme 2) Yalıtılmış Giriş/Çıkış ile PARALEL ve SERİ haberleşme metotları ilegerçekleştirilir. İnsan ile makine (mikroişlemcili bir sistem) veya makine ile makine arasında oluşabilecek veri alış verişi günümüzde bu temel metotlara dayanmaktadır. Bellek Temelli Giriş/Çıkış (Memory Mapped I/O):
69
70
Daha önce de bahsedildiği gibi sistem veriyolu üzerinden yapılan işlemlerde en başta MOV komutu olmak üzere mikroişlemci tarafından icra edilen tüm komutların veriyolları üzerindeki etkisi (Adres, veri ve kontrol hatları) ile aynı zamanda belleğe yazma veya okuma yaparken harici cihaz veya unsurlarla veri iletişimi sağlanabilir. Bu tip giriş çıkış işlemlerinin sadece mevcut sistem belleği üzerinden yapılırken dış cihazlarla sistem veri yolu vasıtasıyla direk haberleşme yapacağından dolayısıyla belleğin aynı zamanda başka unsurlar tarafından da kullanılmasından dolayı pek pratik olmayacağı ortadadır. Yalıtılmış Giriş/Çıkış (Isolated I/O): Yalıtılmış giriş çıkış Intel mikroişlemcilerde IN/OUT veya eşdeğer komutlarla belleğe değil de doğrudan giriş çıkış cihazlarına erişim için geliştirilmiştir. IN/OUT ile veri transferi konusunda bahsedildiği gibi bu tip işlemlerde cihazlara özel olarak ayrılmış port adresleri üzerinden erişim sağlanmaktadır. Erişimin bellek üzerinden yapılmaması ise mikroişlemcinin ilgili IOWC ve IORC uçları tarafından belirlenmektedir. Bu sayede yapılan giriş çıkış işlemleri bellekten yalıtılmış olmaktadır. IBM TEMELLİ KİŞİSEL BİLGİSAYARLARDA PARALEL VE SERİ GİRİŞ/ÇIKIŞ 8255 Programlanabilir Çevre Arabirimi (Programmable Peripheral Interface) ile PARALEL Giriş/Çıkış: Paralel giriş çıkış işlemleri için yaygın olarak kullanılan 8255 arabirim elemanı 3 ayrı moda programlanabilen 12 adet giriş/çıkış ucuna (her biri 8-bit olan 3 adet port: PORTA, PORTB ve PORTC) sahip 24 pinli bir entegredir.
8255’ in programlanması için komut saklayıcısının ve on için giriş/çıkış yapılacak portlardan birinin seçilmesi adres veri yoluna bağlı olan A1-A0 uçları ile yapılır. A1 0 0 1 1
A0 0 1 0 1
Fonksiyon PORTA PORTB PORTC Komut Saklayıcı
8255’ in Komut saklayıcısının seçilmesi OUT komutu ile ilgili port adresinin Adres veri yoluna çıkartılması ile portların giriş/çıkış olarak programlanması ve hangi çalışma modunun seçileceği de yine OUT komutu ile bu port adresine yazılacak verinin veri yoluna çıkartılması ile gerçekleştirilir.
70
71
7
6
Komut Byte A 5 4 3 2
1
0
1
Grup B PORTC (C3-C0) 1=Giriş 0=Çıkış PORTB (B7-B0) 1=Giriş 0=Çıkış Mod 0=mod 0 1=mod 1 Grup A PORTC (C7-C4) 1=Giriş 0=Çıkış PORTA (A7-A0) 1=Giriş 0=Çıkış Mod 00=mod 0 01=mod 1 1x=mod 2
7 nolu bit=0 ise komut byte B seçilmiş olur ve sadece 8255 mod 1 veya mod 2 ayarlandığı durumda PORTC’ nin ilgili bitlerini set (1) veya reset (0) yapmada kullanılır.
7
6
Komut Byte B 5 4 3 2
0
x
x
1
0
x Bit Set/Reset 1=Set 0=Reset Bit Seç
Komut byte A grup A ve grup B için programlamada kullanılır. Grup B port uçları hem giriş hem de çıkış olarak programlanabilir, mod 0 ve mod 1 çalışma modlarında çalışabilirler. Mod 0: Grup B için basit giriş ve mandallanmış programlanabildiği temel giriş/çıkış çalışma modudur. 71
(Latched)
çıkış
olarak
72
Mod 1: Grup B için strobed çalışma modudur. Veri alış verişi PORTB’ den yapılırken PortC’den elsıkışma (Handshaking) sinyali alınır. Grup A port uçları da hem giriş hem de çıkış olarak programlanabilir ayrıca mod 0, mod 1 ve mod 2 çalışma modlarında çalışabilirler. Mod 2:
Grup A port uçları için çift yönlü (bi-direction) çalışma modudur.
********* Mikroişlemciye bağlı 0300H adresinde bir 8255 PPI olduğu varsayılarak aşağıdaki programı inceleyelim. PORTA EQU PORTB EQU CREG
300H ;PORTA ADRESİ 301H ;PORTB ADRESİ EQU 303H ;KOMUT SAKLAYICISI ADRESİ
MOV DX, CREG MOV AL,10010000B
OUT . . . MOV IN . . . MOV MOV OUT ****
DX,AL
;KOMUT SAKLAYICISI ADRESLE ;KOMUT BYTE A: GRUP A İÇİN MOD 0, PORTA GİRİŞ,PORTC (C7C4) ÇIKIŞ; GRUP B İÇİN MOD 0, PORT B ÇIKIŞ, PORTC (C3-C0) ÇIKIŞ ;8255 PROGRAMLA
DX,PORTA AL,DX
;PORTA ADRESLE ;PORTA’ DAN OKU
DX,PORTB AL,01H DX,AL
;PORTB ADRESLE ;YAZILACAK VERİ ;PORTB’ YE YAZ
PC’ DE PARALEL PORT İLE GİRİŞ ÇIKIŞ Her bir paralel port 3 tane port adresine sahiptir bunlar veri, durum ve kontrol portlarıdır.
72
73
Veri portunun adresi paralel portun taban adresidir. Örneğin paralel port adresi 378h ile verilmişse veri portuna 378h, durum portuna 379h (378H+1) ve kontrol portuna 37Ah (378H+2) adresleriyle erişilebilir. Çok basit bir veri giriş çıkışı için Paralel portta 2’ den 9’ a kadar numaralı uçlar sırasıyla D0, D1, D2, D3, D4, D5, D6, D7 veri portuna bağlı uçlardır. 18’ den 25’ e kadar numaralı uçlar ise ortak uç olarak kullanılabilmektedir.
MOV MOV OUT
AL, 0FFH DX, 378H DX, AL
;AX = B6H ;DX = 378H adresindeki PC paralel veri portu seçildi ;porttan FFH sayısı gönderildi
Yukarıdaki program parçasında ledler çok kısa bir süre ile yanacak (OUT DX, AL süresince) sonra tekrar sönecektir. MOV IN
DX, 378H AL,DX
;DX = 378H adresindeki PC paralel veri portu seçildi ;komut icrası esnasında porttaki 8-bit veri AL’ ye okunur
******* start: mov ax,0 ;3 byte inc ax ;1 byte lea bx,start ; 3 byte mov byte ptr[bx],40h ; 3 byte mov byte ptr[bx+1],40h ;4 byte mov byte ptr[bx+2],40h ;4 byte mov [bx+3],014ebh ;5 byte jmp start ;2 byte son: inc ax hlt
;1 byte
************
73
74
8086 EMİR TAKIMI: Data Transfer Emirleri: 74
75
IN
: Bir Giriş/Çıkış cihazından akümülatöre data girişi yapar. IN AL,p8 (8-bitlik bir numara ile verilen porttan AL’ye bir byte data girişi yapar) IN AL,DX (Port numarası DX ile indexlenen porttan AL’ye bir byte data girişi yapar. Genelde port numarası 8 bitten büyükse Dx kullanılarak ilgili port indexlenir) LAHF : Bayrakları (FLAGS) AH kaydedicisine yükler. MOV : Dataların taşınması işlemini gerçekleştirir. MOV AL,BL (BL içeriğini AL’ye kopyalar) MOV byte ptr[BP],DL (DL kaydedicisinden bir byte, stack bellekte BP ile adreslenen bellek bölgesine kopyalanır.) OUT : Akümülatörden Giriş/Çıkış cihazına data gönderir. OUT p8,AL (8-bitlik bir numara ile verilen porta AL’den bir byte data girişi yapar) OUT DX,AL (Port numarası DX ile indexlenen porta AL’den bir byte data girişi yapar. Genelde port numarası 8 bitten büyükse Dx kullanılarak ilgili port indexlenir) POP
PUSH
SAHF
: Stack’tan datayı alır. Pop AX POP DS : Stac’a data gönderir. PUSH AX PUSH CS : AH içeriğini bayrak kaydedicisine taşır.
Aritmetik İşlem Emirleri: ADD : Bir kaydedici ve bellek veya kaydedici arasında toplama işlemi yapar. ADD AX,BX (AX =AX+BX) ADD CX,DI (CX=CX+DI) ADD BX,35AFH (BX=BX+35AFH) ADD EDX,1234H (EDX=EDX+0001234H) ADD [BX+DI],DL (DSx10H+BX+DI adresine buradaki data ile DL toplanarak yazılır) Toplama işleminden sonra bayrakların içeriği ( Z=0 sonuç sıfır değilse,C=0 elde yoksa,S=0sonuç pozitifse,O=0 taşma yoksa) kendiliğinden değişir. ADC : Toplama işlemini eldeli yani elde bayrak biti ile yapar. ADC AX,BX (AX =AX+BX+C) CBW : Byte datayı word dataya dönüştürür. CMP : Datayı karşılaştırır ve bayrakbitlerini değiştirir. CMP CL,BL (CL’den BL‘yi çıkartır CL ve BL nin içeriği değişmeyip sadece bayraklar değişir.) DEC : Bir azaltma işlemini gerçekleştirir. INC : Bir arttırma işlemini gerçekleştirir. INC BL (BL=BL+1) INC SP (SP=SP+1) INC BYTE PTR [BX] (Data segmentte BX ile adreslenen bellek bölgesindeki datanın byte içeriği arttırılır.) INC Data1 (Data1=Data1+1 sabitin içeriği arttırılıyor) NEG : Datanın işaretini değiştirir. SBB : Ödünçlü çıkarma işlemi yapar. SUB : Bir kaydedici ve bellek veya kaydedici arasında çıkarma işlemi yapar. SUB CL,BL (CL=CL-BL) Toplama emrindeki yapılar ve bayrakların setlenmesi burada da geçerlidir. ( Z=0 sonuç sıfır değilse,C=1 ödünç,S=1sonuç negatifse,O=0 taşma yoksa) Bit Maniplasyon Emirleri: AND : Lojik and (ve) işlemini gerçekleştirir. AND AL,BL (AL=AL AND BL) AND CL,33H (CL=CL AND 33H) AND AX,[DI] (AX=AX AND [DI] ile adreslenen bellek bölgesindeki değer) BT : Bit test emri. NOT : 1’li komplement emri. OR : Lojik or (veya) işlemini gerçekleştirir. 75
76
OR AH,BL (AH=AH OR BL) OR DH,0A3H (DH=DH OR 0A3H) OR AX,[DI] (AX=AX OR [DI] ile adreslenen bellek bölgesindeki değer) SHL : Lojik sola kaydırma emri. SHL AX,1 (AX içeriği sola doğru bir bit kaydırılır.) SHL BX,12 (BX içeriği sola doğru 12 bit kaydırılır.) En solda ki bit C elde bayrağına giriş yapar, en sağdaki bite lojik 0 girilir. SHR : Lojik sağa kaydırma emri. Yukarıdakinden tek farkı kaydırmanın sağa olmasıdır. RCL : Elde bayrağı üstünden sola döndür RCL BL,6 (BL içeriği sola doğru 6 bit döner) En soldaki bit C elde bayrağı üzerinden en sağdaki bit hanesine geri döner. ROL : Sola döndür. ROL BL,6 (BL içeriği sola doğru 6 bit döner) En soldaki bit hem C elde bayrağına hem de en sağdaki bit hanesine geri döner. RCR
: Elde bayrağı üstünden sağa döndür RCL deki gibi işlem yapar. ROR : Sağa döndür. ROL daki gibi işlem yapar. TEST : Sadece bayrakların değiştiği lojik and işlemi. TEST DL,DH (DL ve DH içerikleri değişmeden DL ve DH and lenir sadece bayraklar değişir.) TEST AH,4 (AH ile 4 and lenir ve sadece bayraklar değişir.) TEST emrinden sonra genelde bir JZ veya JNZ emri takip eder. XOR : lojik xor işl.
Program Transfer Emirleri: CALL : Bir altprogramı çağırır. CALL display (display adıyla yazılan altprograma dallan) INT : Interrupt IRET : Interrupt’dan dönüş emri. JA : Data büyükse dallan.(C=0 ve Z=0 ise) JAE : Data büyük veya eşitse dallan.(C=0 ise) JB : Data küçükse dallan.(C=1 ise) JBE : Data küçük veya eşitse dallan(C=1 veya Z=1 ise). JC : Elde bayrağı (c=1) setlenmişse dallan.(C=1 ise) JE/JZ : Eşitse dallan/Sıfırsa dallan.(Z=1 ise) JG : Data sayıdan büyükse dallan.(Z=0 ve S=0 ise) JGE : Data büyükse veya eşitse dallan.(S=0 ise) JL : Data sayıdan küçükse dallan.(S<>0 ise) JLE : Data sayıdan küçükse veya eşitse dallan.(Z=1 veya S<>0 ise) JMP : Programın başka bir kısmına dallan. JMP next (next: ile etiketlenen program bellek bölgesine git) JNC : Elde bayrağı (c=0) setlenmemişse dallan.(C=0 ise) JNE/JNC : Eşitse değilse dallan/Sıfır değilse dallan.(Z=0 ise) JNO : Taşma yoksa dallan.(O=0 ise) JO : Taşma varsa dallan.(O=1 ise) LOOP : CX kaydedicisindeki sayı kadar döngüyü çalıştır. JCXZ : CX=0 ise dallan. RET : Bir alt programdan geri dönüş emri.
İşlemci Kontrol Emirleri: CLC : Elde bayrağını sıfırla. CLD : Otomatik arttırma modunu seç. CLI : Interrupt pinini yetkisiz yap. CMC : Elde bayrağının komplementini al. ESC : Co-processor için emir. 76
77
NOP STC STD STI VERR VERW WAIT
: Bu komutun icrası esnasında işlemci hiçbir işlem yapmaz. : Elde bayrağını setle. : Otomatik azaltma modunu seç. : Interrupt pinini yetkili yap. : Okuma için erişimi teyit et. : Yazma için erişimi teyit et. : TEST_pin=0 olana kadar işlemciyi askıda tutar.
77