15.01.2015 Views

Amiga Dunyasi - Sayi 19 (Aralik 1991).pdf - Retro Dergi

Amiga Dunyasi - Sayi 19 (Aralik 1991).pdf - Retro Dergi

Amiga Dunyasi - Sayi 19 (Aralik 1991).pdf - Retro Dergi

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

DERLEYİCİLER<br />

gerekmekte.<br />

Direkt adreslemede bu değişmekte. Şayet bir adresteki değeri<br />

'.B' takısını kullanarak etkilersek, o adresteki byte değişir. \W'<br />

takısı o adresteki ve adresten sonraki byte'ı değiştirir. \L' takısı<br />

da o adreste yer alan longword'u etkileyeceğinden, adresten sonraki<br />

4 byte birden komutumuza göre değişir. Aşağıda bu konuyla<br />

ilgili basit örnekler yer almakta :<br />

CLR.L D0<br />

==> D0 içeriğini komple temizler.<br />

MOVE.W D5.D3 ==> D5'in alt word'unu (bit 0-bit 15)<br />

D3'e kopyalar.<br />

MOVE.W S50000.D2 ==> $50000'de yer alan vvord'u (ilk<br />

iki byte) D2'ye kopyalar.<br />

MOVE.L $42000,A0 ==> $42000'de yer alan longword'u<br />

A0'a kopyalar.<br />

8. Örnek 10.1'de 'MOVE.L DO.INTBASE' komutu var, sonra<br />

BEQ EXIT3' komutu var ama CMP komutu yok, o zaman karşılaştırma<br />

nasıl olacak<br />

C. Birçok komut işlem yaparken aynı zamanda flag'leri de etkiler.<br />

Bu yüzden bu tür bir komut kullandığınızda ekstradan bir<br />

CMP komutu daha kullanmanız gerekmez. Flag'leri etkileyen<br />

komutlardan bazıları: MOVE, AND, ADD, ASL, BSET, BCLR,<br />

BTST, CMP, DIVU, EOR, LSR, MULU, NEG,JVOT, OR, ROL,<br />

RTE, RTR, SUB, SWAP, TAS, TST.<br />

9. Son örneklerde 'BEQ.L' görülüyor, longword olması ne işe<br />

yarar Bir de mesela BEQ.S' deniyor. '.S' neyi ifade ediyor<br />

C. Bu takılar arasında ufak bir fark var. 512 byte'lık sınırlar<br />

içinde yakın bir label'a dallanmak istediğinizde, bunu ister<br />

BEQ.S, isterseniz de BEQ.L komutuyla yapabilirsiniz. BEQ.S<br />

komutunu kullandığınızda assemble edilmiş programda bir word<br />

tassaruf edersiniz. BEQ.S komutu ve ardından gelen label hafızada<br />

bir word yer kaplar. Oysa BEQ.L kullandığınızda, bu 2 word<br />

olmakta. Gördüğünüz gibi pek fazla birşey farketmiyor. Dilerseniz<br />

Seka'da assemble ederken 'O' opsiyonunu kullanarak Sekanın<br />

tüm bu takıları yerleştirmesini sağlayabilirsiniz. Bu takılar<br />

tüm dallanma komutları için geçerli.<br />

10. 'MOVE.L 4A6' gibi durumlarda adresin atanacağı register<br />

far keder mi<br />

C. Hayır. A6 register'ının kullanılış nedeni, herkesin bu register'ı<br />

kullanmasıdır. Dilerseniz A0'ı da kullanabilirsiniz. Ama bu<br />

durumda JSR -$nnn(A6) komutlarını da değiştirmeniz gerekmekte.<br />

Şimdiye kadar hiçbir programda farklı bir adres register'ının<br />

kullanıldığını görmedim. Ama bu kullanılmaz anlamına gelmez.<br />

//. 'JMP -$228(A6) neden (A6) ile toplama gereği duyuluyor,<br />

direkt adres yazılsa olmaz mı Yoksa forman mı öyle<br />

C. Bunun sebebi library adreslerinin hafızada düzenlenişi ile ilgilidir.<br />

Bütün <strong>Amiga</strong>'larda yazılan programların hatasız çalışabilmesi<br />

için sistemi hazırlayan programcılar biraz dolaylı bir yöntem<br />

kullanmışlar. Fakat bu dolaylı yöntemin en büyük avantajı,<br />

yeni bir KickStart versiyonu çıktığında sorun olmadan her programın<br />

çalışabilmesidir. Bu nasıl gerçekleşmekte Bunu anlamak<br />

için library'lerin hafızadaki durumlarına kısaca bir göz atalım.<br />

Bütün çok kullanılan library'ler hafızada sabit olarak bulunmaktadırlar.<br />

Library fonksiyonlarının yerleştiği adresler, $fc0000<br />

ve yukarısıdır. Tabii bu, yeni <strong>Amiga</strong>'lar olan A-3000 ve A-<br />

3500'lerde değişmekte. Fakat şu an herkesin normal <strong>Amiga</strong>'lardan<br />

(KickStart v 1.2 ya da vl.3) kullandığını farzedelim. Bir library'i<br />

açtığımızda aslında yapılan işlem bir tablonun RAM'e<br />

kopyalanmasıdır. Bu tablo aslında bir dallanma tablosudur. Burada<br />

o library'nin bütün fonksiyonlarının gerçek adreslerine dallanan<br />

JMP komutları görülmekte. KickStart versiyonun değiştiğini<br />

kabul edelim. ROM'daki bazı rutinler değişmiş olacak. Bazıları<br />

