internet pencereler Android

Assembler işletim sistemi. Assembler Okulu: İşletim Sistemi Geliştirme

Son zamanlarda assembler öğrenmeye karar verdim, ancak kod satırlarını boşa harcamak istemedim. Montajcıyı öğrendikçe bazı konularda uzmanlaşacağımı düşündüm. Bu yüzden seçimim bir önyükleyici yazmaya düştü. Bulgularımın sonucu burada bu blogda.

Teori ile pratiği bir arada sevdiğimi hemen söylemek isterim, o halde başlayalım.

İlk önce, size en basitini nasıl oluşturacağınızı göstereceğim. MBR Böylece mümkün olan en kısa sürede sonucun tadını çıkarabiliriz. Pratik örnekleri karmaşık hale getirirken teorik bilgiler vereceğim.

Önce USB bellek için bir önyükleyici yapalım!

Dikkat!!! İlk montaj programımız hem USB flash sürücü hem de Disket - disk veya Sabit disk gibi diğer cihazlar için çalışacaktır. Ardından tüm örneklerin doğru çalışabilmesi için kodun farklı cihazlarda nasıl çalıştığına dair bir takım açıklamalar yapacağım.

üzerine yazacağız Fasm, yükleyicileri yazmak için en iyi derleyici olarak kabul edilen kişi olduğu için MBR. Fasm'ı seçmenin ikinci nedeni, dosya derleme sürecini büyük ölçüde basitleştirmesidir. Komut satırı yönergeleri vb. yok. birleştirici öğrenmeyi tamamen engelleyebilecek ve hedeflerimize ulaşabilecek saçmalık.Bu nedenle, ilk aşamada iki programa ve bazılarına ihtiyacımız var. gereksiz minimum boyutta flash sürücü. Kendime 1Gb kazdım (hızlı biçimlendirilmiş ve bu üzücü değil). Önyükleyicimizin çalışmasından sonra flash sürücü normal şekilde çalışmayı durduracaktır. Windows 7, çubuğumu biçimlendirmeyi reddediyor. Yardımcı programla flash sürücüyü hayata döndürmenizi tavsiye ederim. HP USB Disk Depolama Biçimi Aracı ( HPUSBFW.EXE) veya flash sürücüleri biçimlendirmek için diğer yardımcı programlar.

Bunları kuruyoruz ve uygun kısayolları masaüstüne veya istediğiniz yere atıyoruz.

Hazırlık bitti hadi harekete geçelim

Fasmw.exe'yi açın ve aşağıdakileri buraya yazın. Sonucu görmek için minimum minimum kodu çizeceğiz. Daha sonra burada neyin sıcak olduğunu analiz edeceğiz. Kısaca yorum yapıyorum.

FASM kodu: ============= boot.asm ===============

kuruluş 7C00h; programımızın adresleri bu yönerge dikkate alınarak hesaplanır

kullanım16; onaltılık bir kod oluşturulur

cli; segment kayıtlarındaki adresleri değiştirmek için kesmeleri devre dışı bırak

hareket baltası, 0

mov sp, 7C00h

sti; kesintileri etkinleştir (adresleri değiştirdikten sonra)

mov balta, 0003h; ekrana bir çizgi görüntülemek için video modunun ayarlanması

int 10h

mov ax, 1301h; aslında 13h int 10h dize işlevinin çıktısı (daha sonra ayrıntılı olarak)

mov bp, stroka; çıkış satırının adresi

mov dx, 0000h; metnin görüntülendiği satır ve sütun

mov cx, 15; çıktı dizesinin karakter sayısı

mov bx, 000eh; 00-video sayfa numarası (dokunmamak daha iyidir) 0e-karakter öznitelikleri (renk, arka plan)

int 10h

jmp $; zaman işaretle (programı bu noktada döngüye alır)

stroka db "Tamam, MBR yüklendi!"

çarpı 510 - ($ - $$) db 0; önceki bayt ile son bayt arasındaki boşluğu sıfırlarla doldurma

db 0x55, 0xAA; son iki bayt

Bu kodu (Ctrl + F9) fasm "e'de derleyin ve ortaya çıkan ikili dosyayı uygun bir yere boot.bin olarak kaydedin. İkili dosyamızı bir USB flash sürücüye yazmadan önce biraz teori.

USB flash sürücüyü bilgisayara taktığınızda, USB flash sürücüden önyükleme yapmak istediğiniz BIOS sistemi tarafından kesinlikle açık değildir, bu nedenle BIOS ayarlarında önyükleme yapmak istediğiniz cihazı seçmeniz gerekir. USB'den önyüklemeyi seçti (bunu nasıl yapacağınızı kendiniz bulmanız gerekecek, çünkü BIOS arayüzü farklı varyasyonlara sahiptir ... anakartınız için BIOS ayarlarını google'da aratabilirsiniz. Kural olarak, orada karmaşık bir şey yoktur).

Artık BIOS, flash sürücüden önyükleme yapmak istediğinizi bildiğine göre, flash sürücüdeki sıfır kesimin önyüklenebilir olduğundan emin olmalıdır. Bunu yapmak için, BIOS şuna bakar: sıfır sektörünün son iki baytı ve eğer 0x55 0xAA'ya eşitlerse, ancak o zaman RAM'e yüklenecektir. Aksi takdirde, BIOS flash sürücünüzün yanından geçecektir. Bu iki sihirli baytı bulduktan sonra, sıfır sektörü 0000: 7C00h adresindeki RAM'e yükler ve ardından USB flash sürücüyü unutur ve kontrolü bu adrese aktarır. Artık bilgisayar üzerindeki tüm güç önyükleyicinize aittir ve zaten RAM'den hareket ederek USB flash sürücüden ek kod yükleyebilir. Şimdi bu sektörün DMDE programında nasıl göründüğünü göreceğiz.

1. USB flash sürücünüzü bilgisayara takın ve ihtiyacınız olan bilgileri içermediğinden emin olun.

2. DMDE programını açın. Şekillerdeki diğer tüm eylemleri okuyun:

Bu çizgi romanı izledikten sonra, MBR'nizi bir USB flash sürücüye indirme becerisine sahip olacaksınız. Ve yükleyicimizin çalışmasının uzun zamandır beklenen sonucu şöyle görünüyor:


Bu arada, minimum önyükleyici kodu hakkında konuşursak, şöyle görünebilir:

Kuruluş 7C00h
jmp $
db 508 kopya (0)
db 0x55,0xAA

Kontrolü alan böyle bir yükleyici, bir döngüde anlamsız bir jmp $ komutu yürüterek bilgisayarı kapatır. Ben ona işaretleme zamanı diyorum.

YouTube'da size yardımcı olabilecek bir video yayınladım:

Son olarak, önyükleyici hakkında birkaç kısa bilgi:

1. Bootloader olarak da bilinen MBR olarak da bilinen Bootloader, 512 bayt boyutundadır. Tarihsel olarak,
eski medya ve cihazları desteklemek için bu koşulun karşılanması gerekir.
2. Yükleyici, DMDE programı veya cihazlarla çalışmanıza izin veren diğer hex editörleri açısından her zaman flash sürücünün, disketin, sabit diskin sıfır sektöründe bulunur. İkili dosyayı (boot.bin'imiz) listelenen cihazlardan birine indirmek için, dahili fiziksel yapılarını düşünmemize gerek yoktur. DMDE programı sadece bu cihazlarda sektörlerin nasıl okunacağını bilir ve bunları LBA modunda görüntüler (sadece 0'dan son sektöre kadar numaralandırır). LBA hakkında okuyabilirsiniz
3. Önyükleyici her zaman iki bayt 0x55 0xAA ile bitmelidir.
4. Yükleyici her zaman 0000: 7C00h adresindeki belleğe yüklenir.
5. İşletim sistemi önyükleyici ile başlar.


