Çeviriciler (Assemblers)

GCC Satıriçi Sembolik Makina Dili

GNU projesinin kalbinde bulunan 32 bitlik eniyileme yapan, iyi bilinen GNU C/C++ derleyicisi (GCC), x86 mimarisini oldukça iyi bir şekilde desteklemektedir ve C kodları içerisine, yazmaç tahsisini özel olarak belirtilerek veya GCC'ye bırakılabilecek şekilde, sembolik makina kodları gömülmesine olanak sağlamaktadır. GCC pekçok platformda, *BSD, VSTa, OS/2, *DOS, Win*, v.b., özellikle Linux'da çalışır.

GCC'yi nereden bulabiliriz

GCC ana sayfası http://gcc.gnu.org/ adresindedir.

GCC'nin DOS tabanlı çalışan sürümüne DJGPP denir.

GCC'nin Win32 tabanında çalışan iki sürümü vardır: cygwin ve mingw

CC'nin bir de OS/2 tabanlı EMX olarak isimlendirilen bir sürümü vardır; DOS altında da çalışır ve unix-benzeri kütüphane yordamlarının pekçoğunu içerir. Şu siteye bir göz atın: ftp://ftp.leo.org/pub/comp/os/os2/leo/gnu/emx+gcc/.

GCC satır içi sembolik makina dili için belgeler nerede

GCC'nin belgelendirmesi belge dosyalarını TeXinfo biçiminde içerir. TeX ile bunları derleyip çıktılarını görebilirsiniz, .info'ya çevirip emacs ile göz atabilirsiniz veya .html'ye çevirebilirsiniz ya da hemen hemen istediğiniz herhangi bir biçime; istediğiniz herhangi bir şeye çevirin (düzgün araçlarla) veya olduğu haliyle okuyun. .info dosyaları GCC için yapılan herhangi bir iyi yüklemede bulunur.

Bakmak için doğru yer C Extensions::Extended Asm::'dir.

Invoking GCC::Submodel Options::i386 Options:: kısmı da size yardımcı olabilir. Özellikle, yazmaçlara i386'ya özgü kısıtlandırılmış isimler verir: abcdSDB sırasıyla %eax, %ebx, %ecx, %edx, %esi, %edi ve %ebp (%esp için bir harf yok)'ye karşılık gelmektedir.

DJGPP Oyun kaynağı (sadece oyun ustaları için değil) özellikle sembolik makina diliyle ilgili bir sayfaya sahipti, fakat artık erişilebilir değil. Herşeye rağmen oradaki veriler DJGP ve diğer faydalı bilgilerin madenini içeren belgeler tekrar bir araya getirilmiştir: http://www.delorie.com/djgpp/doc/brennan/ ve http://www.castle.net/~avly/djasm.html

GCC, makina diline çeviri için GAS'a (aşağıyı inceleyiniz) dayanır; şunu unutmayın ki satır içi asm yüzdelik karakterlerinin çift tırnak içerisine alınmasına ihtiyaç duyar ve GAS'a onlar aktarılacaktır. Aşağıdaki GAS bölümüne bakınız.

Linux çekirdeğinin kaynağının alt dizini olan linux/include/asm-i386/ altında çokça örnek bulabilirsiniz.

GCC'yi uygun satıriçi sembolik makina kodu üretmesi için çağırmak

Çekirdek başlık dosyalarındaki (ve büyük ihtimal sizin kendi başlığınızda da, eğer kendi sembolik makina programlamanızı Linux çekirdeğindeki gibi temiz yaparsanız) sembolik makina yordamları harici satıriçi (extern inline) işlevlere gömülü olduğundan, GCC, kullanabilir olduğu bu yordamlar için, -O seçeneği ile çağrılmalıdır (veya -O2, -O3, v.b.). Aksi halde, kodunuz derlenebilir, fakat, programınızın bağlı olduğu kütüphanelere karşın satıriçi olmayan harici kütüphanelere bakıyor olacağından, düzgün şekilde bağlanmaz. Başka bir yöntem ise yordamların sonçare sürümlerini içeren kütüphanelere bağlantı yapmaktır.

