Assembler Kursu
Retro bilgisayar64'ler B Kursu
Bilindiği gibi bilgisayarlardan en iyi verimi alabilmek için en az bir bilgisayar dilini iyi bilmek gerekiyor. En kolay öğrenilen ve yaygın kullanılan dil BASIC'tir. Fakat bu dil kolay öğrenilmesine karşın yavaş çalışmakta ve bilgisayar hafızasında çok yer kaplamaktadır. Yavaşlığı bir noktada Austro Comp., Blitz vs. gibi Compiler (derleyici) programlarla çözmek mümkündür. Zaten yazılan BASIC programı da bilgisayarın içinde makine diline çevrilerek çalışmakta ve dilin yavaşlığı da buradan gelmektedir. Yurdumuzda büyük boyutlara varan bilgisayar kullanıcıları bilgisayar ile tanıştıktan sonra, önce BASIC ile uğraşmakta ve daha sonra yeni bir dünya olan makine dilini keşfetmektedir. Fakat yurdumuzda makine dili hakkında son derece kısıtlı Türkçe yayın bulunmakta, dolayısıyla çığ gibi büyüyen meraklı bilgisayarcılara hitap etmemektedir. Eksikliğini, bu açığı kapatmak gayesiyle sizin için bu diziyi başlatmayı uygun gördük. Bu diziyi takip eden okuyucuların az çok BASIC diline aşina olmaları gerekmektedir. Bu sayıda size yayınladığımız programı yazdıktan ve kasete-diskete kaydettikten sonra çalıştırdığınızda, bu program yardımıyla programlarınızı BASIC gibi yazabileceksiniz. Bu programda en önemli nokta RTS komutundan sonra gelen adrese X yazıp RETURN tuşuna basarak ana menüye dönmenizdir. Aslında bu program olmasaydı, makine kodunu hafızaya iki yol ile yerleştirebilirdik. Birinci yol DATA'lar yazıp bir FOR-NEXT döngüsüyle aşağıdaki gibi yapmak: 5 POKE 43, 44, 8: POKE 45, 27: POKE 46, 8 10 FOR I=2049 TO 2075 80 NEXT 40 DATA 25, 8, 10, 0, 153, 34, 66, 85 42 DATA 71, 85, 78, 32, 72, 65, 86, 65 44 DATA 32, 75, 65, 82, 76, 73, 34 46 DATA 0, 0, 0, 73 Veya ikinci bir yol, bir monitör yardımıyla direkt hafızaya makine dilini yazmak. İleriki sayımızda sizlere monitör programı ve Convertor (çevirici) programı da yayınlayarak bu alandaki eksikliklerinizi tamamlamayı amaçlıyoruz. Makine dili programlar direkt belleğe ve bilgisayarınızdan bu programları düzeltme imkanınız olmadığından, bu işlemleri yapabilmek için, daha evvel makine dili editörü yayınlamıştık. Buradaki amacımız yayınladığımız programları hatasız olarak yazmanız ve hatanın
Dr. Ali Özçelik program tarafından kontrol edilmesi, emeğinizin boşa gitmemesidir. Bu programları yazıp kaydettikten sonra monitör yardımıyla tekrar incelendiğinde, profesyonellerin bu dildeki mantığını kavrayabilmenizdir. Eğer programı makina okuyacak olsaydı, makina dili çok kolaydı. Fakat programcılar insan olduğu için Assembler dili geliştirildi. Daha önce de belirtmiştim: Aslında bilgisayarın anladığı tek dil vardır. (Yo, “dayak” demeyin, bilgisayar uygar bir alettir, böyle şeyleri kaldırmaz.) Makina dili, pratik olarak bilgisayarı oluşturan elektronik devrelere giden hatlarda, belli bir anda gerilim bulunup bulunmadığının bir ifadesidir. Tabii bu düzeyde kalırsa, bilgisayar programlamanın imkansız olduğu hemen açığa çıkıyor. Bırakalım nerede gerilim olmasının ne yapacağını, sadece pozitif gerilimi “1”, negatif gerilimi “0” olarak alsak da fazla ileri gidemeyiz. Bu durumda, oluşan ikili sayılardan bize daha yakın bir iletişim aracı üretmemiz gerek. Bunun ilk adımını ikili sayıları onaltılı tabanda kodlanmış biçimiyle görerek atabiliriz. 10011011 gibi bir sayıyı akılda tutmaktansa 9B biçiminde bir simgeyi akılda tutmak doğal olarak daha kolaydır. Yine, yalnızca komutları değil, komutların kullandığı adresleri de aynı biçimde on altılı olarak gösterebiliriz. Pek çok programda veri olarak rastladığımız onaltılı (hexadesimal) değerler aslında makina dilinde yazılmış bir programdan başka bir şey değildir. Ama onaltılı değerlerle programlama yapmak hala zor. Onaltılı kodlara da daha anlamlı belirli simgeler verirsek, programlama artık daha kolay olacaktır. Söz gelimi 20 karşılığında JSR gibi bir simge saptayalım. Bu simge aynı zamanda komutun işlevini de bize anımsatma niteliğinde olsun. Söz gelimi örneğimizde JSR komutu, Jump to SubROutine (alt yordama atla-dallan) komutunun başlangıç harflerinden oluşuyor. Artık böylece kısaltmalar bize ne yaptığımızı da anlatacaktır. İşte simgesel dil “Assembler” komutları böylece oluşuyor. Bu komutlar çevirici yazılım aracılığıyla makina koduna dönüştürülüyor ve doğrudan makina dili komutlarının işletilmesi mümkün olmaktadır. Sözü edilen çeviri işleminde, ilgili bilinen simgelerin yerlerine onaltılı kodların konulması daha az işlem gerektiren bir süreç olduğundan daha hızlı ve daha az yer kaplar. Gelelim onaltılı sisteme: Pratik hayatta 0-9 kadar semboller kullanarak 10 ve katlarıyla matematiksel işlem yapmaktayız. Fakat makina için on altılı sistem avantajlı olduğu için onu
1 ÖPENSO,O <188>
2 PRİNT"BASSEMBLER DISASSEMBLER" BY DR.ALI FOR 64'LER"<064>
3 <068>
4 . ASSEMBLE CODE GİRİSİ" <061>
5 CODE DOKUMU" <oz0>
8 DOKUMU" <175>
7 DOKUMU" <195>
8 HAFIZA"
9 HAFIZA" <012>
10 CALISTIRILMASI" <174>
14 CEVİRİM" <049>
12 MENUYE DONUS" <189>
13 1:GETAS <193>
14 <072>
15 PRINT:0N A 17,77,104,117,129,146,147,170 <089>
16 GOTO2 <199>
17 INPUT"BASLANGIC ADRESİ <187>
18 <ozo>
19 2) <039>
20 <092>
21
22 <004>
23 FOR <145>
25 NEXT <035>
26 FOR <236>
27 1): <069>
28 NEXT <038>
29 <250>
30 VERİ" :GOTOZO <135>
31 <236>
32
33 :LÜSDEC c093>
<205>
kullanıyoruz. Aşağıda onaltılı sistem karşılığını vermeden önce önünde $ işareti gördüğünüz bütün rakamları onaltılı olarak okumamız gerektiğini öğrenmeliyiz. Hexadecimal karakter karakter Desimal karşılığı
80 o s1 1 s2 2 88 3 s4 4 88 5 86 6 s7 7 88 8 s9 g SA 10 $B n sc ı8 $D - 18 $E 14 8F 18 810 - 16
Peki Hexa ($FF)'in desimal karşılığı ne olur? Tabii 255 olur, onun için BASIC'te yazdığımız DATA'nın en yüksek değeri 255'tir. Hep makine dilinden bahsettik ama bilgisayardaki adresleri biliyor muyuz, sahi adres nedir? Bilgisayarda 60.000'in üzerinde posta kutuları olduğunu varsayalım. Bu kutuların bazılarının içi boş ve bazılarının içi dolu olsun. Dolu olanların içindeki değerler bilgisayara bazı işler yaptırmaktadır. Bunlardan bazılarını POKE komutu ile değiştirmekte ve PEEK komutu ile gözlemekteyiz. (Örnek: POKE 53281, 7 gibi) Burada 53281 no.lu posta kutusu içine değeri konuyor. Bu adres ekran zemin rengini kontrol ediyor ve 7 değeri zemini sarı yapıyor. Bilgisayarı kapatıp açtığımız zaman bu değer oradan siliniyor. Bir de bilgisayarın ana belleğinde sadece veri okunabilen bölüm vardır. Buraya ROM (Read Only Memory) denir. ROM içindeki bilgiler sadece imalat sırasında belirlenir, içindekileri değiştiremeyiz. ROM'da bulunan veriler cereyan kesilse de bozulmadan kalır. Sizlerin az çok BASIC'e aşina olduğunuzu kabul ettiğimizden daha detaylı şeyler yazmadık. Aşağıda bilgisayardaki adreslerin ne işe yaradığını veriyoruz:
Adres(Desimal) 0-1 2-1085
Adres(Hex) 0000-0001 0002-05FF
6810 kayıt Hafıza başlangıcı ayrılan boş bölge — Renkli video çıkış (VIC 11 yongasına ayrılan bölüm) — Ses ve müzik (SID ayrılan bölüm DB00-DBES — 55296-56296 Renkler için RAM 56320-57543 Giriş-çıkış kayıtları 57344-65555 8 KByte'lık KERNAL işletim sistemine ayrılmıştır.
BASIC'i bilmeyen veya az bilenler bu diziden bir şey anlamazlarsa üzülmesinler. Bu bölümü biriktirip iyi saklasınlar, ileriki yıllarda tecrübeleri artınca onlar için bu dizi vazgeçilmez bir kaynak olacak. Hepinize bol programlı ve sıhhatli günler dilerim. Dr. Ali Özçelik Bakırköy / İst.
Ne için kullanıldığı işletme sisteminde kullanılan hafıza 0400-07F7 1024-2039 hafıza 2040-2047 hafıza 2048-40959 dilinin konulduğu yer. 8 KByte'lık BASIC
40960-49151
Ekran için ayrılan Sprite oluşturma için
BASIC veya Makina dilini makina diline çeviren özel
Programın bulunduğu bölge,
CO0-CFFF 49152-552447 Prograracı için
:LÜSDEC
RESTORE
FOR TO 255
READOP © 1))-48:
NEXT
CODE" :GOTOZO
1FOP « 160ROP «4BOROP "SOOROP 11 4
OP :POKEP*1,LÜ:POKEP
1FB1#2THENPOKEP , OP :POKEP*1,LO
1FBis1THENPOKEP, ÖPT
GOTO18
<20s>
<163>
ç087>
<208>
<234>
<096>
<183>
<186>
<0a1>
<002>
<093>
<z48>
<099>
<201>
İF THEN DI>127 THENPRİNTSPCC18) DALLANMA" :GOTO16<149>
“İFAD<PTHENDİ 13 5 "KOTU DALLANMA" :GOTO18<201
53 IFDI<OTHENLO¿$254+DI
54 IFDI=OTHENLO=254
55 IFDI=1THENLO=255
56 IFDI>1THENLO DI-2
Bis2:60TO46
FOR
1))-48
İF
NEXT
RETURN
44096
FOR
İF
448)
NEXT
RETURN
İNPUT"BASLANGIC ADRESİ
HEXSSLEFTS(P8, 2)
CP) :RESTORE:FOR
NEXT:
3)
1FOP 4 «1 LZ0ROP' 4 1 440RÖP 4 ZOBORÜP #ZAOTHEN100
3347),
334", XI"
(Pe 1) 2)
:GOSUB6S
1
<161>
<108>
<206>
<220>
<046>
<011>
<197>
<141>
<250>
<187>
<073>
<122>
<192>
<157>
<243>
<213>
<2s1>
<235>
<116>
<133>
<085>
<134>
<015>
<080>
<099>
<013>
<247>
<027>
<160>
<130>
<133>
<070>
<229>
<187>
<096>
<oza>
<085>
<060>
<136>
ÜTÜS7
99 GOTO7E
100 D
101
töz
103
104
105
106
107
108
109
110
siz
118
ila
115
116
diz
118
119
izo
izi
122
123
iza
125
126
ız?
128
120
130
131
1338
FERİ
135
136
137
138
159
140
144
143
145
146
147
148
tan
150
151
192
153
154
155
156
157
158
159
160
4361
162
163
165
166
3
GOSUB6S
HEXS
DÖKÜM BASLANGIC ADRESİ
2)
2)
PRİNTPS;” TO 19
TECK<3ZORCK)9STHENCHS3Z
NEXT
PRİNT
GETA$ :
İF
GÜTOL0S <204>
İNPUT"DATA DOKUMU BASLANGIC ADRESİ
2)
2)
TO 9
PRİNT"
NEXT
PRİNT
60T0118
İNPUT"DİSK OR TEYP
ADİ (1-6 KARAKTER)
POKESZ0, LENCAS)
PRİNT OP#;"BASLANGIC ADRESİ
2) DEC
(PS, 2) :GOSUBS8 :PÜKEZSZ, DEC:
PRİNT ADRESİ İNPUTASÖ,PS:FRİNT
2) DEC
2) :POKE1OZÜ, DEC
RESTORE : READAS : NEXT
FORRSÖTÜ26
:READA
Z-0:5YS679 RETURN
İNPUT"CODE'UN ADRESİ
2)
2) :GOSUBSÖ:PER*DEC T
SYS(P)
AR XR O YR SP" OT
(780)
781) :G0SUBES
2
186 :POKES21,
2
PRİNT"
REM
REM
REM
REM
REM
REM
TUSA 1
RETURN
REM
EFTSCAS, 1): 1
<197>
<037>
<250>
<039>
<107>
<126>
<098>
<221>
<azı>
<1B0>
<215>
<002>
<046>
<ı20>
<231>
<067>
<227>
<165>
<079>
<073>
<032>
<252>
<ize>
<080>
<173>
<126>
<163>
<017>
<175>
<17a>
<175>
<058>
<160>
<059>
<212>
<1s0>
<169>
<222>
<050>
<301>
<108>
<078>
<086>
<1365>
<z20>
<221>
<222>
<223>
<224>
<225>
<2z8)
y <225>
164 TÜSA 1 <008>
165 RETURN <223>
166 REM
167 REM <220>
168 REM <230>
170 INPUT"HEX -> DESİMAL VEYA DESİMAL *> HEX 1) <012>
171 <201>
172 <153>
173 PRİNT:PRİNT"O İLE 65535 RAKAMLARI ARASINI KULLANIN <018>
174 İNPUTWSO, — <036>
175 DECSVALCAS) : İIFDEC>65S3SORDEC<OTHENİT3 <010>
176 <202>
177 <089>
178 PRINT:PRİNT"1-4 RAKAM KULLANIN"
179 HEX$ :
180 İFLENCHEX8) <110>
181 <098>
182 Pz0: ) <o27>
183 <214>
184 <226>
200 UZM, MEN, "ZORAN, <2
36>
205 "20, "BORAN, "2", YU NEM,
210 "BORAL KU, UZM UZM, "BASLI XU, "EM, <0
25>
215
220 "BAND", "2", YU, UZM <199>
225 "2", "BAND. UZM, UZM, <198
Şi
280 UZM, "ELER", <O46>
235 "7", "SJMP", "BEOR","3LSR", "20, NEN, UZM <OB7>
240 "EM, MEM, <O06
>
245 MEM, UZM, UZRORU, MEN,
250 O", “BADC", EN,
>:
255 2", "ASEL", "SADO. YU,MEM, UZ
>
260 XI", MEN,
96>
265 DATA"?","3STY", UZ", UZ
270
03>
ADC#" <0B9>
<LA7
TM, <OBA
<0
<205>
2", UZM <0
275 XI", "EN, MEN <223>
280 DATA"İTAY","2LDAW" <1B0>
285 "3LDY", "SLDA", "2", "ZLDACI. YU <246>
290' DATA"?", <189>
295 YILDA. YU, "2", <O4L>
300 DATA"3LDX. "2", NEN, NEN, UZM
305 DATA"LINY", "2", "2", <19
2>
310 MEN, MEN, UZM, MEN <178>
315 DATA"3CMP.X" <216>
320 "PM, KOM, MEM, EM, <002>
325 "2", MEN, <22
>
3830 AZSBC. XU, EM, V <033>
335 NEN <253>
340 <0
18>
345 DATA3,169,252,32,216,255,96
350 DATA166,251,32,186,255,173,52,3,162,53,160 ,3, 32 <237>
355 DATA189,255,174,252,3,172,253,3,169,0, 32,213, 255,96 <108>
READY.