Hemen söylüyorum, makaleyi "Lanet olsun, başka bir Popov" düşüncesiyle kapatmayın. O sadece bir Ubuntu'ya sahip ve çekirdek ve uygulamalar da dahil olmak üzere her şeye sıfırdan sahibim. Yani, kesimin devamı.

işletim sistemi grubu: Burada.
Önce bir ekran görüntüsü vereceğim.

Artık onlardan yok ve şimdi neden yazdığım hakkında daha ayrıntılı olarak.

Sıcak bir Nisan akşamı, Perşembe günüydü. Çocukluğumdan beri, bir işletim sistemi yazmayı hayal ettim, aniden şöyle düşündüm: "Artık artıları ve eksileri biliyorum, neden hayalimi gerçekleştirmiyorsunuz?" Bu konuyla ilgili Googled siteleri ve Habr'dan bir makale buldu: "İşletim sistemi yazmaya nasıl başlanır ve bırakılmaz". Aşağıdaki OSDev Wiki bağlantısı için yazara teşekkürler. Oraya gittim ve işe başladım. Bir makalede minimum işletim sistemi ile ilgili tüm veriler vardı. Çapraz gcc ve binutils oluşturmaya başladım ve ardından her şeyi oradan yeniden yazdım. "Merhaba, çekirdek Dünya!" Yazıtını gördüğümde sevincimi görmeliydin. Hemen sandalyeden atladım ve fark ettim - pes etmeyeceğim. "Konsol" yazdım (tırnak içinde klavyeye erişimim yoktu), ama sonra bir pencere sistemi yazmaya karar verdim. Sonuç olarak işe yaradı ama klavyeye erişimim olmadı. Sonra X Pencere Sistemine dayalı bir isim bulmaya karar verdim. Googled Y Pencere Sistemi - öyle. Sonuç olarak, OS365 pre-alpha 0.1'de bulunan Z Window System 0.1 olarak adlandırdım. Ve evet, onu benden başka kimse görmedi. Sonra klavye desteğinin nasıl uygulanacağını anladım. Henüz hiçbir şey yokken, pencere sisteminin bile olmadığı ilk sürümün ekran görüntüsü:

Gördüğünüz gibi metin imleci içinde hareket etmedi bile. Sonra birkaç basit Z-tabanlı uygulama yazdım ve işte 1.0.0 alfa sürümü geliyor. Bir çok şey vardı, sistem menüsü bile. Ve dosya yöneticisi ve hesap makinesi işe yaramadı.

Sadece güzelliği önemseyen bir arkadaşım tarafından doğrudan terörize edildim (Mitrofan, üzgünüm). “VBE-modu 1024 * 768 * 32'ye indirdik, indirdik, indirdik! Peki, iç şunu!" Pekala, onu dinlemekten zaten bıkmıştım, ama yine de yıkadım. Aşağıdaki uygulama hakkında.

Her şeyi bootloader yani GRUB yaptım.Bununla Multiboot başlığına birkaç sihirli satır ekleyerek grafik modunu sorunsuz bir şekilde ayarlayabilirsiniz.

ALIGN'ı ayarla, 1<<0 .set MEMINFO, 1<<1 .set GRAPH, 1<<2 .set FLAGS, ALIGN | MEMINFO | GRAPH .set MAGIC, 0x1BADB002 .set CHECKSUM, -(MAGIC + FLAGS) .align 4 .long MAGIC .long FLAGS .long CHECKSUM .long 0, 0, 0, 0, 0 .long 0 # 0 = set graphics mode .long 1024, 768, 32 # Width, height, depth
Sonra Multiboot bilgi yapısından çerçeve arabelleği adresini ve ekran çözünürlüğünü alıp oraya pikselleri yazıyorum. VESA her şeyi çok kafa karıştırıcı bir şekilde yaptı - RGB renkleri ters sırada girilmelidir (R G B değil, B G R). Birkaç gün boyunca anlamadım - pikseller neden görüntülenmiyor!? Sonuç olarak 16 renk sabitinin değerlerini 0 ... 15'ten RGB eşdeğerlerine değiştirmeyi unuttuğumu fark ettim. Sonuç olarak, serbest bıraktım, aynı zamanda degrade arka planını yıkadım. Sonra bir konsol, 2 uygulama yaptım ve 1.2'yi çıkardım. Ah evet, neredeyse unutuyordum - işletim sistemini şu adresten indirebilirsiniz:

Orijinal: AsmSchool: Bir işletim sistemi yapın
Yazar: Mike Saunders
Yayınlanma Tarihi: 15 Nisan 2016
Tercüme: A. Panin
Transfer tarihi: 16 Nisan 2016

4. Bölüm: Serideki önceki makalelerden öğrendiğiniz becerilerle kendi işletim sisteminizi geliştirmeye başlayabilirsiniz!

Bu ne için?

  • Derleyicilerin nasıl çalıştığını anlamak için.
  • CPU'nun talimatlarını anlamak için.
  • Kodunuzu performans için optimize etmek için.

Birkaç ay boyunca, Linux için montaj dilinde basit programların geliştirilmesiyle başlayan ve serinin son makalesinde kişisel bir bilgisayarda çalışan kendi kendine yeterli kodun geliştirilmesiyle sona eren zorlu bir yoldan geçtik. işletim sistemi olmayan bilgisayar. Peki, şimdi tüm bilgileri bir araya toplamaya ve gerçek bir işletim sistemi oluşturmaya çalışacağız. Evet, Linus Torvalds'ın izinden gideceğiz, ancak önce şu soruları yanıtlamaya değer: "İşletim sistemi nedir? Hangi işlevlerini yeniden oluşturmamız gerekecek?"

Bu yazıda yalnızca işletim sisteminin ana işlevlerine odaklanacağız: programları yükleme ve yürütme. Karmaşık işletim sistemleri, sanal bellek yönetimi ve ağ paketi işleme gibi daha birçok işlevi yerine getirir, ancak doğru şekilde uygulanması yıllar süren sürekli çalışmayı gerektirir, bu nedenle bu makalede yalnızca herhangi bir işletim sisteminde bulunan temel işlevleri ele alacağız. Geçen ay bir disketin 512 baytlık bir kesimine (ilk sektörü) uyan küçük bir program geliştirdik ve şimdi diskten ek veri yükleme işlevi eklemek için onu biraz değiştireceğiz.

Önyükleyici Geliştirme

BIOS tarafından yüklenen disketin ilk 512 baytlık sektörüne yerleştirmek için işletim sistemimizin ikili kodunun boyutunu mümkün olduğunca küçültmeye çalışabiliriz, ancak bu durumda biz ilginç işlevleri uygulayamayacak. Bu nedenle, bu 512 baytı, işletim sistemi çekirdeğinin ikili kodunu RAM'e yükleyecek ve çalıştıracak basit bir önyükleyicinin ikili kodunu barındırmak için kullanacağız. (Bundan sonra, diğer programların ikili kodunu diskten yükleyecek ve ayrıca yürütecek olan işletim sistemi çekirdeğini geliştireceğiz, ancak bu biraz sonra tartışılacaktır.)