Satıriçi çeviri (sembolik makine diline) -fno-asm ile devre dışı bırakılabilir, böylece derleyici, genişletilmiş satıriçi kodlar kullanılırken çalışmayacaktır veya bağlayıcının algılıyamacağı asm() isimli işleve çağrılarda bulunacaktır. Bu bayrağın çalışmasına karşı durum için, -fasm bayrağı ile asm anahtar kelimesine karşı olan davranış geri kazandırılır.

Daha genel olarak x86 platformunda GCC için iyi derleme seçenekleri şu şekildedir:

   gcc -O2 -fomit-frame-pointer -W -Wall

-O2 pekçok durumda iyi bir eniyileme seviyesidir. Bunun yanında eniyileme uzun zaman alır ve de kodun olduğundan daha büyümesine sebep olur, fakat neticede olduğundan biraz daha hızlı çalışır hale gelir; böylesi bir aşırı eniyileme sembolik makina dilinde her halükarda yaptığınız sıkı döngülerde (eğer varsa) faydalı olabilir. Eğer gerçekten de bazı seyrek dosyalar için oldukça güçlü bir eniyilemeye ihtiyaç duyarsanız, -O6'yı kullanmayı deneyin.

-fomit-frame-pointer kullanımı, üretilen kodun aptal çerçeve gösterici onarımını (frame pointer maintenance) atlamasını sağlar, bu da kodun daha küçük ve hızlı olmasını sağlar ve de bir yazmacı sonraki kullanımlar için boşaltır. (gdb)'nin kolay kullanımına müsade etmez, fakat bunları kullandığınız zaman, boyut ve hızı artık dert etmezsiniz.

-W -Wall ile tüm faydalı uyarıları etkinleştirilir ve aleni yapılan aptalca hataları yakalamanızı sağlar.

İşlemciye özel, -m486 gibi komutlar ekleyerek üretilen kodun size özel işlemciye daha uygun halde olmasını sağlayabilirsiniz. Modern GCC'nin komut sadırı seçenekleri -mpentium ve benzeri şeklindedir (PGCC'de daha da fazladır), oysa ki GCC 2.7.x ve daha eski sürümleri böyle değildir. İşlemciye özel en iyi seçeneklerin neler olacağı Linux çekirdeği içindedir. Daha ayrıntılı bilgi için şu anki GCC'nizin belgelendirmesini inceleyiniz.

-m386 boyutta eniyilemeyi sağlamaktadır, bu da belleğin sıkı (tight) olmasını ve/veya yüklenmiş olan bilgisayarlarda hızlanmayı sağlamaktadır, çünkü büyük programlar takas alanı kullanımına sebep olmaktadır, bu da daha büyük kodlar için sayılandan daha çok eniyilemeye meyledilecek demektir. Bu tür ayarlarda, C dilini kullanmayı bırakmak faydalı olabilir, bunun yerine işlevsel bir dil ve/veya FORTH gibi kod çözümlemeye meyilli bir dil kullanın ve bayt seviyesi (bytecode) - veya sözcük seviyesi (wordcode) - tabanlı bir gerçekleme kullanın.

Kod üretim seçeneklerini dosyadan dosyaya değiştirebilirsiniz, böylece başarımın önemli olduğu dosyalar azami eniyileme kullanacaklardır, oysa ki diğerleri boyutlarına göre eniyileneceklerdir.

Daha çok eniyileme için, -mregparm=2 seçeneği ve/veya buna karşılık gelen işlev davranışları yardım edebilir, fakat yabancı kodlara, libc dahil, ilintileme yaparken pekçok soruna sebep olabilir. Yabancı işlevlerin bildirimi için yollar vardır, böylece doğru çağrı sırası üretilmiş olur veya yabancı kütüphanelerinizi aynı yazmaç tabanlı çağrı uzlaşımlarını kullanacak şekilde tekrar derlemeyi isteyebilirsiniz.

