AMIGA ASSEMBLER

Merhaba Assembler'cılar. Geçen sayıda, 68000'in komutlarına başlayıp; taşıma işlemi yapan MOVE komutunu görmüştük. Bu sayıda ise MOVEQ komutunu, adres registerlerine atama yapan LEA ve bir register veya hafıza adresindeki sayıyı başka bir sayı ile toplayan ADD komutunu parametreleriyle birlikte göreceğiz. Bunların yanısıra diğer aritmetik işlemleri yapan SUB (çıkarma işlemi), MULU (Çarpma işlemi), DIVU (bölme işlemi) ve registerler arası veri alışverişi yapmayı sağlayan EXG komutlarını da inceleyeceğiz.

MOVE komutunun çalışmasını daha iyi anlamanız için C-MONITOR'de size eğlenceli bir örnek verelim. İlk önce C-MONITOR'u yüklemeniz gerekecek. Eğer yüklemeyi başardıysanız CLI window'un en sonunda C-MONITOR ile ilgili başlık yazıları ve bir noktanın yanında kursorumuz belirecektir. Şimdi RETURN tuşuna basarak MONITOR'un tüm komut listesine şöyle kısaca bir göz atın. Bu komutlar, C-MONITOR'de noktadan sonra yazılarak çalıştırılırlar. Daha sonra sırası geldikçe bu komutların hepsini öğreneceğiz.

Şimdi noktadan sonra şunları yazın ve RETURN tuşuna basın.

.n 50000 RETURN'e basar basmaz alt satırda şunlar belirecektir.

050000: Kursor şimdi iki noktanın yanındadır. Kursordan itibaren yazmaya devam ediyoruz.

050000: MOVE.B * 252, SBFE00l 
(RETURN tuşu)

050000: RTS (RETURN tuşu) 05000A: (RETURN tuşu) Son satırda hiçbir komut yazmadan doğrudan RETURN tuşuna bastık. Nedeni, n 50000 ile girdiğimiz Assembler Edit modundan çıkmak içindir.

Şimdi noktanın yanında olan kursorun oraya şunları yazın.

.G 50000 (RETURN tuşu) Burada RETURN tuşuna bastığınızda, bütün satırları doğru yazdıysanız görünürde hiçbir değişiklik olmayacaktır. Fakat Amiga'nızın kırmızı POWER LED'ine baktığımızda sönmüş veya biraz kararmış olduğunu görürüz. LED'in sönmeyip kararması, daha çok yeni 1.3 versiyonlarda gözlenebilir. Version 1.2 ve bazı 1.3 KICKSTART'larda LED tamamen kararacaktır.