Bu makalede tartışılan örnekler için kaynak kodunu www.linuxvoice.com/code/lv015/asmschool.zip adresinden indirebilirsiniz. Ve bu, boot.asm adlı bir dosyadaki önyükleyici kodumuz:

BITS 16 jmp kısa başlangıç; Etiket atlama diski açıklamasına atla nop; % disk açıklamasından önceki ekleme, "bpb.asm" başlangıcını içerir: mov ax, 07C0h; Yükleme adresi mov ds, ax; Veri segmenti hareket ekseni, 9000h; Yığın mov ss, axe mov sp, 0FFFFh'yi hazırlayın; Yığın aşağı büyüyor! cld; Yön bayrağı ayarı mov si, kern_filename çağrı load_file jmp 2000h: 0000h; kern_filename db "MYKERNELBIN"% include "disk.asm" dosyasından yüklenen işletim sistemi çekirdeği ikili koduna atlayın 510 - ($ - $$) db 0; 510 bayta kadar sıfırlarla ikili kodun tamamlanması dw 0AA55h; Bootloader ikili kod bitiş etiketi arabelleği:; Diskin içeriği için arabelleğin başlangıcı

Bu kodda, ilk CPU talimatı, NASM derleyicisine 16 bit modunu kullanmasını söyleyen BITS yönergesinden sonra yer alan jmp talimatıdır. Serinin bir önceki yazısından da muhtemelen hatırlayacağınız gibi BIOS aracılığıyla yüklenen 512 bitlik bir ikili kodun diskten çalıştırılması en baştan başlıyor ama özel bir veri setini atlamak için etikete gitmemiz gerekiyor. Açıkçası, geçen ay kodu diskin başına yazdık (dd yardımcı programını kullanarak) ve kalan disk alanını boş bıraktık.

Şimdi uygun bir MS-DOS dosya sistemine (FAT12) sahip bir disket kullanmamız gerekiyor ve bu dosya sistemi ile düzgün çalışabilmesi için sektörün başlangıcına yakın bir dizi özel veri eklememiz gerekiyor. Bu kümeye BIOS Parametre Bloğu (BPB) adı verilir ve disk etiketi, sektör sayısı gibi bilgileri içerir. Bu aşamada bizi ilgilendirmemelidir, çünkü bu tür konulara birden fazla makale dizisi ayrılabilir, bu nedenle ilgili tüm talimatları ve verileri bpb.asm adlı ayrı bir kaynak kod dosyasına yerleştirdik.

Yukarıdakilere dayanarak, kodumuzdaki bu yönerge son derece önemlidir:

% "bpb.asm" içerir

Bu, derleme sırasında belirli bir kaynak dosyanın içeriğinin geçerli kaynak dosyaya dahil edilmesini sağlayan bir NASM yönergesidir. Böylece, BIOS parametre bloğunun uygulanmasının tüm ayrıntılarını ayrı bir dosyada çıkararak, önyükleyicimizin kodunu mümkün olduğunca kısa ve anlaşılır hale getireceğiz. BIOS parametre bloğu, sektörün başlangıcından üç bayt sonra yerleştirilmelidir ve jmp komutu sadece iki bayt aldığından, nop komutunu kullanmamız gerekir (adı "işlem yok" anlamına gelir - bu hiçbir şey yapmayan bir komuttur Atık CPU döngüleri hariç) kalan baytı doldurmak için.

Yığınla çalışmak

Daha sonra, kayıtları ve yığını hazırlamak için önceki makalede tartışılanlara benzer talimatları ve ayrıca belirli talimatlar için yön bayrağını ayarlamanıza izin veren cld talimatını ("açık yön" anlamına gelir) kullanmamız gerekecek, örneğin yürütüldükten sonra SI kaydındaki değeri azaltacak olan lodsb talimatı gibi.

Daha sonra stringin adresini SI registerına koyuyoruz ve load_file fonksiyonumuzu çağırıyoruz. Ama bir dakika düşünün - bu özelliği henüz geliştirmedik! Evet, bu doğru, ancak uygulaması disk.asm adlı eklediğimiz başka bir kaynak dosyada bulunabilir.

MS-DOS'ta biçimlendirilmiş disketlerde kullanılan FAT12 dosya sistemi, var olan en basit dosya sistemlerinden biridir, ancak içeriğiyle çalışmak için çok fazla kod gerektirir. load_file alt yordamı yaklaşık 200 satır uzunluğundadır ve bu makalede gösterilmeyecektir, çünkü belirli bir dosya sistemi için bir sürücü değil, bir işletim sistemi geliştirme sürecini düşünüyoruz, bu nedenle, üzerinde yer harcamak çok makul değildir. günlük sayfaları bu şekilde. Genel olarak, disk.asm kaynak dosyasını neredeyse mevcut kaynak dosyanın bitiminden önce dahil ettik ve bunu unutabiliriz. (FAT12 dosya sisteminin yapısıyla hala ilgileniyorsanız, http://tinyurl.com/fat12spec adresindeki mükemmel genel bakışa göz atabilir, ardından disk.asm kaynak dosyasına bir göz atabilirsiniz - içerdiği kod iyi yorumlamış.)

Her durumda, load_file alt yordamı, SI kaydında belirtilen ada sahip dosyadan ikili kodu 0 ofseti ile segment 2000'e yükler, ardından yürütme için başlangıcına atlarız. Ve hepsi bu - işletim sistemi çekirdeği yüklendi ve önyükleyici işini yaptı!

Kodumuzun, işletim sistemi çekirdek dosyasının adı olarak MYKERNEL.BIN yerine MYKERNELBIN'i kullandığını fark etmişsinizdir; bu, DOS disketlerinde kullanılan 8 + 3 adlandırma şemasına çok uygundur. Aslında, FAT12 dosya sistemi dosya adlarının dahili temsilini kullanır ve nokta karakterini bulmak ve dosya adını dönüştürmek için load_file alt yordamımız içinde bir mekanizmanın uygulanmasını gerektirmeyeceği garanti edilen bir dosya adı kullanarak yerden tasarruf ederiz. dahili dosya sistemi temsiline.

Disk.asm kaynak kod dosyasını bağlama yönergesini içeren satırdan sonra, önyükleyicinin ikili kodunu sıfırlarla 512 bayta doldurmaya yönelik ve ikili kodunun bitiş işaretini içeren iki satır vardır (bu, aşağıdaki bölümde tartışılmıştır). son makale). Son olarak, kodun en sonunda load_file altyordamı tarafından kullanılan "tampon" etiketi bulunur. Genel olarak load_file alt yordamı, diskte bir dosya ararken bazı ara eylemleri gerçekleştirmek için RAM'de boş alan gerektirir ve önyükleyiciyi yükledikten sonra yeterli boş alanımız olur, bu yüzden arabelleği buraya yerleştiririz.

Önyükleyiciyi birleştirmek için aşağıdaki komutu kullanın:

Nasm -f bin -o boot.bin boot.asm

Şimdi MS-DOS formatında sanal bir disket görüntüsü oluşturmamız ve aşağıdaki komutları kullanarak önyükleyicimizin ikili kodunu ilk 512 baytına eklememiz gerekiyor:

Mkdosfs -C floppy.img 1440 dd dönş = notrunc if = boot.bin of = floppy.img

