Amiga Dünyası sayı 26, sayfa 17

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 17

}

Mouse()

I #asm

clr.l d0 ; d0 register'ını sıfırla btst #6,$bfe001 ; bne.s İm ; sol tuşu kontrol et add.l #l,d0 ; basılı ise d0=1 yapıp çık İm:

#endasm }

Bu örnekte, bir assembler alt rutininden parametre alarak geri dönmeyi öğreniyoruz. mouse() rutini ile sol mouse'u kontrol ediyoruz. Eğer tuşa basılmış ise rutin '1' değeri ile, basılmamışsa '0' değeri ile geri dönüyor. Bu iş için assembler rutinden çıkmadan önce d0 register'ının değerini değiştirmemiz yeterli oluyor. Bu sistem bütün Amiga programlarında kullanılır. Şimdi programımızın assembler listesine bir göz atalım. Bunu yapmak için programı compile ederken;

CC +L -t prog.c

olarak parametreleri verin. Buradaki '-t' parametresi prog.asm isimli bir assembler listesinin ortaya çıkmasına neden olacaktır. Bu assembler listesini incelediğimizde, programın assembler diline çevrilirken hangi kademelerden geçtiğini görebiliriz. Şimdi isterseniz bu listeye bir göz atalım;

_mouse:

link a5,#.8 movem.l .9,-(sp) ;#asm

clr.l d0 btst #6,$bfe001 bne.s lm add.l #1,d0 lm: ;} .10

movem.l (sp)+,.9 unlk a5 rts .8 equ 0 .9 reg

public _printf public .begin dseg end

Programın assembler listesi içinde ';' işaretlerinden sonra hangi C satırının assembler diline çevrildiği yazılmış. Bu sayede programı incelemek gerçekten çok kolay olmakta.

Listeye baktığımızda, çeşitli assembler komutları ile karşılaşıyoruz. Buradaki komutların bir kısmı, yalnızca Aztec Assembler için kullanılıyor. Diğerleri ise standart assembler komutları. Bu etapta bizi ilgilendiren birkaç komut var. Bunlardan listenin başında görmüş olduğunuz gibi ana main bloğu,

;:ts=8 ;/* Aztec-C Assembler */ ;/* alt rutinlerinin */ ;/* kullanimi; */ ;/* Örnek 2. */

;main() ;{

public_main _main:

linka5,#.2 • movem.l .3,-(sp) ;int m; ; ;while(l){ .4 ; m=mouse();

jsr _mouse

move.l d0,-4(a5) printf("left mouse=%a>n",m);

move.l-4(a5),-(sp) pea .1+0 jsr _printf

add.w#8,sp ;}

bra .4 .5 ;} .6

movem.l (sp)+,.3 unlk a5 rts .2 equ -4 .3 reg .1

dc.b 108,101,102,116,32,109,111,117,115,101,61,37,100,10,0 ds 0 ; ;mouse() ;{

public_mouse

public_main _main:

olarak seviyelendirilmiş. Buradaki 'public' komutu '_main' isminin bir rutin ismi olduğunu belirtiyor. Gerçekten de programımızın başlangıç rutini buradan başlıyor. Diğer alt rutinler de aynı şekilde tanımlanmış. Bu sayede assembler listesi içerisinde bir alt rutin ismi tanımlamak mümkün. Bizim kullandığımız mouse() rutini de,

public_mouse _mouse:

olarak tanımlanmış. '_mouse' başındaki '_' işareti assembler derleyici tarafından rutin ismi olduğunu belirtmek için kullanılıyor. Bu işaret aynı zamanda global olarak tanımlanan değişkenlerin başında da kullanılıyor. Programın en son satırlarında ise,

public orintf public .begin

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