Şimdi ve olayın nasıl olduğuna, yani yukarıdaki iki satırın daha doğrusu bir satırın (MOVE.B #252,$BFE001) AMIGA'mızın POWER LED'ini nasıl söndürdüğüne göz atalım.

AMIGA'nın ROM'undaki $BFE001 no'lu adresin 1'inci BIT'i AMIGA POWER LED'in açık veya kapalı olmasına karar verir. Yani bu Bit 1 olunca LED On (Açık), 0 olunca LED Off (Kapalı) durumundadır.

Biz ilk satırdaki MOVE komutunu işleme sokmadan önce bu adreste ($BFE001) 252 sayısı vardı. Yani birinci bit 1 idi. MOVE komutu işleme girince adresteki birinci bit 0 oldu (254). Ve LED buna bağlı olarak söndü.

$BFE001 = %11111100 = 252 (ilk hali)

$BFE001 = %11111110 = 254 (Move komutundan sonraki hali)

1. birinci bit değişiyor. Amiga hafıza adreslerinde bit'lerin sıralanışı şöyle olmaktadır (Adreste 252 değeri olduğunda): Değer = 1111110 0 Bit Numarası = 7 6 5 4 3 2 1 0

Bit'ler soldan sağa doğru 0'dan itibaren sıralanırlar, örnekte değeri 0 olan ilk bit'in numarası da 0'dır. İkinci bit'in numarası 1, 3'üncünün değeri 2 ve böylece devam eder.

Amiga'nızın ROM belleğinde bunun gibi daha birçok bit çok büyük işler görmektedir.

MOVEQ KOMUTU

Bu komuta MOVE komutunun hızlandırılmışı diyebiliriz. Fakat MOVEQ komutunun yüksek hızı, ona bazı kısıtlamalar getirir.

İlk olarak işlem yaptığı modlar, sade-

AMIGA ASSEMBLER

ce BYTE modundaki sayılar olmak zorundadır. Yani 0'dan 255'e kadar olan sayıları taşıyabilmektedir. Aslında taşıma kelimesi yanlış oluyor. Çünkü sadece Data Registerleri ile çalışmaktadır. MOVEQ komutu ile ne bir adresten sayı alabilir, ne de başka bir yere koplayayabilirsiniz. Sadece herhangi bir data registerine bir sayı, daha doğrusu BYTE uzunluğunda (0-255) arası bir sayı gönderebilirsiniz. Tabii çok yüksek bir hızda çalışmaktadır. MOVE komutunun aynı işlemi bir defa yapana kadar, MO-VEQ komutu 3 defa tekrarlayabiliyor. MOVEQ komutunun bunlar dışında bir kısıtlaması daha vardır. Komut ile atama yaptığınızda, yapılan işlem data registerinin tümüne hitap eder. Yani MOVEQ * 17,D0 dediğinizde D0 registerindeki değer tamamen (32 bit olarak) silinir ve yerine 17 değeri gelir. Tabii MOVE komutundan 3 kat hızlı olarak. D0 = 00000017 Oysa MOVE.B komutu ile aynı örneği tekrarladığımızda; MOVE.B ** 17,D0, komutu data registerinin sadece ilk bayt'- ına etki eder. Örneğin komut işleme girmeden önce D0'da 40602303 değeri bulunsun. Komut işleme girdikten sonra; D0 = 40602317 olur.

Bu iki farkın programlamada yerine göre çok büyük yararlarını göreceksiniz.

MOVEM KOMUTU

Bu komut yardımı ile Adres ve Data registerlerinin değerlerini, hafızada istediğimiz yere gönderip tekrar lazım oluncaya kadar orada saklayabiliriz. Ve istediğimiz zaman onları yine MOVEM komutu ile çağırıp kullanabiliriz.

Bu komutun Amiga'da işlevi büyüktür. Bir sürü programın çalışması esnasında, registerlerin değerlerinin taşınması ve birbirlerine karışmaması için kullanılmaktadır.

Formatı ise şu şekildedir. MOVEM register numaraları, saklanacakları adres

Register numaraları olarak, saklamak istediğimiz adres ve data registerlerini kullanabiliriz. Register numaralarını ister tek tek, ister kombine olarak kullanabiliriz.

örnek olarak; D4 Yalnız D4'ü gönder D4-D6 D4,D5,D6'yı gönder D2-D3/A0-A3 D2,D3,A0,Al,A2,A3'ü gönder

D0/A3 D0 ve A3'ü gönder örneklerde görüldüğü gibi Adres ve Data registerleri bölme işareti ile (/) birbirlerinden ayrılıyorlar. Eksi işaretini (- ) kullanarak da aynı gruptan birkaç register i birden ifade etmiş oluyoruz.

Saklanacak adres olarak, ister herhangi bir adres yazarız. İstersek Stack Pointer'a atarız. Tabii SP (Stack Pointer)'e göndermek daha seri ve zahmetsiz olur. Nedeni ise onları tekrar SP'den alana dek gözden uzak bir bölgede bizi beklerler. Şimdi MOVEM komutunun modlarını açıklayıcı birkaç örnek verelim.

1. Kullanım Modu : MOVEM.L D0- D1/A4-A5, (A0)

D0,D1 ve A4,A5 registerlerinin içerikleri (AO)'in gösterdiği adrese saklanacak.

2. Kullanım Modu : MOVEM.L D0/A2-A3, $40000

D0 ve A2.A3 registerleri $40000'den itibaren LONGWORD olarak yerleşecekler.

3. Kullanım Modu : MOVEM.L D0- D7/A0-A6,-(SP)

DO'dan D7'ye kadar ve AO'dan A6'ya kadar olan registerler (kısaca bütün registerler) Stack Pointer'in gösterdiği adresin arkasına yerleşecekler.

Artık registerleri istediğimiz yerlere saklamayı öğrendik. Şimdi onları tekrar kullanılmak üzere okumayı görelim.

4. Kullanım Modu: MOVEM.L (SP) + ,D0-D7/A0-A6

Stack Pointer'in gösterdiği adresteki LONGWORD'ları sırası ile D0'dan D7'ye ve AO'dan A6'ya kadar olan registerlere (kısaca bütün registerlere) gönder.

Bu komut akıllıca bir kullanım sayesinde beni çok büyük dertlerden kurtardı. Ayrı ayrı iki tane programdan alınmış ve bir arada kullanılacak iki rutin düşünün. Ve programın akışı sırasında bu iki rutine tekrar tekrar erişmeniz gereksin. Bu iş kolay. Fakat iki rutin de aynı registerleri kullanıyorlarsa ve birinci döngüden sonra registerlerdeki sayılar ikinci döngü için bir anlam ifade ediyorsa program çalışmayacaktır. Şimdi MOVEM komutunun zamanı gelmiştir. Hemen rutinlerin başına ve sonuna MOVEM komutlarını ekleyerek probleminizi çözebiliriz.

Bunlara ek olarak, MOVEM komutuna her programımızda ihtiyaç duyacağız. Programlarımıza başlamadan önce MOVEM komutu yardımı ile bütün registerleri Stack Pointer'e atacak ve programlarımızdan çıkarken onları SP (Stack Pointer)'den tekrar okuyup, registerlere yazacağız.

LEA KOMUTU Orijinal adı (LOAD EFFECTIVE ADDRESS) olan bu komutun yaptığı iş, herhangi bir adres registerine bir adresi atamak.

Aslında bu komutun yaptığı işi MOVE komutu da yapıyor. Fakat LEA kadar hızlı olmuyor. LEA komutunun görevi adresleri taşımak olduğundan sadece LONGWORD olarak çalışıyor.

Örnekler; 1. Kullanım Modu : LEA $50000,A0 $50000 adresi değerini A0 adres registerine gönder.

2. Kullanım Modu : LEA (A0),A2 (A0) registerinin içeriği olan adresi, A2 adres registerine gönder. 3. Kullanım Modu : LEA 4(A0),A2 Bu örneğin yukarıdakinden değişikliği A0 adres registerinin içeriğine artı 4 eklenerek çıkan sonucun A2 adres registerine gönderilmesidir. Yani diyelim ki (A0)'da $50000 var ve yukarıdaki komut icra oldu. Sonuçta $50000'e başındaki pozitif sayı yüzünden 4 eklenir ve ortaya çıkan $50004 değeri A2 adres registerine gönderilir.

Başlangıçta MOVEA.L #$50000, A0 komutu ile LEA $50000, A0 komutu arasında hiçbir fark gözükmese de zamanla konuda ilerlediğinizde aradaki büyük farkı göreceksiniz.

Bu arada MOVE.L #$50000, A0 ile MOVEA.L #$50000, A0 arasında hiçbir fark yoktur. MOVE'dan sonraki A harfi, değerin bir adres registerine atanacağını belirler.

Aynı şekilde MOVE.L #14,D0 ile MOVE.L #14,D0 arasında da hiçbir fark yoktur. Biz bu A ve I harflerini yazmasak da Monitör programları (C MONİTÖR ve SEKA ASSEMBLER) onları bizim kullanımımıza göre düzenleyeceklerdir.

ADD KOMUTU Add komutu bir hafıza adresindeki veya bir adres veya data registerlerindeki değerlerin üzerlerine yeni bir değer eklemek için kullanılır. Bu işleme toplama adını veriyoruz. Çalışması gayet basittir. Byte, Word, Longword olarak çalışabilmektedir. Yani ADD komutunun Longword modu ile 0'dan $FFFFFFFF'e kadar olan sayıları rahatlıkla toplayabileceğiz. Kullanım modları şöyledir.

1. Kullanım Modu: ADD.L #10,D0 veya ADDI.L #10,D0

D0 data registerindeki değere 10 daha ekliyoruz. Toplama sonucu ortaya çıkan değer yine D0 registerine yazılmaktadır.

2. Kullanım Modu : ADD.L #255,A0 veya ADDA.L #255,A0

A0 adres registerindeki adresin değeri 255 artırılmış oluyor. 3. Kullanım Modu : ADD.B #$18, $50000

$50000 nolu hafıza adresindeki değeri $18 artırmış oluyoruz. Fakat $50000 adresinde $F0 değeri varsa ve $F0 + $10 işlemini BYTE olarak toplarsak sonuçta $50000'de 00 değeri alır. Çünkü toplamada bir BYTE'ın alacağı değerleri geçmiş bulunuyoruz. Bu yüzden komut sadece bir Byte'a sığabilecek kısmını $50000'e yazacak. Ve bilgisayar EXTEND ve CARRY Flagları ile bizi, toplama işleminde taşma olduğuna dair uyaracaktır.

4. Kullanım Modu : ADD.L D0,D1 Bu komut ile, D0 data registerindeki LONGWORD değeri D1 registerindeki değere eklenmesini ifade ediyoruz. Komutu aynı şekilde LONGWORD yerine

WORD ve BYTE modlarında kullanarak, data registerleri arasında birer veya ikişer gruplar halinde de toplama işlemi yapabiliriz.

5. Kullanım Modu : ADD.L A0, A1 A0 adres registerindeki değerin, A1 registerindeki değere eklenmesini sağlarız. Bu mod hakkında bilmemiz gereken bir şey daha var: ADD komutu ile bir adres registerindeki değeri, başka bir adres registerine toplatırken sadece WORD ve LONGWORD olarak çalışmamız gerekir.

6. Kullanım Modu : ADD.L $50000, A0

$50000 hafıza adresindeki sayı, A0 adres registerindeki değere eklenir.

7. Kullanım Modu : ADD.L $50000, D0

$50000 hafıza adresindeki sayı, D0 data registerinin içindeki sayıya eklenir. 8. Kullanım Modu : ADD.L (A0), D1 örneğimizde A0 adres registerinde bulunan adresin gösterdiği sayıyı D1 data registerinde bulunan sayıya eklemesini ifade etmiş oluyoruz.

Bu arada registerler hakkındaki bilginize yeni bir şey daha eklemek istiyorum. Yukarıdaki örnekte olduğu gibi parantez içinde sadece Adres Registerleri yazılabilir. Data registerleri ise sadece taşıma ve saklama işlemleri için kullanıldıkları için parantez içinde kullanılamazlar. Daha önce de öğrendiğimiz gibi; Parantez içindeki adres registeri ifadesi, aynı adlı adres registerinin gösterdiği adresin hafıza adresine karşılık gelen sayının anlamında kullanılmasıdır. Biraz karışık olduysa aşağıdaki örnek ile daha iyi anlayacaksınız.

1- LEA $50000, A0 MOVE.L (A0), $60000 2- MOVE.L $50000, $60000 1. örneğimizin ikinci satırı ile 2. örnek arasında işleyiş bakımından hiçbir fark yoktur. Fakat 1. örnekteki kullanım ikincisinden çok daha esnek oluyor. Registerdeki sayıyı rahatlıkla değiştirerek aynı işlemi yeni adres için tekrarlayabiliriz. Tabii bundan başka iki kullanım arasında mükemmel bir hız farkı olduğunu söyleyebilirim. Çünkü işlemci, komutun ilk parametresini değer olarak komutun bulunduğu adresten almak yerine, doğrudan içindeki adres registerlerinden okuması çok daha hızlı ve seri oluyor. 9. Kullanım Modu : ADD.L D0, (A0) ADD komutu burada D0 data registerindeki sayıyı, A0 adres registerinin gösterdiği adresteki sayıya ekleyecektir.

ADDQ KOMUTU ADDQ komutu, genel olarak ADD komutu formatında çalışır, özelliği bazı işlemleri ADD komutundan çok daha hızlı yapabilmesidir. Fakat bu hızlı çalışması 1'den 8'e kadar olan sayıların toplanması için geçerlidir. Ve ADDQ ile bu işlemleri ADD komutundan 2 kat daha hızlı olarak yapabilirsiniz. Tabii komut BYTE, WORD, LONGWORD kullanımları destekliyor.

Komut ile ADDQ.L #1, D0'den ADDQ.L #8, D0'e kadar olan toplamaları rahatlıkla yapabileceksiniz. Fakat 9 ve 9'dan büyük sayıları kullanmak isterseniz, mecburen ADD komutunu kullanmak zorundasınız. ADDQ komutunun kullanım modları aynen ADD komutundaki gibidir.

Şimdi diyeceksiniz ki; zaten bilgisayarımız 7.16 MHz ile çalışıyor. Yani bir saniyede yaklaşık 1 Milyon toplama işlemi yapıyor. Ne gerek var ki 1'den 8'e kadar olan toplamalarda ADDQ kullanmaya?

Aslında hiç de düşünüldüğü gibi olmuyor. Zamanla makine dilinde yapılan işlemlerin 1 ve 8'leri toplamaktan başka bir şey olmadığını göreceksiniz. Ve bilgisayarınızın grafik işlemlerini düzenlerken bol bol taşıma yapıp, bir hafıza bölgesindeki sayıları başkalarına ekleyip, bol bol toplama çıkarma işlemi yapıldığına şahit olacaksınız.

Tabii hal böyle olunca, ADDQ gibi ufak sayılarla hızlı işlem yapan komutlar, profesyonel programcıların vazgeçilmez araçları oluyor.

SUB KOMUTU

Çıkarma işlemleri için bu komutu kullanacağız. İşleyişi ADD komutu ile benzerlik gösterir. Tek fark verilecek sayının değerinin ikinci sayının değerinden çıkarılmasıdır. Komutu Byte, Word, Longword olarak üç modda da kullanabiliriz. Sub komutu da Add komutu gibi hexadecimal olarak $00000000'dan tutun $FFFFFFFF'e kadar olan sayıları rahatlıkla birbirlerinden çıkarabilir.

1. Kullanım Modu: SUB.L #10, D0 veya SUBI.L #10, D0

Yukarıdaki yanyana yazılı iki örnek de aynı anlama gelmektedir. D0 data registerindeki değerden 10 çıkarıyoruz. Çıkarma işlemi sonucunda ortaya çıkan sonuç D0 registerine yazılmaktadır.

2. Kullanım Modu: SUB.L #255, A0 veya ADDA.L #255, A0 örnekte A0 adres registerindeki sayıdan 255 çıkarıp sonucu A0'a tekrar yazıyoruz.

3. Kullanım Modu: SUB.B #$10, $50000

$50000'deki sayıdan 10 çıkarıyoruz. Yukarıdaki örneğimizi SUB.L #$10, $50000 diye değiştirirsek, çıkarma işlemi $50000'deki 4 BYTE'ı birden etki eder. Tabii örnek böyle olunca sayımız LONG

WORD olarak işleme giriyor. Ve $50000'den $50003'e kadar olan dört hafıza bölgesinde saklanıyor. Bu arada bilmeniz gereken başka bir nokta da şudur:

Diyelim ki, $50000 hafıza adresinde LONGWORD olarak $00000000 olsun. Ve bir "SUB.L #1, $50000" komutu ile $50000'deki LONGWORD sayıyı bir eksiltmek istedik. Fakat zaten adresteki sayı $00000000. Çıkarma işlemi olursa sayı eksi işaretli bir sayı olacak. Fakat hafıza bölgesindeki bu sayının eksi gösterilmesi nasıl olacak? Bu gibi durumlarda bilgisayar şöyle bir mantık yürütüyor: LONGWORD olarak en büyük sayı $FFFFFFFF olduğuna göre, $00000000'dan sayı çıkarılırsa eksi yerine $FFFFFFFF'den geriye doğru sayı çıkarılıyor. Eksi işareti ise, NEGATIVE bayrağından okunabiliyor.

Makine dilinde örnekteki gibi $00000000'dan 1 çıkarsa, sonuç $FFFFFFFF olur. Aynı mantıkla $00000000'dan 5 çıkarırsak sonuç $FFFFFFFB olur.

4. Kullanım Modu: SUB.L D0,D1 Bu komut ile D0 data registerindeki LONGWORD değeri D1 registerindeki değerden çıkarmasını ifade ediyoruz. Komutu aynı şekilde LONGWORD yerine WORD ve BYTE modlarında kullanarak data registerleri arasında birer veya ikişer gruplar halinde de çıkarma işlemi yapabiliriz. 5. Kullanım Modu: SUB.L A0,A1 A0 adres registerindeki değeri, A1 registerindeki değerden çıkarmasını sağlarız. Bu mod hakkında bilmemiz gereken bir şey daha, SUB komutu ile bir adres registerindeki değeri, başka bir adres registerinden çıkarırken sadece WORD ve LONGWORD olarak çalışmamız gerektiğidir. 6. Kullanım Modu: SUB.L $50000,A0 $50000 hafıza adresindeki sayı, A0 adres registerindeki değerden çıkarılır. 7. Kullanım Modu: SUB.L $50000, D0 $50000 hafıza adresindeki sayı, D0 data registerinin içindeki sayıdan çıkarılır. 8. Kullanım Modu: SUB.L (A0), D1 örneğimizde A0 adres registerinde bulunan adresin gösterdiği sayıyı D1 data registerinde bulunan sayıdan çıkarılmasını ifade etmiş oluyoruz. 9. Kullanım Modu: SUB.L D0, (A0) SUB komutu burada D0 data registerindeki sayıyı, A0 adres registerinin gösterdiği adresteki sayıdan çıkaracaktır.

SUB komutunun parametrelerini de gördükten sonra şimdi SUBQ komutunu anlatalım.

SUBQ KOMUTU SUBQ komutu ADDQ gibi işlem yapar. SUB komutundan farkı ise, 1'den 8'e kadar olan sayılarla işlem yapması ve SUB komutundan iki kat hızlı iş görmesidir.

Örnek: SUB.L #1, $50000 ile yapacağımız çıkarma işlemini SUBQ.L

#1, $50000 ile 2 kat daha hızlı yapabiliriz.

SUBQ komutunun diğer parametrelerini yazmaya gerek görmüyorum. Çünkü yukarıdaki SUB komutu parametreleri ile tamamen aynıdır. Tabii tek fark SUBQ'nun 1'den 8'e kadar sayılarla çalışma kısıtlılığı olmasıdır.

Artık Amiga Assembler'da toplama ve çıkarmayı öğrenmiş durumdayız. Bu iki işlemde problemsiz olarak ve diğer programlama dillerden yüzlerce kat daha hızlı çalışıp, Assembler dilinin verdiği rahatlık ve yüksek hız ile klasımızı konuşturduk.

Şimdi sıra dört işlemden geriye kalan, çarpma ve bölme işlemine geldi. Makine dilinde tabii ki bu işlemlerde bir hayli hızlı şekilde yürütülüyor. Fakat işlemci çarpma ve bölme işlemlerini toplama ve çıkarma işlemleri kadar hızlı yapamıyor. Nedeni ise çarpma ve bölme işlemleri sırasında bu işlemleri toplama çıkarma işlemlerine dönüştürüp, bol bol toplama çıkarma yapıp zaman harcaması oluyor.

MULU KOMUTU Görevi çarpma işlemi olan bu komutun kısıtlaması sadece WORD olarak işlem görmesidir. Gerçi yine de bu, o kadar büyük bir kısıtlama olduğu söylenemez. Çünkü komutun bu haliyle bile $FFFFFFFF x $FFFF sayıları arasında olan çarpma işlemlerini rahatlıkla yapabiliriz. Fakat sekiz haneli hexadecimal sayılar da işinizi görmezse; artık bana, kendi çarpma rutinlerinizi yazmanın zamanı gelmiştir demekten başka bir şey kalmıyor.

Komutun kullanım modları ise aşağıdadır. 1. Kullanım Modu: MULU #$10,D0 D0 data registerindeki sayı $10 ile çarpılır. İşlemin sonucu olan sayı D0'a yazılır.

2. Kullanım Modu: MULU $50000,D0 $50000 hafıza adresindeki sayı ile D0 registerindeki sayı çarpılır. Sonuç D0 registerine yazılır. Burada dikkat edilmesi gereken bir şey vardır. $50000'den alınan sayı her zaman WORD olacaktır. Diğer bir deyişle MULU komutundaki çarpımın ilk sayısı (komut parametresinin ilk hanesi) iki byte'ı geçemez. Bir örnek ile daha iyi açıklayalım: $50000 adresinde sırası ile $01, $00, $45, $00 byte'ları sırası ile dursun. D0 data registerinde de $15 değeri bulunsun. Örnek komutumuz ise şu olsun: MULU $50000,D0

İşlemci bu komut ile şu işlemi yapar. $50000 adresindeki WORD değeri alıp ($0100) D0 registerindeki $15 ile çarpar. $0100 x $15 = $1500

Komuttan sonra ortaya çıkan sonuç ($1500) D0 registerine yazılır.

3. Kullanım Modu: MULU (A0), D0 Duruma göre MULU komutunun ilk parametresine doğrudan direkt hafıza adresi yazmak yerine, adres registeri üzerinden kullanabilirsiniz. Yukarıdaki örnekte olduğu gibi A0 adres registerinin gösterdiği adresin içindeki sayıyı, D0 data registeri ile çarpmasını ifade etmiş oluyoruz.

4. Kullanım modu: MULU 2(A0), D0 Örnekte A0 adres registerinin gösterdiği değere ek olarak 2 sayı daha ekleyip ortaya çıkan yeni adresteki sayıyı, D0 registerindeki sayı ile çarparız.

Yukarıdaki 2(A0)'a daha açıklayıcı olarak; A0 adres registerinde $50000 olduğunu varsayalım, örnekteki gibi bir komutta ise $50000'e 2 daha ekleyerek $50002'deki sayı ifade edilmiş oluyor.

Dikkat ettiyseniz MULU komutunun ikinci parametreleri hep Data registeri olmaktadır. Bu komutta da böyle bir kısıtlama vardır.

DIVU KOMUTU Amiga makine dilinde bölme işlemlerini bu komut ile yapacağız. Bu komut da MULU komutu gibi işlemciyi çok yoran komutlardan bir tanesidir. Her şeyden önce DIVU komutunun WORD adres olarak çalıştığını söyleyebiliriz. Dolayısıyla kapasitesi LONGWORD bir sayıyı WORD bir sayıya bölmek oluyor. Diğer bir anlatımla 32 bit uzunluğunda herhangi bir sayıyı 16 bit uzunluğunda bir sayıya bölebilmektedir. DIVU'nun çalıştığı sayılar ise $FFFFFFFF bölen, $FFFF bölüm olmaktadır. Bu sayılar bir programcı için rahatlıkla her işi görecek kapasitededir.

Bölme işleminin sonucunda sonuç sayısı, kullanılan data registerinin ilk WORD'una ve elde kalan sayı ise ikinci WORD'a yazılmaktadır.

Şimdi DIVU komutunun parametrelerini inceleyelim:

1. Kullanım Modu: DIVU #$10,D0 D0 data registerindeki sayı $10'a bölünür. İşlemin sonucu olan sayı D0'a yazılır. Elde varsa D0 data registerinin ikinci WORD'una yazılır. Başka bir deyişle 16-31 nolu bit'lere yazılır. 2. Kullanım Modu: DIVU $50000,D0 $50000 hafıza adresindeki sayı, D0 registerindeki sayıya bölünür. Sonuç D0 registerine yazılır.

3. Kullanım Modu: DIVU (A0), D0 Duruma göre DIVU komutunun ilk parametresine doğrudan hafıza adresi yazmak yerine adres registeri üzerinden kullanabilirsiniz. Yukarıdaki örnekte olduğu gibi A0 adres registerinin gösterdiği adresin içindeki sayıyı, D0 data registerindeki sayıya bölmesini ifade etmiş oluyoruz.

4. Kullanım Modu: DIVU 2(A0), D0 örnekte A0 adres registerinin gösterdiği değere 2 sayı daha ekleyip ortaya çıkan yeni adresteki sayı, D0 registerindeki sayıya bölünür.

68000 Makine Dilinde DIVU komutuna ek olarak bir de DIVS komutu vardır. İşleyiş olarak aynı olan bu iki komutun tek farkı, DIVS'in eksi (-) işaretli sayıları da bölebilmesidir. DIVU bu gibi durumlarda eksi sayıların işaretlerini dikkate almaz.

DIVU komutu ile beraber makine dilinde dört işlemi görmüş oluyoruz. Dört aritmetik işlem yapan komutlardan sonra, kolay anlaşılır bir komut olan EXG'yi görelim.

EXG EXG'nin yaptığı iş çok basittir. Görevi herhangi iki registerin içeriklerini değiştirmek. Kullanılan registerlerin adres veya data registerleri olması hiçbir şeyi değiştirmez. Komutun işleyişinde registerler tümü ile (LONGWORD olarak ihtiva edildikleri dört byte ile beraber) taşınırlar. BYTE veya WORD olarak Data ve adres registerlerini taşımak bu komut ile mümkün olmuyor.

Şimdi modlarını anlatalım. 1. Kullanım Modu: EXG D3, D5 D3 data registerinin içerdiği sayıyı, D5 data registerinin içeriğindeki sayı ile değiştir.

Örneğin; D3 data registerinde $0FFF0000 olduğunu ve D5 data registerinde de $000F0000 olduğunu varsayalım. EXG D3, D5 komutu işleme girdiğinde registerlerin içindeki sayılar yer değiştirecek ve $000F0000 sayısı D3'e ve $0FFF0000 sayısı ise D5'e gidecektir. 2. Kullanım Modu: EXG A0,A1 A0 adres registerindeki sayıyı, A1 adres registerinin içindeki sayı ile değiştir. 3. Kullanım Modu: EXG D3, A3 D3 data registerindeki sayıyı, A3 adres registerindeki sayı ile değiştir. 4. Kullanım Modu: EXG A0, D1 A0 adres registerindeki sayıyı, D1 data registerindeki sayı ile değiştir.

Gelecek ay makine dilindeki atlama ve dallanma komutlarını inceleyeceğiz. Şimdilik hoşça kalın.