Bu, önyükleyici geliştirme sürecini tamamlar! Artık, mykernel.bin adlı bir dosyadan işletim sistemi çekirdek ikili dosyasını yüklememize ve çalıştırmamıza izin veren bir önyükleme disket görüntüsüne sahibiz. Ayrıca, işin daha ilginç bir kısmı bizi bekliyor - işletim sistemi çekirdeğinin kendisinin geliştirilmesi

İşletim sistemi çekirdeği

İşletim sistemi çekirdeğimizin birçok önemli görevi yerine getirmesini istiyoruz: bir selamlama görüntüleme, kullanıcıdan girdi kabul etme, girdinin desteklenen bir komut olup olmadığını belirleme ve kullanıcı adlarını belirttikten sonra programları diskten yürütme. Bu, mykernel.asm dosyasındaki işletim sistemi çekirdek kodudur:

Mov balta, 2000h mov ds, balta mov es, balta döngüsü: mov si, istem çağrısı lib_print_string mov si, user_input çağrısı cmp bayt, 0 je döngüsü cmp sözcüğü, "ls" je list_files mov ax, si mov cx, 32768 çağrı lib_load_file jc load_fail çağrısı 32768 jmp döngüsü load_fail: mov si, load_fail_msg çağrısı lib_print_string jmp döngüsü list_files: mov si, file_list çağrısı lib_get_file_list çağrısı lib_print_string jmp döngü istemi db 13, 10, "MyOS>", 0 load_fail_ms, 0 user_fail_msg, 256 db 0 file_list kez 1024 db %0 "lib.asm" içerir

Koda bakmadan önce web sitemizden asmschool.zip arşivinde de yer alan lib.asm kaynak kod dosyasının eklenmesi için yönergenin son satırına dikkat etmelisiniz. Bu, aynı zamanda kullanabileceğiniz ekran, klavye, dizgiler ve diskler ile çalışmak için kullanışlı rutinler kitaplığıdır - bu durumda, bu kaynak kod dosyasını işletim sistemi çekirdeğinin ana kaynak dosyasının en sonuna ekliyoruz. ikincisini mümkün olduğunca kompakt ve güzel hale getirmek için ... Mevcut tüm rutinler hakkında daha fazla bilgi için "lib.asm Rutinleri" bölümüne bakın.

İşletim sistemi çekirdek kodunun ilk üç satırında, ikili kodun yüklendiği segment 2000'e işaret etmek için segment kayıtlarını verilerle dolduruyoruz. Bu, lodsb gibi talimatların doğru çalışmasını sağlamak için önemlidir; bu, verileri başka bir bölümden değil, geçerli bölümden okumalıdır. Bundan sonra segmentlerle herhangi bir ek işlem yapmayacağız; işletim sistemimiz 64 KB RAM ile çalışacak!

Kodun devamında, döngünün başlangıcına karşılık gelen etiket bulunur. Her şeyden önce, selamlamayı yazdırmak için lib.asm kitaplık rutinlerinden biri olan lib_print_string kullanıyoruz. Karşılama satırından önceki 13 ve 10 baytları yeni satır karakterleridir, çünkü selamlama herhangi bir programın çıktısından hemen sonra değil, her zaman yeni bir satırda görüntülenecektir.

Daha sonra, kullanıcı tarafından klavye aracılığıyla girilen karakterleri alan ve bunları SI kaydında gösterilen bir arabellekte saklayan lib_input_string adlı başka bir lib.asm alt yordamı kullanırız. Bizim durumumuzda, arabellek, işletim sistemi çekirdek kodunun sonuna yakın olarak şu şekilde bildirilir:

User_input kez 256 db 0

Bu bildirim, sıfırlarla dolu 256 karakterlik bir arabellek oluşturmanıza izin verir - bizimki gibi basit bir işletim sistemi için komutları depolamak için yeterince uzun olmalıdır!

Ardından, kullanıcı girişini doğrularız. user_input arabelleğinin ilk baytı sıfırsa, kullanıcı herhangi bir komut girmeden Enter tuşuna basar; tüm dizelerin boş sonlandırıldığını unutmayın. Yani bu durumda, sadece döngünün başına gitmemiz ve selamlamayı tekrar yazdırmamız gerekiyor. Ancak kullanıcının herhangi bir komut girmesi durumunda öncelikle ls komutunu girip girmediğini kontrol etmemiz gerekecektir. Şimdiye kadar, Assembly dili programlarımızda sadece bireysel baytların karşılaştırmalarını gördünüz, ancak iki baytlık değerleri veya makine kelimelerini karşılaştırmanın da mümkün olduğunu unutmayın. Bu kodda, user_input arabelleğindeki ilk makine kelimesini ls satırına karşılık gelen makine kelimesiyle karşılaştırır ve eğer aynılarsa aşağıdaki kod bloğuna geçeriz. Bu kod bloğunda, diskteki (file_list arabelleğinde saklanması gereken) dosyaların virgülle ayrılmış bir listesini almak, bu listeyi görüntülemek ve kullanıcı girdisini işlemek için döngüye geri dönmek için lib.asm'den başka bir alt yordam kullanırız. .

Üçüncü taraf programların yürütülmesi

Kullanıcı ls komutunu girmezse, programın adını diskten girdiğini varsayıyoruz, bu yüzden yüklemeye çalışmak mantıklı. lib.asm kitaplığımız, bir diskteki FAT12 dosya sistemi tablolarını ayrıştıran kullanışlı bir lib_load_file alt yordamının bir uygulamasını içerir: AX kaydını kullanan bir dosya adıyla bir satırın başına bir işaretçiyi ve bunun için bir ofset değerini kabul eder. CX kaydı kullanılarak program dosyasından ikili kodun yüklenmesi. Kullanıcı giriş dizesine bir işaretçi depolamak için zaten SI kaydını kullanıyoruz, bu nedenle bu işaretçiyi AX kaydına kopyalıyoruz ve ardından ikiliyi program dosyasından yüklemek için bir ofset olarak kullanılan 32768 değerini CX'e koyuyoruz. Kayıt ol.

Ama neden bu özel değeri program dosyasından ikili kodu yüklemek için bir ofset olarak kullanıyoruz? Bu, işletim sistemimiz için bellek haritası seçeneklerinden sadece biri. 64 KB'lık bir segmentte çalıştığımız ve çekirdeğimizin ikili kodu ofset 0'da yüklendiği için, çekirdek verileri için ilk 32 KB'lık belleği ve veriler için kalan 32 KB'yi kullanmamız gerekiyor. yüklenen programlardan Böylece, ofset 32768 segmentimizin ortasında yer alır ve hem işletim sistemi çekirdeği hem de yüklenen programlar için yeterli RAM sağlamamızı sağlar.

Bundan sonra, lib_load_file alt yordamı son derece önemli bir işlem gerçekleştirir: diskte belirtilen ada sahip bir dosya bulamazsa veya herhangi bir nedenle onu diskten okuyamazsa, çıkar ve özel taşıma bayrağını ayarlar. Bu, bazı matematiksel işlemleri gerçekleştirme sürecinde ayarlanan ve şu anda bizi ilgilendirmemesi gereken merkezi işlemcinin durumunun bir bayrağıdır, ancak aynı zamanda hızlı kararlar almak için bu bayrağın varlığını belirleyebiliriz. Eğer lib_load_asm, taşıma bayrağını ayarlarsa, hata mesajını veren ve kullanıcı giriş döngüsünün başına geri dönen kod bloğuna atlamak için jc komutunu kullanırız (eğer taşırsa atla).

