Amiga Dünyası sayı 3, sayfa 37

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 37

Ö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.

Klavyeyle gezinmek için ← ve → tuşları.