/usr/lib/gcc-lib/i486-linux/2.7.2.3/specs dosyasını (veya her nerede ise) düzenleyerek bu secenekleri öntanımlı olarak ekleyebilirsiniz (-W -Wall seçeneklerini eklememek daha iyi olacaktır). GCC'ye özel dosyalarınızın sisteminizde nerede olduğunu gcc -v ile öğrenebilirsiniz.

Makro desteği

GCC, satır içi sembolik makina dilinde yazmaç kısıtlamalarını belirlemenizi sağlar (ve gerektirir), böylece eniyileyicinin bunlar hakkında herzaman bilgisi olur; satır içi sembolik makina kodu gerçekten bir takım kalıplardan oluşmuştur, zorunlu şekilde oluşturulan kodlardan değil.

Böylece sembolik makina kodunuzu CPP makrolarının ve satır içi C fonsiyonlarının içine koyabilirsiniz ve böylece herhangi biri onu herhangi bir C işlevi/makrosu olarak kullanabilir. Satıriçi işlevler makrolara çok benzer, fakat kullanmak için daha temizdir. Tüm bu durumlarda, kodun tekrar edeceğine (dublicate) dikkat edin, bundan dolayı asm kodunda sadece yerel etiketler (1: tanımlanmış olmalıdır. Yine de, bir makro yerel olmayan etiketlerin parametre olarak aktarılmasına izin verecektir (veya sizin bazı ek meta programlama yöntemleri kullanmanız gerekecektir). Ayrıca şuna da dikkat edin, satıriçi sembolik makina kodu üretmek, içerisinde olası hataların da yayılmasına sebep olacaktır; bundan dolayı böylesi bir satıriçi asm kodundaki yazmaç kısıtlamalarını iki kere kontrol edin.

Son olarak, C dilinin kendisi, sembolik makina dili programlama için iyi bir soyutlama katmanı olabilir ve bu da sizi sembolik makina dilinin pekçok sorunlarından kurtarır.

GAS

GAS, GCC'nin güvendiği GNU Çeviricisidir (Assembler).

Nereden Bulurum

GCC'yi bulacağınız yerdeki ikilik uygulama paketleri (binutils paketi) içerinde bulabilirsiniz. İkilik uygulama paketinin son sürümü http://sources.redhat.com/binutils/ adresinden temin edilebilir.

Şu AT&T sözdizimi de ne ola ki

GAS 32 bit Unix derleyicilerini desteklemek için icat edildiğinden, standart AT&T sözdizimini kullanmaktadır. Bu söz dizimi UNIX dünyasında bir standart olan m68k çeviricilerinin sözdizimine benzemektedir. Bu sözdizimi Intel'in söz diziminden ne daha iyi ne de daha kötüdür. Alıştıktan sonra, Intel sözdiziminden daha sıradan bulursunuz, hatta biraz daha sıkıcı.

GAS sözdizimi ile ilgili temel uyarılar:

  • Yazmaç isimleri % ile başlar, bunun için de eax, dl, v.b isimler yerine, yazmaçlar %eax, %dl, v.b. şekilde isimlendirilir. Bu da, harici C sembollerinin, herhangi bir karıştırma riski olmadan veya herhangi bir çirkin görünümlü alt çizgi kullanma ihtiyacı olmadan, sembolik makina kodu içerisine dahil edilmesine olanak sağlar.

  • Intel'deki geleneksel önce hedef sonra kaynak kuralının tersine, terimlerin sırası kaynak-önce/hedef-sonra şeklindedir. Böylece, Intel'de mov eax,edx (edx yazmacının içeriğini eax içerisine taşı) şeklindeki bir sözdizimi GAS'da mov %edx,%eax haline gelecektir.

  • Terim genişliği, komut adına bir sonek olarak belirtilir. Sonek olarak kullanılan b (8 bit) bayt için, w (16 bit) kelime (word) için ve l (32 bit) long içindir. Mesela, yukarıdaki ifade için doğru sözdizimi movl %edx,%eax şeklinde olacaktır. Yine de, gas katı bir AT&T sözdizimi gerektirmemektedir, bunun için de yazmaç terimlerinin genişliği tahmin edilebildiğinde sonek isteğe bağlıdır, aksi durumlarda öntanımlı olarak 32 bittir (bir uyarı ile birlikte).

  • Anlık değerler önlerine bir $ konarak belirtilir, addl $5,%eax örneğinde olduğu gibi (uzun tamsayı olarak anlık 5 değerini %eax yazmacına ekle).

  • Terim öneklerinin olmaması, terimin bir bellek içeriği olduğu anlamına gelmektedir; burada movl $foo,%eax foo'nun adresini %eax'e koyarken, movl foo,%eax foo'nun içeriğini %eax yazmacına koymaktadır.

  • Sıralama veya yönlendirme, referans yazmacını veya yönlendirme bellek hücresi adresini parantez içerisine almakla sağlanır, testb $0x80,17(%ebp)'de olduğu gibi (%ebp ile işaret edilen hücreden 17 birim uzaklıktaki baytın en yüksek anlamlı bitini sına).

Not: AT&T ve Intel çevirici sözdizimleri arasında kaynak kodu dönüşümü için birkaç programın size yardımı dokunabilir, bazıları her iki yönde de dönüşüm gerçekleştirebilmektedir.

GAS'ın TeXinfo biçiminde, en azından kaynak dağıtımıyla gelen, kapsamlı bir belgelendirmesi vardır. .info sayfalarını Emacs veya herhangi birşeyle gözden geçirin. GAS kaynak paketi içerisinde gas.doc veya as.doc isimli bir dosya olsa gerek, fakat TeXinfo belgeleri arasına gömülmüştür. Elbette, herhangi bir şüphe durumunda en iyi belgelendirme kaynağın kendisidir! Sizi özellikle ilgilendiren kısım Machine Dependencies::i386-Dependent::'dır.

Yine, Linux kaynağı (işletim sistemi çekirdeği) mükemmel bir örnek olarak gelmektedir; linux/arch/i386/ altındaki şu dosyalara bakınız: kernel/*.S, boot/compressed/*.S, math-emu/*.S.

Eğer bir çeşit dil, bir evre (thread) paketi, v.b. yazıyorsanız diğer dillerin (OCaml, Gforth, v.b.) veya evre kütüphanelerinin (QuickThreads, MIT pthreads, LinuxThreads, v.b.) bu işleri nasıl yaptıklarına bakabilirsiniz.

Son olarak, bir C kodunu sembolik makina diline derlemek de aradığınız komut çeşitleriyle ilgili sözdizimini size gösterebilir. Yukarıdaki Sembolik makina diline ihtiyacınız var mı? kısmına bakınız.

Intel sözdizimi

İyi haber şu ki 2.10 sürümünden itibaren, GAS Intel sözdizimini de desteklemektedir. .intel_syntax komutu ile bu kipe geçiş sağlanabilir. Ne yazık ki, resmi binutils kılavuzunda bu belgelenmemiştir (henüz?), dolayısiyle kullanmak istiyorsanız, binutils'in 2.11 AMD64 tabanlı sürümünü, http://www.lxhp.in-berlin.de/lhpas86.html adresinden inceleyiniz.

16 bitlik kip

Binutils (2.9.1.0.25+) i386 kişisel bilgisayarlarda tam olarak 16 bitlik kipi desteklemektedir (yazmaçlar ve adreslemeler). .code16 ve .code32'yi çevirme kipleri arasında geçiş için kullanın.

Ayrıca, pekçok kimse (işletim sistemine kitaplık (kit) hazırlayan yazarlar da dahil) tarafından kullanılan zeki hilelerden birisi de GCC'yi 16 bitlik gerçek kip için kod üretmeye zorlamaktır, bu da asm(".code16\n") şeklinde bir satıriçi ifade ile sağlanır. GCC halen 32 bitlik adresleme kipleri üretirken, GAS onlar için uygun 32 bitlik önekleri ekleyecektir.

Makro desteği

AS, texinfo belgelerinde de belirtildiği gibi makro desteği de barındırmaktadır. Üstelik, GCC .s dosyalarını GAS'a göndermek için işlenmemiş birer sembolik makina kodu olarak algılarken, aynı zamanda .S dosyalarını GAS'a göndermeden önce CPP süzgecinden de geçirmeyi algılıyabilmektedir. Tekrar tekrar, örnekler için Linux kaynaklarına bakınız.

GAS'ın ayrıca GASP önişlemcisi de vardır, ki bu da makrosembolik makine dili hilelerinin GAS'a dahil olmasını sağlamaktadır. GASP, GAS binutils paketi içerisinde gelmektedir. CPP ve M4 gibi filtre olarak çalışmaktadır. Ayrıntılar hakkında hiç bilgim yok, fakat kendi texinfo dosyasıyla beraber gelmektedir, gözatmak (info gasp), çıktısını almak isteyebilirsiniz. GAS ve GASP bana sıradan makro-çeviriciler gibi gelmektedir.

NASM

Netwide Assembler Projesi, C ile yazılmış, bilinen tüm sözdizimlerine ve nesne biçimlerine uyması gereken, hoş bir i386 çeviricisi sunmaktadır.

NASM'ı nereden bulurum

http://nasm.sourceforge.net, http://sourceforge.net/projects/nasm/ adreslerinde bulabilirsiniz.

Kullandığınız olağan yansınızdaki ikilik sürümü devel/lang/asm/ dizini altındadır. Aynı zamanda .rpm ve .deb biçiminde Linux dağıtımlarının 'contrib' kısmında bulunması lazım.

Ne yapar

Söz dizimi Intel sözdizimidir. Kapsamlı makro işleme desteği eklenmiştir.

Desteklenen nesne dosyaları bin, aout, coff, elf, as86, obj (DOS), win32, rdf (onların kendi biçimi).

NASM, özgür LCC derleyicisi için bir arka uç (backend) olarak kullanılabilir (destek dosyaları eklenmiştir).

16 bitlik derleyici olarak BCC kullanmadığınız sürece (ki bu da bu 32 bitlik NASIL belgesinin kapsamı dışındadır), AS86 veya MASM yerine kesinlikle NASM kullanmalısınız, çünkü her platformda çalışır.

Not

NASM, NDISASM isimli bir tersine çevirici (disassembler) ile beraber gelmektedir.

El yazım çözümleyicisi onu GAS'tan daha hızlı hale getirmektedir, buna rağmen elbette ki, 3 bazilyon (1 zilyondan büyük oldukça büyük bir sayı) değişik mimariyi desteklememektedir. Eğer GAS sözdiziminin aksine, Intel tarzı sözdizimini seviyorsanız, bu tercih edeceğiniz çevirici olacaktır.

Not: AT&T ve Intel çeviricileri arasında kaynak kod dönüşümünü sağlayan çok az program bulunmaktadır; bazıları her iki yönde de çeviri yapabilmektedir.

Diğer Sembolik Makina Çeviricileri

Değişik ve göze çarpan özellikleriyle ilginizi çekebilecek başka sembolik makina çeviricileri de bulunmaktadır.

Not

Klasik olmayan/Yüksek seviyeli gibi değişik geliştirilme seviyelerinde olabilirler.

AS86

AS86 makro desteğine sahip 16 bit ve 32 bitlik çalışma kipleri olan 80*86 çeviricisidir. Intel sözdizimine sahiptir fakat adresleme kiplerinde ufak farklılıkları vardır. Bir süre önce Linux çekirdeğinin de içinde bulunduğu pekçok projede kullanılıyordu. Daha sonra bu projeler GAS ve NASM içerisinde kullanılmaya başlandı. Bildiğim kadarıyla ELKS halen kullanmaya devam etmektedir.

AS86 http://www.cix.co.uk/~mayday/ adresinde bin86 paketi içerisinde bir bağlayıcı ile (ld86) veya ayrı bir dosya olarak bulunabilir. Kılavuz sayfalarında ve kaynak paketteki asm.doc içerisinde belgelendirmesi bulunmaktadır. Şüpheye düştüğünüzde kaynağın kendisi iyi bir kılavuzdur: İyi şekilde açıklama satırları olmasa da programlama şekli oldukça doğrudur. ELKS, LILO veya Tunes 0.0.0.25 içerisinde AS86 nasıl kullanıldığına bakmak isteyebilirsiniz.

Not

Çekirdeğin 2.4 sürümünden önce tamamen modası geçmiş bir sürümü, HJLu tarafından, bin86 adı ile, şu an herhangi bir Linux GCC deposunda bulunabilir, sadece Linux çekirdeğini derlemek için dağıtılıyordu. Fakat hiç kimseye bunu Linux çekirdeğini derlemek dışında başka bir şeyde kullanmasını önermem. Bu sürüm sadece elden geçirilmiş bir minix nesne dosyası içermektedir ve bu da GNU binutils ya da başka herhangi bir şey tarafından desteklenmediği gibi 32 bitlik kipinde bazı hatalar vardır, dolayısiyle onu sadece Linux çekirdeğini derlemekte kullanırsanız daha iyi olur.

Belgeleri nerden bulurum

Kaynak paketteki kılavuz sayfalarına ve as.doc belgesine bakınız. Şüpheye düşüldüğünde, kaynağın kendisi en iyi belgedir: yorum satırları iyi yazılmamıştır, fakat yazılım geliştirme tarzı çok açıklayıcıdır. as86'nın ELKS, LILO veya Tunes 0.0.0.25... uygulamalarında nasıl kullanıldığına bakabilirsiniz.

AS86'nın BCC ile kullanımı

.s asm'yi a.out .o nesne ve .l listeleme dosyasına dönüştürmek için BCC kullanımıyla ilgili GNU Makefile dosya satırı şöyledir:

%.o %.l:        %.s
        bcc -3 -G -c -A-d -A-l -A$*.l -o $*.o $<

Eğer herhangi bir listeleme istemezseniz, %.l, -A-l ve -A$*.l kısımlarını kaldırın. a.out dışında başka bir şey isterseniz, BCC belgelerini diğer desteklenen dillerle ilgili olarak inceleyebilirsiniz ve/veya GNU binutils objcopy uygulamasını kullanabilirsiniz.

YASM

YASM, NASM çeviricisinin tamamen yeniden GNU GPL (bazı kısımları "yeni" BSD Lisansı altındadır) altında tekrar yazılmış halidir. Temelden itibaren çoklu söz dizimine (örn. NASM, TASM, GAS, v.b.) ve çoklu çıktı nesne biçimlerine izin vermek için tasarlanmıştır. Tüm tasarım içerisindeki önemli modüllerden biri de eniyileme gerçekleştiren modüldür.

Umut verici görünmektedir; yoğun şekilde bir gelişim sürecindedir, siz de bunda yer almak isteyebilirsiniz. http://www.tortall.net/projects/yasm/ adresine bakınız.

FASM

FASM (düz çevirici-flat assembler) 'düz gerçek modda' ('flat real mode') çalışan, verimli ve hızlı bir 80x86 çeviricisidir. Diğer pekçok 80x86 çeviricisinin tersine, ihtiyaç duyduğu bilgiyi eklemek için sadece kaynak koda gereksinim duyar. Kendi diliyle yazılmıştır, çok küçük ve hızlıdır. DOS/Windows/Linux altında çalışabilir, DOS EXE, Win32 PE ve COFF çıktıları gibi, düz ikilikler üretir (flat binary). http://fasm.sourceforge.net/ adresine bakınız.

OSIMPA (SHASM)

osimpa, 80x86 ve sonraki kuşakları için, tamamen GNU Bash komut yorumlama kabuğunda yazılmış olan bir çeviricidir. osimpa'nın atası shasm idi. osimpa daha iyi ayıklanmış, faydalı Linux ELF çalıştırılabilir dosyaları üretebilir ve pekçok HLL-benzeri eklentisi ve programcıya uygun komutları vardır.

Elbetteki, diğer çeviricilerden daha yavaştır. Kendi söz dizimi vardır (x86 opkodları için kendi isimlerini kullanır). Oldukça iyi bir belgeleleme eklenmiştir. ftp://linux01.gwdg.de/pub/cLIeNUX/interim/ adresine bir göz atın. Muhtemelen sıradan işler için kullanmayacaksınız, fakat en azından ilginç bir alan olarak ilginizi hak etmektedir.

AASM

Aasm değişik hedef mimarileri desteklemek için tasarlanmış gelişmiş bir çeviricidir. Kolayca genişletilebilmesi için tasarlanmıştır ve her bir işlemci ve ikilik dosya biçimi için yapılan yekpare çevirici tasarımım için bir alternatif olarak düşünülmelidir.

Aasm sunduğu sembol alanı, ifade makinası, büyük tamsayı desteği, makro yeteneği ve çok sayıdaki ve doğru uyarı mesajları gibi ileri özellikleri ile sembolik makina programlamayı kolay hale getirmelidir. Değişken modüler yapısı dinamik kütüphanelerin eklenmesine imkan sağlamaktadır.

Girdi modulü nasm, tasm, masm, v.b gibi söz dizimlerini destekler. x86 çevirici modulü MMX, SSE ve 3DNow'ı da içeren P6'ya kadar uzanan opkod uzantılarını destekler. F-CPU ve SPARC çevirici modulleri geliştirilme aşamasındadır.

http://savannah.nongnu.org/projects/aasm/

TDASM

Table Driven Assembler (TDASM) herhangi bir sembolik makina dili için özgür, taşınabilir, platformlar arasında uygunluk gösteren bir çeviricidir. Derleme işlemini tanımlayan bir tablo kullanılarak herhangi bir hedef işlemci için onu bir derleyici olarak kullanmak mümkün olmalıdır.

http://www.penguin.cz/~niki/tdasm/ adresinden temin edilebilir.

HLA

HLA Yüksek Seviyeli Sembolik Makina Dilidir (High Level Assembly). Değişken tanımlama, yordam tanımlama ve yordam çağrıları için yüksek seviyeli dile benzer (Pascal, C/C++ ve diğer yüksek seviyeli dillere benzer) bir sözdizimi kullanmaktadır. Standart makina dili komutları için değiştirilmiş bir sözdizimi kullanmaktadır. Aynı zamanda yüksek seviyeli dile özgü denetim yapıları da (if, while, repeat..until, v.b) sağlayarak, daha okunabilir kodlar yazılmasını sağlamaktadır.

HLA özgürdür ve kaynak kodlarıyla beraber gelmektedir, Linux ve Win32 sürümleri de mevcuttur. Win32 için MASM'a ve de MS-link'in Win32 de çalışan 32 bitlik sürümüne ihtiyacınız vardır, Linux üzerinde GAS'a ihtiyacınız vardır, çünkü HLA özelleştirilmiş sembolik makina kodu üretir ve en son aşamadaki çevirme ve bağlama işlemlerinde bu çeviriciyi kullanır.

TALC

TALC bir diğer MASM/Win32 tabanlı derleyicidir (yine de ELF çıktısını desteklemektedir, değil mi?).

TAL, Typed Assembly Language sözcüklerinin kısaltmasıdır. Yazım açıklamalı geleneksel türsüz sembolik makina dilini, bellek yönetim ilkellerini ve yazım kurallarının bir ses kümesini içermesi yanında bellek güveliğini sağlama, akış güvenliği denetimi ve TAl programlarının yazım güvenliği konusunda zenginleştirilmiştir. Bunun yanında yazma yapıları, kayıtlar ve yapılar içeren, diziler, polimorfik ve yüksek seviyeden işlevler içeren, olağandışılıklar, soyut veri yapıları, altyazımlar ve modüller içeren kaynak programlama dili özelliklerini çözümleyecek kadar, yeterince açıklayıcıdır. TAL düşük seviyeli derleyici eniyilemelerini kabul etme esnekliğiyle tek başına önemli bir yere sahiptir. Sonuç olarak, TAL tür yönlendirmeli derleyiciler, taşınabilir kod uygulamarı içerisinde doğrulanmış güvenli kod veya genişleyebilir işletim sistemi çekirdekleri üretmek isteyen biri için ideal bir platformdur.

Özgür Pascal (Free Pascal)

Free Pascal dahili bir 32 bitlik çeviriciye (NASM tablolarına dayanan) sahiptir ve seçeneklerle ayarlanabilen çıktıları şunlardır:

  • İkilik (çapraz olarak .o derlendiğinde ELF ve coff) çıktı
  • NASM
  • MASM
  • TASM
  • AS (aout,coff, elf32)

MASM ve TASM çıktılarının hataları diğer ikisi kadar güzel ayıklanmamıştır, fakat bu da bazen yararlı olabilir.

Çeviricinin görünüşü ve kullanımı Turbo Pascal'ın dahili BASM'ına dayanmaktadır, IDE benzeri renklendirmeleri desteklemektedir, FPC'de tam olarak gcc ile içiçe geçebilir (C düzeyinde, C++ değil).

Aptal bir RTL kullanarak bile, birisi saf sembolik makina kodu üretebilir.

Win32Forth derleyicisi

Win32Forth, Win32s, Win95, Win/NT altında çalışan, özgür bir 32-bit ANS FORTH sistemidir. FORTH dilini yansıtacak 32 bitlik özgür bir derleyici (önekli veya sonekli bir sözdizimine sahip olabilir) barındırır. Makro işleme FORTH dilinin gücüyle gerçeklenir; yine de, girdi ve çıktı içeriğini tek destekleyen Win32For'un kendisidir (.obj dosyalarının dökümlenmesi yoktur, fakat bu özelliği ekleyebilirsiniz). ftp://ftp.forth.org/pub/Forth/Compilers/native/windows/Win32For/ adresine bakınız.

Terse

TERSE, x86 ailesi için en öz sembolik makine dili sözdizimini sağlayan yazılım geliştirme aracıdır! Yine de şeytani bir yazılımdır. Bir yerlerde, orjinal yazarın sözdizimine sahip çıktığı, değersiz hileler içerdiğinden sonradan ortadan kaldırılan, özgür bir kopyasının olduğu söylenir. Eğer sembolik makina dili korsanlığıyla ilgili kendinize ilgi çekici bir proje arıyorsanız, sizi NASM için bir terse-sözdizimi ucu geliştirmeye davet ediyorum, tabii eğer o sözdizimini severseniz.

comp.compilers'da tarihi bir not:

999/07/11 19:36:5, moderator şöyle yazmış:

"Çeviricilerin oldukça kötü bir söz diziminin olması zorunluluğunun
bir sebebi yok. Yaklaşık 30 yıl önce, Niklaus Wirth'in PL360'ını
kullandım, temelde S/360 çeviricisi olan, Algol sözdizimine sahip ve
döngülerin açık dallanmalara dönüşmesinden dolayı biraz sentetik şeker
gibi bir çeviriciydi. Aslında gerçekten de bir çeviriciydi, örn.
ifadenizi yazmaçlara gidecek açık değer atamalarıyla yazmalıydınız,
fakat oldukça hoştu. Gene de Algol W ile, Algol'un hızlı bir alt kümesi,
Pascal'ın atası ile yazmaya değerdi. Her zaman söylendiği gibi,
atalarına nazaran önemli bir gelişmeydi. -John"

Özgür olmayan ve/veya 32-bit olmayan x86 çeviricileri

Bunların pekçoğunu, x86 sembolik makina dili programlamanın temelleriyle beraber, Raymond Moon'un x86 sembolik makina dili SSS'inde bulabilirsiniz.

DOS tabanlı tüm çeviricilerin, Linux DOS emülatöründe, aynı zamanda benzer diğer emüilatörlerde çalışması gerektiğini unutmayın, dolayısiyle eğer elinizde bir tane varsa, onu hala gerçek bir işletim sistemi içerisinde kullanabilirsiniz. DOS tabanlı çeviriciler, GNU BFD kütüphanesi tarafından desteklenen, COFF ve/veya diğer nesne dosyalarını destekler, dolayısiyle bunları kendi özgür 32 bitlik araçlarınızla kullanabilirsiniz ve belki de GNU objcopy'i de (binutils'in bir parçası) bir dönüştürme aracı olarak kullanabilirsiniz.