Aynı durumda, taşıma bayrağı ayarlanmamışsa, lib_load_asm altyordamının program dosyasından ikili kodu 32768 adresindeki RAM'e başarıyla yüklediği sonucuna varabiliriz. Bu durumda tek ihtiyacımız olan ikili dosyanın yürütülmesini başlatmaktır. bu adrese yüklenen kod, yani kullanıcı tarafından belirtilen programı çalıştırmaya başlayın! Ve bu programda ret komutu kullanıldıktan sonra (çağıran koda dönmek için), sadece kullanıcı girdi işleme döngüsüne geri dönmemiz gerekiyor. Böylece, bir işletim sistemi oluşturduk: lib.asm kitaplığındaki alt programlardan çok fazla yardımla da olsa, yaklaşık 40 satırlık montaj kodu içinde uygulanan, komutları ayrıştırmak ve programları yüklemek için en basit mekanizmalardan oluşur.

İşletim sistemi çekirdek kodunu birleştirmek için aşağıdaki komutu kullanın:

Nasm -f bin -o mykernel.bin mykernel.asm

Bundan sonra mykernel.bin dosyasını bir şekilde disket imaj dosyasına eklememiz gerekecek. Geri döngü aygıtlarını kullanarak disk görüntülerini monte etmeye aşinaysanız, onu kullanarak floppy.img disk görüntüsünün içeriğine erişebilirsiniz, ancak GNU Mtools araç setini (www.gnu.org/software) kullanmak olan daha kolay bir yol var. / mtools). Bu, tüm popüler Linux dağıtımlarının yazılım paketi havuzlarında bulunan MS-DOS / FAT12 dosya sistemlerini kullanan disketlerle çalışmak için bir dizi programdır, bu nedenle apt-get, yum, pacman veya dağıtımınıza yazılım paketleri yüklemek için kullanılan başka herhangi bir yardımcı program.

Uygun yazılım paketini kurduktan sonra mykernel.bin dosyasını floppy.img disk imaj dosyasına eklemek için aşağıdaki komutu çalıştırmanız gerekecektir:

Mcopy -i floppy.img mykernel.bin :: /

Komutun sonundaki komik karakterlere dikkat edin: iki nokta üst üste, iki nokta üst üste ve eğik çizgi. Artık işletim sistemimizi başlatmaya neredeyse hazırız, ancak henüz uygulama olmadığında ne anlamı var? Son derece basit bir uygulama geliştirerek bu yanlış anlaşılmayı düzeltelim. Evet, şimdi kendi işletim sisteminiz için bir uygulama geliştireceksiniz - inekler arasında otoritenizin ne kadar yükseleceğini hayal edin. Aşağıdaki kodu test.asm adlı bir dosyaya kaydedin:

Org 32768 mov ah, 0Eh mov al, "X" int 10h ret

Bu kod, ekranda "X" karakterini görüntülemek için bir BIOS işlevi kullanır ve ardından kontrolü, onu çağıran koda geri döndürür - bizim durumumuzda bu kod, işletim sistemi kodudur. Uygulama kaynak kodunun başladığı kuruluş satırı, merkezi işlemciden gelen bir talimat değil, NASM derleyicisinin, ikili kodun RAM'e 32768 ofsetinde yükleneceğini söyleyen bir yönergesidir. bu durumu dikkate alarak tüm ofsetleri yeniden hesaplayın.

Bu kodun da birleştirilmesi gerekiyor ve ortaya çıkan ikili dosyanın disket görüntü dosyasına eklenmesi gerekiyor:

Nasm -f bin -o test.bin test.asm mcopy -i floppy.img test.bin :: /

Şimdi derin bir nefes alın, kendi çalışmanızın eşsiz sonuçlarını düşünmeye hazırlanın ve disket görüntüsünü Qemu veya VirtualBox gibi bir PC öykünücüsü kullanarak yükleyin. Örneğin, bu amaç için aşağıdaki komut kullanılabilir:

Qemu-system-i386 -fda disket.img

Voila: disk görüntüsünün ilk sektörüne entegre ettiğimiz boot.img önyükleyici, bir karşılama mesajı görüntüleyen işletim sistemi çekirdeği mykernel.bin'i yükler. Diskte bulunan iki dosyanın (mykernel.bin ve test.bin) adlarını almak için ls komutunu girin ve ardından yürütmek için son dosyanın adını girin ve ekranda X karakterini görüntüleyin.

Harika, değil mi? Artık işletim sisteminizin kabuğunu değiştirmeye, yeni komut uygulamaları eklemeye ve diske ek program dosyaları eklemeye başlayabilirsiniz. Bu işletim sistemini gerçek bir PC'de çalıştırmak istiyorsanız, bu serinin önceki makalesinden "Önyükleyiciyi Gerçek Donanım Platformunda Çalıştırma" bölümüne başvurmalısınız - tamamen aynı komutlara ihtiyacınız olacak. Önümüzdeki ay, indirilebilir programların sistem işlevlerini kullanmasına izin vererek ve böylece tekrarları azaltmak için kod paylaşımı kavramını uygulayarak işletim sistemimizi daha güçlü hale getireceğiz. İşin çoğu hala önde.

Lib.asm kitaplık rutinleri

Daha önce de belirtildiği gibi, lib.asm, işletim sistemi çekirdekleriniz ve bireysel programlarınız içinde kullanım için geniş bir dizi yararlı rutin sağlar. Bazıları bu serinin makalelerinde henüz değinilmemiş yönergeler ve kavramlar kullanır, diğerleri (disklerle çalışma rutinleri gibi) dosya sistemlerinin yapısının özellikleriyle yakından ilgilidir, ancak kendinizi yetkin görürseniz bu konularda uygulamaları ile kendiniz okuyabilir ve çalışma prensibini anlayabilirsiniz. Olduğu söyleniyor, onları kendi kodunuzdan nasıl arayacağınızı bulmak daha önemlidir:

  • lib_print_string - SI kaydı aracılığıyla boş sonlandırılmış bir dizeye bir işaretçi alır ve bu dizeyi ekrana yazdırır.
  • lib_input_string - SI kaydı aracılığıyla bir arabelleğe bir işaretçi kabul eder ve bu arabelleği, klavyeyi kullanarak kullanıcı tarafından girilen karakterlerle doldurur. Kullanıcı Enter tuşuna bastıktan sonra, arabellek dizisi boş sonlandırılır ve kontrol, çağıran program koduna geri döner.
  • lib_move_cursor - Ekrandaki imleci, koordinatları DH (satır numarası) ve DL (sütun numarası) kayıtlarından geçen konuma taşır.
  • lib_get_cursor_pos - bu altyordam, sırasıyla DH ve DL kayıtlarından geçerli satır ve sütunun numaralarını almak için çağrılmalıdır.
  • lib_string_uppercase - AX kaydını kullanarak boş sonlandırılmış bir dizenin başına bir işaretçi alır ve dizedeki karakterleri büyük harfe dönüştürür.
  • lib_string_length - AX kaydı aracılığıyla boş sonlandırılmış bir dizenin başlangıcına bir işaretçi alır ve uzunluğunu AX kaydı aracılığıyla döndürür.
  • lib_string_compare - SI ve DI kayıtları aracılığıyla iki boş sonlandırılmış dizenin başlangıcına işaretçiler alır ve dizeleri karşılaştırır. Satırlar aynıysa (jc taşıma bayrağına bağlı olarak dal komutunu kullanmak için) taşıma bayrağını ayarlar veya satırlar farklıysa (jnc komutunu kullanmak için) bu bayrağı temizler.
  • lib_get_file_list - SI kaydı aracılığıyla arabelleğin başına bir işaretçi alır ve bu arabelleğe diskten virgülle ayrılmış dosya adları listesi içeren boş sonlandırılmış bir dize yerleştirir.
  • lib_load_file - AX kaydı aracılığıyla dosya adını içeren satırın başına bir işaretçi alır ve dosyanın içeriğini CX kaydından geçen ofsette yükler. BX kaydı kullanılarak belleğe kopyalanan bayt sayısını (yani dosyanın boyutunu) döndürür veya belirtilen ada sahip bir dosya bulunamazsa taşıma bayrağını ayarlar.

