6502 komut seti neden ilk assembly dili olarak uygundur
(substack.com/nemanjatrifunovic)- Assembly, CPU mimarisiyle doğrudan bağlantılı olduğu için ilk öğrenme hedefinin seçimi önemlidir; 6502 ise basit yapısı ve gerçek bir ekosistemi birlikte sunan, başlangıç için uygun bir platformdur
- Yalnızca 6 register ve özgün komut setindeki 56 komutla register, load/store, mantıksal ve aritmetik işlemler, dallanma gibi temel kavramlar hızlıca öğrenilebilir
- Apple II, Commodore VIC 20, Commodore 64, BBC micro gibi sistemlerde kullanılan gerçek bir CPU olduğu için emülatörler, yeniden üretilmiş cihazlar ve ücretsiz kaynaklarla pratik odaklı öğrenme kolaydır
- Easy 6502, web üzerinde doğrudan kod yazmayı sağlayan JavaScript tabanlı bir assembler ve simülatör sunarak kısa sürede fikir edinmeyi kolaylaştırır
- Z80, modern RISC ve x86-x64 de öğrenmeye değerdir, ancak ilk adımda düşük karmaşıklığı sayesinde 6502 öğrenme yükünü azaltır
6502 neden başlangıç için uygundur
- Assembly programlama, yüksek seviyeli dillere kıyasla donanımla bağlantısı daha güçlü olduğu için, ilk karşılaşılan CPU öğrenme zorluğunu büyük ölçüde etkiler
- 6502 assembly, günümüzde gerçek dünya uygulamaları yazmak için pek konforlu bir ortam değildir
- Retro programlamanın kendisine özel bir ilginiz yoksa 6502 üzerinde uzun süre kalmanız gerekmez
- Başlangıç platformu olarak avantajları basitlik ve gerçekliktir
- Basit yapısı sayesinde temel kavramlar hızlıca öğrenilebilir
- Gerçek cihazlar, emülatörler, kitaplar ve çevrimiçi kaynaklar bol olduğu için öğrenme yolunu belirlemek kolaydır
-
Register ve komutlar küçük tutulmuştur
- 6502’de yalnızca 6 register vardır
- 1 accumulator
- 2 index register
- status register
- stack register
- program counter
- 6502’deki tek 16 bit register program counter’dır
- Az sayıdaki register, gerçek uygulama yazarken kısıtlayıcı olsa da register’ların rolünü ve nasıl çalıştıklarını anlamaya yardımcı olur
- Özgün 6502 komut seti yalnızca 56 komut içerir
- Bu küçük komut kümesiyle bile başlıca komut türleri öğrenilebilir
- load/store
- mantıksal işlemler
- aritmetik işlemler
- dallanma
- Bu türler, modern CPU’larda da bir şekilde varlığını sürdürür
- x86-x64’te register ve komut sayısını saymakla başlamak bile kolay değildir; ARM gibi modern RISC komut setleri de küçük ve basit sayılacak kadar sade değildir
- 6502’de yalnızca 6 register vardır
Gerçek ekosistem ve diğer seçenekler
-
Eski ama yaşayan bir ekosistem
- 6502, 1970’lerin ortasında MOS Technology tarafından Motorola 6800’ün daha ucuz ve sadeleştirilmiş bir sürümü olarak tanıtıldı
- Aynı ekip daha önce Motorola 6800’ü geliştirmişti
- Ardından hızla popülerleşerek birçok tanınmış mikrobilgisayarda kullanıldı
- Apple II
- Commodore VIC 20
- Commodore 64
- BBC micro
- Bu cihazlar için emülatör bulmak kolaydır ve bazıları için modern yeniden üretim cihazları da vardır
- 6502’nin ardılları yazının kaleme alındığı sırada hâlâ üretiliyordu ve Olimex’in Neo6502 gibi yeni cihazları da 6502 ailesini çalıştırır
- Ücretsiz öğrenme kaynakları internette bol miktarda bulunur; bunların önemli bir kısmına 6502.org üzerinden erişilebilir
- 6502, 1970’lerin ortasında MOS Technology tarafından Motorola 6800’ün daha ucuz ve sadeleştirilmiş bir sürümü olarak tanıtıldı
-
Hemen pratiğe geçmeyi sağlayan öğrenme kaynakları
- Easy 6502, Nick Morgan’ın kısa sürede 6502’yi denemek isteyenler için uygun olan elektronik kitabıdır
- Yalnızca metin ve görseller değil, JavaScript ile yazılmış bir 6502 assembler ve simülatörü de içerir
- Web sayfası üzerinde doğrudan basit 6502 assembly kodu yazılabilir
- Visual6502.org, assembly öğrenme aracı olmaktan çok 6502’nin basitliğini görsel olarak gösteren bir kaynağa yakındır
-
Diğer başlangıç adaylarından farkı
- Eğitim amaçlı tasarlanmış sanal CPU’lar temiz ve “kusursuz” bir komut setine sahip olabilir, ancak 6502 kadar zengin öğrenme materyali ve topluluk sunmaları zordur
- Z80, 6809 ve 68000 gibi retro CPU’lar da iyi seçeneklerdir
- Bu üç CPU’nun ciddi programlama için 6502’den daha iyi olduğu değerlendirilir
- Temel kavramları öğrenmede 6502’nin basitliği daha avantajlıdır
- Z80, 6502’ye göre çok daha fazla register’a sahiptir ve alternatif register seti de içerdiğinden başlamak daha az kolaydır
- ARM, MIPS ve RISC-V gibi modern RISC mimarileri, ciddi assembly programcılarının bir noktada öğrenmesi gereken yapılardır
- Ancak başlangıç için ideal değildirler
- Bunların basitliği, komut setinden çok çipin iç uygulamasına yakındır
- Modern mikroişlemcilerin çoğu yüksek seviyeli dillerle programlanır; doğrudan assembly komutu yazma deneyimi, CPU tasarım önceliklerinde çok üst sıralarda değildir
- ARM64’te 64 bitlik bir sabiti register’a yüklemek için bit shift dahil 4 komuta ihtiyaç duyulabilir
- Buna kıyasla 6502’de bir sabiti register’a yükleme süreci daha basittir
- x86-x64, modern masaüstü ve sunucularda en yaygın komut seti olarak görülebilir; ARM ise arayı kapatmaktadır
- 32 bit boyut kısıtına takılmayan ve operand sayısı değişken olan zengin komutları sayesinde bazı açılardan ARM’a göre kodlaması daha kolaydır
- Ancak yeni başlayanlar için hâlâ oldukça karmaşıktır ve 40 yıllık geçmiş x86-x64’ü daha basit hâle getirmez
1 yorum
Hacker News yorumları
6502’nin sadeliğinin 68000’den daha iyi olduğuna katılmak zor.
68000’de daha fazla register ve daha geniş veri tipi genişlikleri var, ama yapısı düzenli. Fiilen A ve D diye iki türün D0~D7, A0~A7 olarak tekrarlandığı bir biçim; D0’da yapılabilen şey D3’te de yapılabilir. Yapısal sadelik ile programlama sadeliği arasında denge kurulmalı; 6502’de biraz karmaşık bir program yazmaya kalkınca kısıtlamalara sürekli çarpıyorsunuz.
Küçük makinelerin sınırlarını aşmayı öğrenmenin en iyi yolu, aksine o sınırları görmezden gelip yetkin bir yazılım mühendisi olmaktır. Yeni başlayan biri için daha fazla adresleme modu olan, büyük dizilerle uğraşmayı kolaylaştıran, register ve tamsayı genişliği daha bol olan taraftan başlamak daha iyi.
6502’de 6 register olduğu için basit olduğu iddia ediliyor, ama 6502’ye sadece bir hafta dokunsanız bile fiilen üç register ile uğraştığınızı anlarsınız. “Semaphore CPU” lakabı da buradan geliyor.
6502 eğlenceli ve temizdir, ama modern bir yaklaşım istiyorsanız uygun değil. 90’lar tarzı ihtişam yolunu izlemek istiyorsanız MIPS’ten başlamak ya da doğrudan Neon ile başlamak daha iyi. Z80 de register’ları ve karmaşıklığı düşünüldüğünde bugün karşılaşılan şeylere daha benzer sayılabilir.
Modern assembly’nin kendisi özünde karmaşık değildir. FASM’den başlarsanız zor değildir, ama düşük seviye yaklaşım her zaman çok çabuk karmaşıklaşır. Sonra makrolar yazmaya başlarsınız ve sonunda üstüne kendi yoksul C benzerinizi koyarsınız.
Küçük sistemlerin avantajı, silikondan işletim sistemine ve yazılıma kadar tamamını bütünüyle anlayabilmenizdir.
6809, 68K’den daha basit ve 6502’den daha güçlüdür; ortogonalliği de iyidir, ama aynı düzeyde bir yazılım tabanı yoktur. Motorola’nın 6809 ve 68K’nin komut kümeleri ile programcı gözünden mimarisinde oldukça iyi bir yön tutturduğunu düşünüyorum. PDP-11/VAX ve NS32K’yi de benzer şekilde ortogonal diye hatırlıyorum.
Daha modern bir platform düşünülürse MC68k yerine RISC-V öğretmenin güçlü bir gerekçesi var. RISC-V, yalnızca temel tamsayı komut kümesine bakıldığında çok basit ve zarif; aynı zamanda ARM, Aarch-64, MIPS gibi modern mimarilere benziyor. Hem 32-bit hem 64-bit sürümleri var ve resmi dokümantasyonuna erişmek de kolay.
MC68k’de bugün pek ilgisi olmayan çok fazla tuhaflık var. Avantajı, birçok donanım platformunda kullanılmış olması ve hâlâ aktif bir retro topluluğa sahip olması denebilir; ama bu daha çok ilgi çekici bir unsur, gerçek anlamda güncel ilgisi düşük.
68020, komut kümesi mimarisinin C’ye yaklaşabileceği neredeyse en üst noktaya yakın ve kullanım hissi çok iyi.
Yine de ilk Commodore bilgisayarlarda 65XX kullanmak çok tatmin ediciydi. Bellek koruması olmadığı için video belleğini doğrudan değiştirebiliyor, sprite’lara, fontlara, kenarlıklara ve interrupt’lara dokunabiliyor, kendi kendini değiştiren kod da yazabiliyordunuz. Amiga’daki 68000 assembly ise daha güvenli ve kontrollü bir ortamdı.
Assembly öğrenmek için ilk komut kümesi olarak 6502'nin iyi olmadığını düşünüyorum. Zekice ama derin kusurları olan bir mimarinin tuhaflıklarıyla uğraşmaya çok zaman harcatıyor
Bu dolambaçlı deyimler, MOS'un o dönemdeki araç ve bütçe kısıtlarına bağlı olmayan daha iyi mimarilere pek taşınmıyor
Küçük ama güçlü ve biraz tuhaflığı olan bir komut kümesi öğrenmek istiyorsanız ARM v6M daha iyi. Bugün hâlâ anlamlı ölçekte üretiliyor; modern açık kaynak araç zincirlerinde debugger, compiler, assembler ve linker desteği de iyi
Mimarinin açıklığına önem veriyor ve henüz daha az olgun bir platformu göze alabiliyorsanız bir RISC-V MCU seçebilirsiniz. Karar veremiyorsanız RP2350'yi seçin
ARMv6M komut kümesi küçük; sabit yükleme de belgelerde yazdığı gibi PC'ye göre yükleme kullanıldığında uzun ve sıkıcı komut dizileri gerektirmiyor. Kendi kendini değiştiren koda ya da belleği indekslemek için zero page'e de ihtiyaç yok; register genişliği adres alanıyla aynı. 32 bit olduğu için çoğu 8/16 bit komut kümesine kıyasla öğrenmesi ve öğretmesi daha kolay. Kulağa sıkıcı geliyorsa endişelenmeye gerek yok. ARMv6'da da code golf için kullanılabilecek yeterince tuhaflık var
PIC16 assembly ile başladım ve çeşitli mimarilerle biraz uğraştım; temizlik açısından en çok MIPS32 hoşuma gitti
Küçük bir ekleme yapmak gerekirse, Western Design Center'dan yeni üretilmiş 6502, 6502 çekirdekli MCU ve çevre yongaları hâlâ satın alınabiliyor. Mouser gibi yerlerde de satılıyor
https://www.mouser.com/c/?m=Western%20Design%20Center%20%28W...
Sadece iki 16 bit sayıyı çarpmak bile bir kod yığını gerektiriyor. Yeni bir programcının bununla boğuşması pek faydalı görünmüyor
Söylediğiniz gibi erken dönem ARM komut kümesi iyi bir seçim
Elbette bu birçok assembly dili genelinde görülen bir sorun, ama başlangıçta böyle bir sorunu olmayan bir komut kümesiyle başlamak iyi olurdu
[1] https://youtube.com/playlist?list=PLowKtXNTBypFbtuVMUVXNR0z1...
Lisans öğrencilerine yıllardır assembly öğreten biri olarak, 6502'nin yeni başlayanlar için iyi olduğuna katılıyorum. Ancak bunun nedeni yalnızca 6502 dilinin kendi avantajları değil
68K, MIPS, ARM, x86 vb. öğrettim; 6502 öğrettiğimde öğrencilerin tepkisinin iyi olmasının en büyük nedeni CPU'nun etrafındaki bağlamdı. 6502 ile anlaşılması kolay gerçek bir makineyi, yani Nintendo Entertainment System'ı programladık
Temel memory-mapped I/O, işletim sistemi yok, pipeline komutları yok, delay slot yok, ağ yok, gereksiz gürültü yok. İçinde clock, CPU, birkaç bellek adresi, yardımcı yongalar ve bellek adreslerine eşlenmiş I/O olan basit bir kutuya daha yakın. 6502 en basit komut kümesi değil, ama bu sistemin basitliği büyük yardım sağlıyor
6502'nin kısıtları da öğrencilerin komutların neden öyle göründüğünü anlaması açısından önemliydi. CPU, dönemin kısıtları içinde tasarlanıp kablolanmıştı ve bu da programlama biçimine yansıyordu
Yeni başlayanların eğitimi için 6502 ve NES'i seçmek başarılı oldu. 6502 olduğu için değil; 6502, bitleri taşıyan sistemin kendisini basit olmaya zorladığı için
Öğrenciler 6502'ye dokunup NES tile'larının ekranda hareket ettiğini gördükten sonra, 68000'in bunu nasıl farklı işlediğine, MIPS'in nasıl ortaya çıktığına, pipelining ve delay slot'ların nasıl kullanıldığına, RISC ile CISC farklarının nasıl karşılaştırılacağına doğal biçimde genişlemek kolay oldu. Temel varsa ilerlemek son derece basitleşiyor
Bugün kullanılan bir komut kümesini öğrenmeyeceksek, PDP-11 assembler'ın iyi bir başlangıç noktası olarak neredeyse hiç anılmaması biraz şaşırtıcı
Belki de doğru düzgün ilk öğrendiğim şey PDP-11 olduğu içindir, ama erken mikroişlemcilerin hepsi bir adım geri gibi gelmişti. Z80 assembly'yi birkaç yıl kullandım, ama bugün önermem. Ortogonal bir komut kümesi değil; 6502'de de register sayısı çok az olduğu için assembly yazma hissini doğru vermesi zor
PDP-11'i seviyorsanız MSP430'da benzer avantajları biraz sınırlı biçimde, 68000'de ise biraz güçlendirilmiş biçimde elde edebilirsiniz
Ama aslında böyle kalıntıları unutup RISC-V öğrenmek en iyisi. Ya da çeşitli Arm varyantlarından birini seçin. Kişisel olarak 2000'lerin ortasında çok uğraştığım ARM7TDMI'ye duygusal bir yakınlık duyuyorum. Thumb modu, orijinal Arm modundan biraz daha kolay öğrenilebilir; ama ikisi de RISC-V kadar tatmin edici değil
Adresleme biçimlerinin RISC'e göre kavramsal olarak daha karmaşık olduğu söylenebilir, ama pratikte 6502 adresleme biçimlerini anlamak PDP-11'inkilerden muhtemelen daha zordur
Ama DEC bu fırsatı görmezden geldi ve IBM, hantal 8086 komut kümesiyle o yeri aldı
Artık -11 öğrenmenin bir amacı kalmadı
Böyle bir sonuca nasıl varıldığını pek anlayamıyorum. Öğrenciler bilgisayar programlamayla ilk kez tanışırken gerçek dünyada kullanım alanı olmayan oyuncak/küçük bir dille başlamak mantıklı olabilir. Ama assembly, öğrenilen ilk dil olmamalı
Assembly çok pratik bir araçtır ve genelde hata ayıklama ile tersine mühendislikte sık kullanılır. Öyleyse neden çoktan ortadan kalkmış bir platformun assembly’sine zaman harcansın?
Assembly öğrenmenin en iyi yolu deneme yapmaktır. Sevdiğiniz dilde kod yazıp ara assembly çıktısına bakabilir ya da objdump veya gdb ile içini inceleyebilirsiniz. Değiştirip ne olduğunu da görebilirsiniz
Eski bilgisayar emülatörleriyle de yapılabilir ama daha zordur. Ekrana tek bir metin yazdırmak için bile o bilgisayarın mimarisini, donanımını ve ROM işlevlerini öğrenmeniz gerekir; bu bilgi de x86-64 üzerinde Linux veya Windows’a neredeyse hiç uygulanamaz
Tamamen yeni başlayan biri için pointer gibi kavramlar fazlasıyla soyut ve anlaşılması güçtü; assembly’de dolaylı adreslemeyi öğrenince C’de pointer’ların neden var olduğu ve nasıl çalıştığı birden netleşti
Daha önce çoğunlukla Python kullanıyordum ve o çok daha fazla soyutlanmıştı. İnsanlar pointer gibi özelliklerin donanım ve performans kısıtları nedeniyle var olduğunu unutabiliyor. CPU içinde gerçekte neyin neden yapıldığını bilmezseniz sezgisel anlayışınız sınırlı kalır
Liseden beri tek satır assembly yazmadım ama işlemlerin nasıl yürütüldüğü ve register’ların nasıl çalıştığına dair temel anlayış sayesinde programlama ve optimizasyonun nedenlerini, koşullarını ve istisnalarını çok daha kolay anlar oldum. Temiz ve verimli koda da daha fazla değer vermeye başladım
Geçmişten biraz tat almak isterseniz burada
https://www.atariarchives.org/
Elektronik okuduğum için doğal olarak assembly’den (Motorola HC11) başladım. Dersin sonuna gelindiğinde herkes bağımsız olarak for döngüsü gibi şeyler için makrolar yazmıştı ve buradan C’ye geçiş doğal oldu. C dersinin sonunda C tarzı nesne yönelimi de doğal olarak ortaya çıktı ve sonraki C++ dersine bağlandı
Bu yaklaşımın dezavantajı, fonksiyonel paradigmaya ya da genel olarak emirsel olmayan paradigmalara doğru kademeli bir yol sunmaması. Ayrıca dilin içeride nasıl çalıştığını sürekli düşünme alışkanlığı oluşuyor; bu bazen ters tepebiliyor. Haskell öğrenmeye çalışırken bile zihnim önce yorumlayıcının nasıl çalıştığını anlamaya yönelmişti
Assembly öğrenmek yalnızca dili değil, veriyollarını, bellek eşlemeli çevre birimlerini ve makinenin nasıl çalıştığını anlamaktır. Eski platformlarda bu kısım çok daha basittir. Bu yüzden ARM komutları HC11’in CISC komutlarından daha kolay öğrenilse bile, geri kalan her şeyde HC11 yeni başlayanlar için daha dostçadır
-vasmile derlerseniz üretilen assembly’yi derleme sırasında gösterir. objdump veya-Skullanılsa olmaz mı diye pek iyi değerlendirilmedi, ama doğrudan kullanınca neden kullanışlı olduğunu anlıyorsunuz. Çünkü nesne dosyası oluşturmak için gereken devasa boilerplate olmadan sadece assembly’yi doğrudan çıktılarÖrneğin AArch64 kod üreteci, daha spesifik olarak da kayan nokta kod üretimi üzerinde çalışıyorsunuz ve şöyle bir fonksiyon var
float test(float a, float b) { return a * b; }dmd -c test.c -arm -vasmile derlerseniz adres, onaltılık komut, komut mnemonikleri ve komut belirtimi URL’si çıktılanırKodun tamamen doğru olmadığını biliyorum. Hâlâ üzerinde çalışıyorum demiştim :-)
Benim için 6502 komut kümesi iyi bir ilk assembly diliydi
1977’de Oregon’da küçük bir kulübede yaşıyordum ve can sıkıntısından bir Apple II satın aldım. Bir yıl içinde sonradan Apple Writer adını alacak program üzerinde çalışmaya başladım ve tamamını assembly ile yazdım
https://en.wikipedia.org/wiki/Apple_Writer
Burada 6502 assembly’sinin epey kaba ve yazması zor olduğu söyleniyor; geriye dönüp bakınca katılıyorum. Ama 1977’de karşılaştıracak bir ölçüt yoktu
Apple II’de hızlı bir üst düzey dil olmadığı için, küçük programım alternatif eksikliği sayesinde bir Apple ürünü oldu
Düşününce Apple Writer 8KB RAM içine sığıyordu ama gerçekten iş görüyordu. İnsanların adres listelerini işlemek için kullandığı bir makro dili de vardı
Yakın zamanda DeepSeek’i yerelde daha kolay çalıştırmak için ana sistemimi 96GB RAM’e yükselttim; bir RTX 4090’ım da var. Birden bu RAM’e neredeyse 12 milyon Apple Writer sığdırabileceğimi fark ettim
Epey gerçeküstü, ama 1977’den bu yana buna benzer şeyleri söyleme fırsatım çok oldu
Başlangıç için assembly dili olarak RISC-V’yi tercih ederim. Tasarımı iyi, daha sezgisel; GCC, LLVM, Rust gibi modern dil ve araç desteği var; QEMU’da ve gerçekten satın alınabilen donanımlarda çalışıyor
Üstelik 14MHz’de bile çalışabiliyor
6502 komut kümesinin basitliği konusu kişisel olarak beni rahatsız eden bir nokta. Böyle bir basitliğin iyi olduğunu düşünenler, Hello World’den öteye hiç geçmemiş gibi görünüyor
6502 ile orta düzeyde karmaşık bir şeyi programlamak zordur. 8 bit çok kısıtlayıcıdır; örneğin Commodore 64’ün ekran adreslemesine bakmak bile yeter. Çarpma ve bölmeyi kendiniz uygulamanız gerekir; 16 bit toplama/çıkarma da basit olsa bile, verimli yapmak kesinlikle önemsiz değildir
Amaç temel assembly öğrenmekse, 8086+DOS platformu kıyaslandığında çok daha kolay yönetilir
Çeşitli çarpma ve bölme algoritmalarını assembly’ye aktarmak, öğrenmek için çok iyi bir yöntemdir
Zaten x86-64, RISC-V veya ARM olmayan, bugünle doğrudan ilgili olmayan bir şey öğreneceksek, 8086’nın avantajının ne olduğundan pek emin değilim
Her anından keyif aldım; segment register’ları da beni pek rahatsız etmedi
Bilgisayar bilimi ağırlıklı bir teknik okulda okuyorum; retroyu seven ve kendi arcade makinesini göstermeyi seven bilişim hocamız, belirlenmiş ders planındaki 8808 assembly yerine 6502’ye odaklandı
Açıkçası hayatımdaki en iyi öğrenme deneyimlerinden biriydi ve başka türlü olmasını istemezdim. Ben Eater’ın breadboard bilgisayarını bile yaptırdı; bu yüzden özellikle elle dokunarak öğrenme hissi çok güçlüydü ve gerçekten ilgi çekiciydi
Assembly diliyle ilk tanışmam PDP-10 ile oldu ve elimde yalnızca DEC-10 işlemci kılavuzu vardı
Tamamen kafam karışmıştı. Yüzlerce komut vardı ve açıklamalar kapalıydı. Register’ın ne olduğunu, accumulator’ın ne olduğunu, adresin ne olduğunu, stack’in ne olduğunu hiç bilmiyordum. David Rolfe, Fortran sürümü Empire’ım için gereken birkaç alt yordamı yazıp biraz yardımcı oldu ama hâlâ yolumu kaybetmiş durumdaydım
Bir gün arkadaşım Shal Farley’e stack’in ne olduğunu sordum; “Bir tabak yığını düşün. Bir tabak koyuyorsun (push), bir tabak çıkarıyorsun (pop)” dedi. O anda sanki ışık yandı ve hemen anladım
Sonra küçük bir karttaki 6800 mikroişlemci ile uğraşmaya başladım. Yaklaşık 40 komutu vardı ve hepsi tek bir karta sığıyordu. 40 komutu öğrenmek kolaydı ve birden her şey anlam kazandı
Yeniden -10 kılavuzuna döndüğümde her şey mantıklı gelmeye başladı