Bu sayfadaki yazılar
Sayfanın metni
Sayfa 73
Effective Address (Etken Adres EA) Bir çok Assembler komutu etken adresleri kullanmamıza izin verir. Etken adresler üç şekilde incelenirler. A) REGİSTERLER B) AÇIK HEDEF OPERANDLAR (Immediate operands) C) BELLEK ADRESLERİ Etken adresler bir 68000 komutunun gerekli operandının nerede bulunacağını belirlerler. Bu operand ya bir register ya bir hafıza adresi ya da bir hedef operanttır. Şimdi de 68000 adresleme modlarına bir göz atalım. Bu bölümdeki örneklerde MOVE komutunu kullanacağız. Ancak adresleme modlarını assembler komutlarının yüzde sekseniyle kullanabilirsiniz. MOVE komutunu örnek olarak kullandık, çünkü MOVE komutu 68000 komutları içerisinde iki operandında da etken adres olabilmesine izin veren tek komuttur. MOVE komutu soldaki operanttan sağdaki operanda veri transferi yapan ve 68000 assembler'inin bel kemiğini oluşturan bir komuttur. I/ Register direk adresleme modları Bu adresleme modlarında 16 register arasında transfer yapılır. a) Veri registerleri direkt Bu adresleme modunda operand 8 veri registerinden birinde bulunur. Bu adresleme modu operandların yerine veri registerleri konularak yapılır. Örnek: Move.L D1,D2: Bu komutla D1 registerinin içeriği D2 registerine atılır. Bu operasyonun uzunluğu Longword'dür, yani 32 bitlik bir işlemdir. Yaklaşık her komut data registerlerini kullanarak iş görürler. Eğer hedef operand veri registeri ise Extend Flag dışında bütün durum kodu register bitleri etkilenirler. Bu tür direkt adresleme modundaki Assembler yazımı şöyledir. MOVE.(B; W; L) Dn,Dn (n-register numarası 0-7) b) Adres registerleri direkt Bu adresleme modunda hedef operand bir adres registeridir. Böyle bir komut verdiğimizde sol operantta bulunan adres registerinin içeriğinde bulunan adresin içeriğini sağ operantta bulunan veri registerine kopyalarız. (Umarız
Bu örnekte Al registerinin içeriğindeki adresin içeriğini D2'ye kopyalamış olduk. I/ Bellek adresleme modları Bellek adresleme modları, AMIGA belleğinin herhangi bir yerini işaretleyip onunla ilgili işlemler yapmamızı sağlar. Bellek adresleme modları çok çeşitlidir. Bu da işlemlerin ve transferlerin en kolay ve en hızlı yoldan yapılmasını sağlar. a) Adres registerleri endirekt Bu mod en kolay kullanılan bellek adresleme modudur. Bu modda soldaki adresin içeriği sağdaki adresin içeriğine kopyalanır. Bu demektir ki operasyonun sağ ve solunda kullanılan adres registerleri Operant için kullanılan de- Berin adresini içeriğinde bulundurur. Yani bu registerler operand olarak kullanılacak değeri kendi içlerinde bulundurmazlar. Örnek Move.B (al),(a2) Bu komut Al adres registerinin içeriğindeki adreste bulunan değeri A2 registerinin içeriğindeki adrese kopyalar (8 bit bazında,çünkü MOVE.B kullanıyoruz) b) Adres registeri indirekt (çoğaltarak) Bu mod yukarıdaki gibi çalışır.Tek farkı adreslerin içerikleri kopya edilirken adresler bir arttırılır. Bu moddaki komutlar bir döngü içine konularak hafızadaki bir bölge diğer bir bölgeye kopyalanabilir. Move.B (al)4,(a2)4- Al registerindeki adresin içeriği A2 registerindeki adrese her seferinde AD-RES bir arttırılarak kopyalanır. c) Adres registerleri indirekt (azaltarak) Yukarıdaki gibi çalışır, tek farkı arttırma yerine azaltma yapılır. Move.B -(a1),-(a2) Al'deki adresin içeriği A2'de bulunan adrese her defasında ADRES | azaltılarak kopyalanır. Böylece registerler arasındaki en önemli adresleme modlarını da öğrenmiş olduk. Bu yazı da burada biterken biz de bittik. Bir dahaki aya branch komutlarında görüşmek üzere hoşçakalın, bu arada bize mektup yağdırmaya da devam edin.Adres
ASSEMBLER'i tam olarak öğrenmek : 64'ler Dergisi istiyorsanız sistemin registeriyle birlik- SM» Assembler köşesi te 68000'in bazını oluşturan bu konu- — MOVE. (B ; la L) ları iyice öğrenmelisiniz. maVeri registerinni 80690 Beşiktaş/İstanbul Bitler 15. 14 13 12 1 10. 9 ÖZ 0 Sd San 2 7 0
T â NN aşık ön iğinizin S RE A yün o a. Bir şarilar eşit > Stalini SUNU Balay Ke 8 2. Dü SÖ Rus” dar rateji ANAN ŞE A birlik lir.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 72
ASSEMBLER
mutlarının üç büyüklükte olması, DA-TA registerlarının üç ayrı büyüklükte kullanılmasını sağlar. Bu büyüklükler, byte(8 — bit), word(16 — bit) ve longword(32 bit)'dur. ADRES REGİSTERLERİ : âdres registerleri de sekiz adettir ve A0'dan A7'ye kadar sıralanırlar. a0'dan a6'ya kadar olan yedi register birbirlerinden bağımsızdırlar ve hepsi aynı şekilde görev yaparlar. Bu registerlerin dışında kalan A7 registeri ise bir tür stack registeri görevini görür. Yani a7 registeri bir anlamda 3. türe girer.Bu registerlerde 32 bitliktir ve aynı DATA registerleri gibi büyüklük olarak üç türde kullanılabilir. Bu registerler hafıza bölgelerini işaretleme ve bu bölgeler arasında transfer yapabilmede sağladığı kolaylıklar bakımından çok önemlidir. Bu arada biraz da A7 registerinden söz edelim. Aslında 68000 stack register olarak a7 registerini kullanmaktadır. Stack dediğimiz olay,bazı verilerin,pa- Tametrelerin ya da bazı konfigürasyonların saklandığı bellek alanıdır. Sistemimizde kullanılan bir de (sp) dediğimiz stack pointeri vardır. Fakat bu aşağıda anlatılmıştır. STACK REGİSTERİ 68000 microchip'inin 8 adet adres registeri kullandığını biliyoruz. Bunlardan A7 biraz önce söylediğimiz gibi stack pointer olarak kullanılır. Sistemin kullandığı ikinci stack pointeri sp'dir. Stack Pointer'ın görevi, AMIGA'nın en önemli özelliklerinden olan MUL-TITASKING özelliğini kullanmamızı sağlar. Stack Pointer'ları bazı mikro işlemcilerin komut setlerinde bulunan PUSH ve POP operasyonlarını yapmamıza yarar. Bu operasyonları stack pointerine registerlerin MOVE edilmesi ya da Stack Pointer'in registerlere MOVE edilmesiyle yapabiliriz.
tack register'i iki şekilde
1/ User privilege state Bu durumda stack pointer sadece sistem kullanıcısının emri altındadır. Stack Pointer genellikle bu durumda kullanılır. II/ Supervisor privilege state : Bu durumda stack pointer kısmen sistem tarafından kontrol edilir. Bu durum çok ender kullanılır. 68000 mikro işlemcisinin dışında bir çok mikro işlemci assemblerleri SP registerini stack pointer registeri olarak kabul eder. SP'nin iki türünün kısaltılmış ismi USP (User stack pointer) ve SSP (Supervisor stack pointer)'dir. Fakat stack pointer olarak genellikle A7 registeri kullanılır. Çünkü A7 registeri istenen herhangi bir anda sistem tarafından aktif olup olmama konusunda kontrol edilir. Ayrıca USP ve SSP assembler source'unda stack operasyonları olarak kullanılmazlar. DURUM KODU REGİSTERİ 68000'in kullandığı bu register 16 bitlik bir registerdir. Registerin 16 bitinin de kullanılması söz konusu değildir. Bu bitlerden bir kısmı 68000'e sonradan yapılacak eklemelerde kullanılmak üzere ayrılmıştır. Zaten çoğunluğu da 68000'den daha güçlü bir yapıda olan 68020 mikro işlemcisi tarafından kullanılır. Durum kodu registerinin yapısı TAB-LO 1'de verilmiştir. Şimdi bu bitleri tek tek açıklıyoruz. Bu bitlerden boş olanları ileri kullanım alanları için , 15-8 arası bitler sistem için, 7-0 arası bitler kullanıcı için ayrılmıştır. Trace Modu (T/15.bit) Bu bitin 1 değerini alması sistemin Trace modunda olduğunu gösterir. Trace modu herhangi bir programın ardında n hemen başka bir programın çalıştırılmasını sağlar. (BASIC'te gördüğünüz Trace ON/OFF menüsünün yaptığı işler Trace modunun aktivitelerinden birisidir. ) Supervisor Modu (S/14.bit) Bu bitin 1 olması sistemin Supervisor durumunda olduğunu gösterir. Eğer sistem Supervisor durumundaysa Merkezi işlem birimi kullanıcı modunda kullanılamayan bazı komutları kullanabiliriz. Bu komutlar RESET , STOP ve RTE komutlarıdır. Interrupt MASK (12,11,10/10,9,8.bitler) Bu bitler sistemin o anda hangi tür interrupt kullandığını belirtir. Bu bitler hakkında ileriki sayılarımızda daha geniş bilgiler bulabilirsiniz. Extend Flag (X/4.bit) Bu bit operasyonların büyüklük parametrelerini belirler. Bu bit 68000 mikro işlemcinin önemli özelliklerinden birisini gösterir. Bu bit olmasa mecburen tüm işlemlerimizi 32 bit bazında yapacaktık, bu da önemli ölçüde zaman kaybına neden olacaktı. Carry Flag (C/0.bit) Bu bit Commodore 64'ten de tanıdığımız Carry bitinin görevini üstlenmiştir. Ayrıca daha sonra göreceğimiz Shift işlemlerinde de kullanılır. Overflow Flag(V/1.bit) Bu bit sistem içinde oluşan bazı overflow yani aşırı yüklenmelerin belirlenmesinde kullanılır. Bu bit aynı Carry flag'ta olduğu gibi bir çok Shift operasyonundan etkilenir. Zero Flag(Z/2.bit) Zero flag eskiden Commdore 64'te assembler çalışan zavallılar bilirler. Yapılan bir operasyonun sonucunda işlem sıfır çıkarsa bu flag 1 değerini alir. Eğer işlem 0'dan farklı olursa bu flag 0 değerini alır. Çıkan değerin negatif olup olmadığını anlamak için negative flag kontrol edilir. Negative Flag(N/3.bit) Biraz önce değindiğimiz operasyonların sonuçlarının negatif değerlerinin incelendiği bit'e Negative Flag denir. Genellikle bir önceki bitimiz olan Zero FHlag'la birlikte kullanılır. Program sayacı (PC) Program counter yani program registe- Ti 32 bitlik bir registerdir. Fakat sadece 24 adet bit chipin dışına itilebilir. Ancak PC'nin 32 biti de çalışır ve PC üzerindeki operasyonlardan etkilenirler. Bu registerin ilk 8 biti 68000 tarafından kullanılır.Bu yüzden bu ilk 8 bit sistem tarafından göz önüne alınmazlar. Jump,Branch gibi emirler bu registeri etkiler. Eğer PC'yi herhangi bir şekilde okumak isterseniz LEA komutuyla bir sonraki adres registerine yükleyerek değerini bulabilirsiniz. Böylece 68000 microchip'inin register tablosunu tam olarak vermiş olduk. ADRESLEME MODLARI Bu bölümde 68000'in 14 adet olan adresleme modlarında sizlere en yararlı olabilecekleri vereceğiz. Bu çeşitli adresleme modları 68000'in gücünü ortaya çıkaran nesnelerdir. Eğer AMIGA