Bugün, Saf assembler ile yazılmış bir işletim sistemi olan Merak Kabinimizde ilginç bir örnek var. Sürücüler, bir grafik kabuk, düzinelerce önceden yüklenmiş program ve oyunla birlikte, bir buçuk megabayttan daha az sürer. Olağanüstü hızlı ve ağırlıklı olarak Rus işletim sistemi "Kolibri" ile tanışın.

"Kolibri"nin gelişimi 2009 yılına kadar oldukça hızlı ilerledi. Kuş, minimum ilk Pentium ve sekiz megabayt RAM gerektiren farklı donanımlarda uçmayı öğrendi. Hummingbird için minimum sistem gereksinimleri:

  • CPU: Pentium, AMD 5x86 veya Cyrix 5x86, MMX @ 100 MHz;
  • RAM: 8 MB;
  • ekran kartı: VGA modu desteğiyle VESA uyumlu (640 × 480 × 16).

Modern "Kolibri", 2009'un sonunda yayınlanan en son resmi sürümün düzenli olarak güncellenen "gece yapısı" dır. 20 Ağustos 2017'den itibaren 0.7.7.0+ yapıyı test ettik.

UYARI

Varsayılan ayarlarda KolibriOS'un BIOS üzerinden görünen disklere erişimi yoktur. Bu ayarı değiştirmeden önce dikkatlice düşünün ve bir yedekleme yapın.

Gecelik yapılardaki değişiklikler, küçük olsa da, yıllar içinde yeterince birikmiştir. Güncellenmiş "Kolibri", FAT16–32 / ext2 - ext4 bölümlerine yazabilir ve okuma modunda diğer popüler dosya sistemlerini (NTFS, XFS, ISO-9660) destekler. USB ve ağ kartları için destek ekledi, bir TCP / IP yığını ve ses kodekleri ekledi. Genel olarak, içinde zaten bir şeyler yapabilirsiniz ve bir GUI ile ultra hafif bir işletim sistemine bir kez bakıp başlatma hızından etkilenmezsiniz.



Önceki sürümler gibi, en son "Sinek Kuşu" düz montajcıda (FASM) yazılmıştır ve bir disket - 1.44 MB kaplar. Bu sayede tamamen bir tür özel belleğe yerleştirilebilir. Örneğin, zanaatkarlar KolibriOS'u doğrudan Flash BIOS'a yazdı. İşlem sırasında tamamen bazı işlemcilerin önbelleğinde bulunabilir. Hayal edin: tüm işletim sistemleri, programlar ve sürücülerle birlikte önbelleğe alınır!

BİLGİ

Kolibrios.org web sitesini ziyaret ettiğinizde, tarayıcınız sizi tehlikeye karşı uyarabilir. Bunun nedeni dağıtımdaki assembler programları gibi görünüyor. VirusTotal artık siteyi tamamen güvenli olarak tanımlıyor.

"Kolibri" bir disketten, sabit sürücüden, flash sürücüden, Canlı CD'den veya sanal bir makineden kolayca yüklenebilir. Öykünme için, "diğer" işletim sisteminin türünü belirtmek, ona bir işlemci çekirdeği ve bir miktar RAM tahsis etmek yeterlidir. Diski bağlamak gerekli değildir ve DHCP'li bir yönlendiriciniz varsa, "Kolibri" anında İnternete ve yerel ağa bağlanacaktır. Yüklemenin hemen ardından ilgili bir bildirim göreceksiniz.


Bir sorun, HTTPS protokolünün yerleşik Kolibri tarayıcısı tarafından desteklenmemesidir. Bu nedenle, içindeki siteye bakmak ve Google, Yandex, Wikipedia, "Sberbank" sayfalarını açmak mümkün değildi ... aslında tanıdık bir adres yok. Herkes uzun zaman önce güvenli bir protokole geçti. Karşılaştığım eski tarz, saf HTTP'ye sahip tek site "Rus Hükümetinin portalı"ydı, ancak bir metin tarayıcısında da en iyi görünmüyordu.



Hummingbird'deki görünüm ayarları yıllar içinde gelişti, ancak yine de ideal olmaktan uzak. Desteklenen video modlarının listesi, Latin harfli a tuşuna basılarak "Sinek Kuşu" yükleme ekranında görüntülenir.



Kullanılabilir seçenekler listesi sınırlıdır ve gerekli çözünürlük görünmeyebilir. AMD (ATI) GPU'lu bir ekran kartınız varsa hemen özel ayarlar ekleyebilirsiniz. Bunu yapmak için -m parametresini ATİKMS yükleyicisine iletmeniz gerekir. x x , Örneğin:

/ RD / 1 / SÜRÜCÜLER / ATİKMS -m1280x800x60 -1

Burada / RD / 1 / SÜRÜCÜLER / ATİKMS, önyükleyiciye (RD - RAM Disk) giden yoldur.

Sistem çalışırken vmode komutu ile seçilen video modu görüntülenebilir ve (teorik olarak) manuel olarak geçiş yapılabilir. Kolibri sanal makinede çalışıyorsa, bu pencere boş kalacaktır, ancak temiz bir önyükleme ile Intel video sürücüleri i915'ten Skylake dahil'e eklenebilir.

Şaşırtıcı bir şekilde, bir sürü oyun KolibriOS'a sığar. Bunların arasında mantık ve atari oyunları, etiket, yılan, tanklar (hayır, WoT değil) var - tam bir "Oyun Merkezi"! Doom ve Quake bile Hummingbird'e taşındı.



Bir diğer önemli şey de FB2READ okuyucusuydu. Kiril ile düzgün çalışır ve metin görüntüleme ayarlarına sahiptir.



Tüm kullanıcı dosyalarını bir USB flash sürücüde saklamanızı öneririm, ancak bir USB 2.0 bağlantı noktası üzerinden bağlanmalıdır. NTFS dosya sistemine sahip 16 GB kapasiteli USB 3.0 flash sürücümüz (USB 2.0 portunda) hemen tespit edildi. Dosya yazmanız gerekiyorsa, FAT32 bölümü olan bir USB flash sürücü bağlamalısınız.



Kolibri dağıtımı, üç dosya yöneticisi, görüntüleri ve belgeleri görüntülemek için yardımcı programları, ses ve video oynatıcıları ve diğer özel uygulamaları içerir. Ancak, montaj dili geliştirmeye odaklanır.