uzamış, bazıları da kısalmış olacak. Bu durumda bütün library<br />

fonksiyonlarının adresleri değişecek. Eski bir <strong>Amiga</strong>'da direkt<br />

adresler kullanılarak yazılan bir program, tümüyle hatalı çalışacaktır.<br />

Fakat sistemi yaratanlar, dallanma tablosu kullanarak sadece<br />

tablodaki adresleri değiştirmekle tüm uyumsuzluğu ortadan<br />

kaldırmışlar. Library'lerden herhangi birini açtığımızda, bu library'nin<br />

başlangıç adresi bize D0 register'ı sayesinde aktarılıyor.<br />

Base adresten sonraki değerler o library'e ait bazı önemli datalardır.<br />

Biz bu dataların tümüne BASE STRUCTURE adını veriyo-<br />

ruz (ExecBase Structured gibi). Base adresinden ÖNCE ise, tüm<br />

dallanma tablomuz yer almakta. Bu dallanma tablosuna da erişmek<br />

istiyorsak, -nnn(a6) adresleme şeklini kullanmalıyız. Tabii<br />

aynı şekilde şöyle de yazabilirdik:<br />

move.I 4,a6<br />

sub.l #$-228,(a6)<br />

jmp (a6)<br />

Fakat bu, hem programımızı boşu boşuna uzatacak, hem de her<br />

seferine a6 register'ının içeriğini bozacaktır.<br />

12. BSR komutunun görevi nedir<br />

C. BSR ve JSR komutları dönüşlü dallanmayı sağlarlar. Bunun<br />

anlamı şudur: İlkönce komutun yer aldığı satırın altındaki satırın<br />

adresini stack'e atar. Sonra komuttan sonra verilen label'a ya da<br />

adres'e dallanır. Oradaki tüm işlemleri gerçekleştirdikten sonra,<br />

RTS (ReTurri form Subroutine) komutuna rastladığında stack'teki<br />

adresi alır ve o adrese zıplar. Altrutinlerden RTS yerine yine<br />

bir dallanma komutu kullanırsak, dönüş adreslerinin her seferinde<br />

stack'e atıldığını unutmayın. Altrutinden RTS yerine JMP ya<br />

da BRA gibi bir komutla ana rutine dönerseniz, stack'teki adres<br />

silinmeyecektir. Ana programınızın sonunda da RTS komutuna<br />

Tasladığında stack'teki adrese dallanmak isteyecektir. Bu da hata<br />

yaratacak, belki de bilgisayarınızı crash ettirecektir.<br />

13. 'MOVE.L D0,WINBASE'deki window durum bilgileri<br />

nedir<br />

C. Library açtığımızda D0 register'ında bu library'nin base adresi<br />

yer alır. Bu base adresinden sonra gelen tüm datalar o library<br />

hakıkında önemli bilgiler taşıyan LIBBASE STRUCTURE'una<br />

aittir. Daha ilerde bu structure'lan detaylı olarak inceleyeceğiz.<br />

Biz şimdilik library base adresini, o library'e ait fonksiyonlara<br />

erişmek için kullanıyoruz. Library base adresinden önce gelen<br />

dallanma tablosu sayesinde library fonksiyonlarına erişebiliriz.<br />

14. 'DC yani data satırı ile kullanılan .L', '.W ve '.B' takıları<br />

neyi değiştirir Önemli olan onu oradan nasıl aldığımız değil<br />

mi<br />

C. Data satırlarında 'DC komutundan sonra kullanılan takı ile<br />

sayıların takıya göre aynı bit uzunluklarında olmaları sağlanmakta.<br />

Eğer bir 'DC.W' satırı kullanırsak ve MOVE.L ile buradan bir<br />

sayı almaya kalkarsak, alınan sayı iki word olacaktır. Oysa data<br />

satırlarında DC.L kullandığımızda sayımızı doğru olarak okuyabiliriz.<br />

Aynı şekilde data satırlarında DC.L kullanıp MOVE.B ile<br />

ilk sayıyı okuduğumuzda, genelde 0 elde ederiz. DC.L ile her sayıya<br />

4 byte rezerve edilmekte ve sayımız 256'dan küçükse (byte<br />

sınırını aşmıyorsa) longword'umuzdaki ilk üç byte değişmemektedir.<br />

Eğer sayı word sınırını aşmıyorsa, bu sefer longword'daki<br />

ilk iki byte 0 değerini alacaktır.<br />

Umarım Tolga arkadaşımızın tüm sorularını anlayabileceği bir<br />

şekilde cevapladım. Bu sorular sayesinde bazı bilinmeyenlere de<br />

ışık tutmaya çalıştım. Fakat hala kafanızı kurcalayan sorunlarınız<br />

olduğunda bana yazmaktan çekinmeyin. Ehh, artık bu ayki bölüme<br />

ne yazık yer kalmadı. Bu yüzden bu ay sadece programımızı<br />

yayınlayacağım. Programın açıklamasını da artık gelecek ay göreceğiz.<br />

Ayrıca programı açıkladıktan sonra gelecek ay tüm assembler<br />

komutlarının listesini ve kullanılışlarını vereceğim.<br />

**************************************************************<br />

** AMIGA DÜNYASI AMIGA ASSEMBLER KURSU **<br />

** INTUITION LIBRARY - WINDOW EXAMPLE **<br />

** ORNEK <strong>19</strong>.1 **<br />

*************************************************<br />

START: movem.l d0-d7/a0-a6,-(sp)<br />

bsr.s IMTLIBS<br />

bsr.L IMTSCREEN<br />

AMIGA DÜNYASI 35

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!