Yerleşik metin düzenleyicide ASM sözdizimi vurgulaması vardır ve hatta yazılan programları hemen çalıştırmanıza izin verir.



Geliştirme araçları arasında i386 Windows, Linux ve KolibriOS için Oberon-07/11 derleyicisinin yanı sıra düşük seviyeli emülatörler bulunur: E80 - ZX Spectrum emülatörü, FCE Ultra - en iyi NES emülatörlerinden biri, DOSBox v.0.74 ve diğerleri . Hepsi özel olarak Hummingbird'e taşındı.

KolibriOS'tan birkaç dakika ayrılırsanız ekran koruyucu başlayacaktır. MenuetOS'a bir referans görebileceğiniz ekranda kod satırları çalışacaktır.

Devam sadece katılımcılara açıktır

Seçenek 1. Sitedeki tüm materyalleri okumak için "site" topluluğuna katılın

Belirtilen süre boyunca topluluğa üyelik, TÜM Hacker malzemelerine erişmenizi sağlayacak, kişisel kümülatif indiriminizi artıracak ve profesyonel bir Xakep Puanı kazanmanıza izin verecektir!

montajcı

montajcı(İngilizce'den. birleştirmek - birleştirmek için) - derleme dilinden makine dili komutlarına bir derleyici.
Her işlemci mimarisi ve her işletim sistemi veya işletim sistemi ailesi için bir montajcı vardır. Aynı mimariye sahip makinelerde (veya bir işletim sisteminin ortamında), başka bir hedef mimari veya başka bir işletim sistemi için programları birleştirmeye ve uygun bir biçimde yürütülebilir kod elde etmeye izin veren "çapraz birleştiriciler" de vardır. hedef mimaride veya hedef ortamda yürütme OS.

X86 mimarisi

DOS için birleştiriciler

DOS işletim sistemi için en ünlü derleyiciler Borland Turbo Assembler (TASM) ve Microsoft Macro Assembler'dır (MASM). Basit A86 montajcısı da bir zamanlar popülerdi.
Başlangıçta, yalnızca 16 bit yönergeleri desteklediler (Intel 80386 işlemciden önce). TASM ve MASM'nin sonraki sürümleri, hem 32 bitlik talimatları hem de daha yeni işlemcilerde sunulan tüm talimatları ve mimariye özel talimat setlerini (MMX, SSE, 3DNow! vb. gibi) destekler ...

Microsoft Windows

Microsoft Windows işletim sisteminin ortaya çıkmasıyla birlikte, Windows ortamında çalışacak programlar oluşturmayı mümkün kılan TASM32 adlı TASM uzantısı ortaya çıktı. Tasm'ın bilinen en son sürümü, MMX talimatlarını destekleyen ve şu anda Turbo C ++ Explorer'da bulunan 5.3'tür. Ancak resmi olarak programın gelişimi tamamen durduruldu.
Microsoft, Microsoft Macro Assembler adlı ürününü korur. DDK'lara dahil edilen en son sürümlerle bu güne kadar gelişmeye devam ediyor. Ancak, DOS için programlar oluşturmayı amaçlayan programın sürümü geliştirilmiyor. Ek olarak, Stephen Hutchesson, "MASM32" adlı bir MASM programlama paketi oluşturmuştur.

GNU ve GNU / Linux

GNU işletim sistemi, Intel sözdizimini kullanan diğer çoğu popüler derleyicinin aksine, AT&T sözdizimini kullanan gaz derleyicisini (GNU Assembler) içeren gcc derleyicisini içerir.

Taşınabilir montajcılar

Ayrıca çeşitli işletim sistemleri için versiyonları mevcut olan ve bu sistemler için nesne dosyaları almanızı sağlayan açık kaynak kodlu bir assembler projesi de bulunmaktadır. Bu montajcıya NASM (Netwide Assembler) adı verilir.
YASM, NASM'nin sıfırdan yeniden yazılmış (bazı istisnalar dışında) BSD lisanslı bir sürümüdür.
FASM (Flat Assembler), yeniden lisanslamayı yasaklamak için değiştirilmiş bir BSD lisansı altında (GNU GPL kapsamında olanlar dahil) genç bir montajcıdır. KolibriOS, GNU / Linux, MS-DOS ve Microsoft Windows için sürümleri vardır, Intel sözdizimini kullanır ve AMD64 talimatlarını destekler.

RISC mimarileri


MCS-51
AVR
Şu anda Atmel'den 2 derleyici var (AVRStudio 3 ve AVRStudio4). İkinci versiyon, çok başarılı olmayan ilkini düzeltme girişimidir. Birleştirici ayrıca WinAVR'ye dahil edilmiştir.
KOL
AVR32
MSP430
PowerPC

Montaj ve derleme

Bir derleme dili programını nesne koduna çevirme işlemine genel olarak derleme adı verilir. Derlemeden farklı olarak, derleme az çok nettir ve tersine çevrilebilir. Assembly dilinde her bir anımsatıcı bir makine talimatına karşılık gelirken, yüksek seviyeli programlama dillerinde her ifadenin arkasına çok sayıda farklı talimat gizlenebilir. Prensip olarak, bu bölünme oldukça keyfidir, bu nedenle bazen derleme programlarının çevirisine derleme de denir.

Montaj dili

Montaj dili- insan tarafından okunabilen makine talimatlarını kaydetmek için bir format olan bir tür düşük seviyeli programlama dili. Çoğu zaman, kısacası, doğru olmayan bir montajcı olarak adlandırılır.

Derleme dili talimatları, işlemci talimatlarıyla bire bir karşılık gelir ve aslında, komutların ve argümanlarının uygun bir sembolik gösterim biçimini (anımsatıcı kod) temsil eder. Ayrıca, montaj dili temel program soyutlamaları sağlar: programın parçalarını ve verileri sembolik adlara sahip etiketler aracılığıyla bağlama (birleştirme sırasında, her etiket için bir adres hesaplanır, ardından etiketin her oluşumu bu adresle değiştirilir) ve yönergeler.
Assembler yönergeleri, programa veri bloklarını (açıkça tanımlanmış veya bir dosyadan okunmuş) eklemenize izin verir; belirli bir parçayı belirli sayıda tekrarlayın; bir parçayı koşullu olarak derleyin; bellekteki konumun adresinden farklı olarak parçanın yürütme adresini ayarlayın [belirtin!]; derleme sırasında etiketlerin değerlerini değiştirin; makroları parametrelerle vb. kullanın.
Prensipte her işlemci modelinin kendi talimat seti ve ilgili montaj dili (veya lehçesi) vardır.

Avantajlar ve dezavantajlar

Assembly dilinin erdemleri

Minimum yedek kod miktarı, yani daha az talimat ve bellek erişimi kullanımı, hızı artırmanıza ve programın boyutunu küçültmenize olanak tanır.
İstenen platformun tam uyumluluğunu sağlamak ve yeteneklerini en üst düzeye çıkarmak: bu platformun özel talimatlarını ve teknik özelliklerini kullanmak.
Montaj dilinde programlama yapılırken, özel özellikler kullanılabilir hale gelir: donanıma doğrudan erişim, işlemcinin G / Ç bağlantı noktaları ve özel kayıtlarının yanı sıra kendi kendini değiştiren kod yazma yeteneği (yani, metaprogramlama ve bir ihtiyaç duymadan). yazılım tercümanı).
İşletim sistemlerinde uygulanan en son güvenlik teknolojileri, talimatların aynı anda yürütülmesini ve aynı bellek alanına yazmayı (BSD sistemlerinde W ^ X teknolojisi, Windows'ta DEP) hariç tuttukları için kendi kendini değiştiren kod oluşturmaya izin vermez.

Assembly dilinin dezavantajları

Büyük miktarda kod ve çok sayıda ek küçük görev, kodun okunmasının ve anlaşılmasının çok zor hale gelmesine ve bu nedenle programda hata ayıklamanın ve iyileştirmenin daha zor hale gelmesine ve ayrıca programlama paradigmalarının uygulanmasının zorluğuna yol açar. diğer sözleşmeler. bu da işbirlikçi geliştirmenin karmaşıklığına yol açar.
Daha az kullanılabilir kitaplık, birbirleriyle düşük uyumlulukları.
Diğer platformlara taşınamazlık (ikili uyumlu olanlar hariç).

Başvuru

Doğrudan avantajlardan ve dezavantajlardan izler.
Büyük programları Assembly dilinde yazmak son derece zahmetli olduğu için yüksek seviyeli dillerde yazılırlar. Montaj dilinde, kritik öneme sahip oldukları küçük parçalar veya modüller yazarlar:
hız (sürücüler);
kod boyutu (önyükleme sektörleri, sınırlı kaynaklara sahip mikrodenetleyiciler ve işlemciler için yazılımlar, virüsler, yazılım korumaları);
özel özellikler: doğrudan donanım veya makine kodu, yani işletim sistemi yükleyicileri, sürücüler, virüsler, koruma sistemleri ile çalışır.

Montaj kodunu diğer dillere bağlama

Çoğu zaman derlemede yalnızca program parçaları yazıldığından, diğer dillerdeki kodun geri kalanıyla bağlantı kurmaları gerekir. Bu, 2 ana yolla elde edilir:
Derleme zamanında- Montaj dilinde yazma prosedürleri de dahil olmak üzere özel dil yönergeleri ile programa satır içi montajcı parçalarının eklenmesi. Yöntem, basit veri dönüşümleri için uygundur, ancak yüksek seviyeli diller tarafından desteklenmeyen birçok girdi ve çıktıya sahip alt rutinler de dahil olmak üzere veri ve alt rutinlerle tam teşekküllü montaj kodu onunla yapılamaz.
Yapım aşamasında veya ayrı derleme. Bağlantılı modüllerin etkileşimi için, bağlama işlevlerinin gerekli çağrı kurallarını ve veri türlerini desteklemesi yeterlidir. Bireysel modüller, montajcı da dahil olmak üzere herhangi bir dilde yazılabilir.

Sözdizimi

Montaj dillerinin sözdizimi için genel kabul görmüş bir standart yoktur. Ancak, çoğu montaj dili geliştiricisinin bağlı olduğu standartlar vardır. Bu tür ana standartlar Intel sözdizimi ve AT&T sözdizimidir.

Talimatlar

Talimatları yazmak için genel format her iki standart için de aynıdır:

[etiket:] işlem kodu [işlenenler] [; yorum]

burada işlem kodu, işlemciye verilen talimatın gerçek anımsatıcısıdır. Ön ekler (tekrarlar, adresleme türünü değiştirme vb.) buna eklenebilir.
İşlenenler sabitler, kayıt adları, RAM'deki adresler vb. olabilir. Intel ve AT&T standartları arasındaki farklar, esas olarak işlenenlerin numaralandırma sırası ve farklı adresleme yöntemleri için sözdizimleriyle ilgilidir.
Kullanılan anımsatıcılar genellikle aynı mimari veya mimari ailesindeki tüm işlemciler için aynıdır (yaygın olarak bilinenler arasında Motorola, ARM, x86 işlemcileri ve denetleyicilerinin anımsatıcıları bulunur). İşlemci özelliklerinde açıklanmıştır. Olası istisnalar:
Derleyici platformlar arası AT&T sözdizimini kullanıyorsa (orijinal anımsatıcılar AT&T sözdizimine zorlanır)
Başlangıçta anımsatıcıları kaydetmek için iki standart olsaydı (talimat sistemi başka bir üreticinin işlemcisinden miras alındı).
Örneğin, Zilog Z80 işlemci Intel i8080 komut setini devraldı, onu genişletti ve anımsatıcıları (ve kayıt tanımlarını) kendi yöntemiyle değiştirdi. Örneğin, Intel'in mov'unu ld olarak değiştirdim. Motorola Fireball işlemcileri, Z80 komut setini devraldı ve onu biraz azalttı. Aynı zamanda, Motorola resmi olarak Intel anımsatıcılarına geri döndü. Ve şu anda, Fireball için derleyicilerin yarısı Intel anımsatıcılarıyla, yarısı da Zilog anımsatıcılarıyla çalışıyor.

direktifler

Talimatlara ek olarak, bir program direktifler içerebilir: doğrudan makine talimatlarına çevrilmeyen, ancak derleyicinin çalışmasını kontrol eden talimatlar. Kümeleri ve sözdizimi önemli ölçüde değişir ve donanım platformuna değil, kullanılan derleyiciye bağlıdır (aynı mimari ailesi içindeki dillerin lehçelerine yol açar). Bir "centilmenlik" direktif seti olarak şunlar söylenebilir:
veri tanımı (sabitler ve değişkenler)
programın bellekteki organizasyonunu ve çıktı dosyasının parametrelerini yönetmek
derleyici modunu ayarlama
her türlü soyutlama (yani üst düzey dillerin öğeleri) - prosedürlerin ve işlevlerin tasarımından (prosedürel programlama paradigmasının uygulanmasını basitleştirmek için) koşullu yapılara ve döngülere (yapılandırılmış programlama paradigması için)
makrolar

Örnek program

TASM lehçesinde x86 mimarisi için MS-DOS için örnek Merhaba dünya programı:

.MODEL KÜÇÜK KOD BÖLÜMÜ VARSAYIM CS: KOD, DS: KOD ORG 100h BAŞLANGIÇ: mov ah, 9 mov dx, OFFSET Msg int 21h int 20h Msg DB "Merhaba Dünya", 13,10, "$" KOD BİTİYOR END BAŞLANGIÇ

"Meclis dili" teriminin kökeni ve eleştirisi

Bu tür diller, adını bu dillerden çevirmenin (derleyici) adından almıştır - assembler (İngilizce assembler). İkincisinin adı, ilk bilgisayarlarda daha yüksek seviyeli dillerin olmaması ve assembler kullanarak program oluşturmanın tek alternatifinin doğrudan kodlarda programlama olması gerçeğinden kaynaklanmaktadır.
Rusça'da montaj diline genellikle "birleştirici" (ve bununla ilgili bir şey - "birleştirici") denir, bu kelimenin İngilizce çevirisine göre yanlıştır, ancak Rus dilinin kurallarına uygundur. Bununla birlikte, derleyicinin (programın) kendisine "montaj dili derleyicisi" vb. değil, yalnızca "birleştirici" de denir.
"Montaj dili" teriminin kullanımı, tek bir düşük seviyeli dil veya en azından bu tür diller için bir standart olduğu yanılgısına da yol açabilir. Belirli bir programın yazıldığı dili adlandırırken, hangi mimariye yönelik olduğunu ve dilin hangi lehçesinde yazıldığını belirtmeniz önerilir.