Assembly School: käyttöjärjestelmän kehitys. Hummingbirdin lento. Mihin kokonaan assembly-kielellä kirjoitettu käyttöjärjestelmä pystyy: kokoonpano ja kääntäminen

Päätin äskettäin oppia assemblerin, mutta en ollut kiinnostunut koodirivien tuhlaamisesta. Ajattelin, että opiskellessani assembleriä hallitsisin jonkin alan. Joten valintani putosi käynnistyslataimen kirjoittamiseen. Löydösteni tulos on tässä blogissa.

Haluaisin sanoa heti, että rakastan teoriaa yhdistettynä käytäntöön, joten aloitetaan.

Ensin näytän sinulle, kuinka voit luoda yksinkertaisen MBR jotta voimme nauttia tuloksesta mahdollisimman pian. Kun käytännön esimerkit monimutkaistuvat, annan teoreettista tietoa.

Tehdään ensin käynnistyslatain USB-muistitikulle!

Huomio!!! Ensimmäinen kokoonpanoohjelmamme toimii sekä flash-asemalle että muille laitteille, kuten levykkeelle tai HDD. Myöhemmin, jotta kaikki esimerkit toimisivat oikein, annan useita selvennyksiä koodin toiminnasta eri laitteissa.

kirjoitamme edelleen Fasm, koska sitä pidetään parhaana kääntäjänä lataajien kirjoittamiseen, mikä on MBR. Toinen syy Fasmin valintaan on, että se tekee tiedostojen kääntämisestä erittäin helppoa. Ei ohjeita komentorivi ja niin edelleen. hölynpölyä, joka voi estää sinua kokonaan oppimasta assemblerin oppimista ja saavuttamasta tavoitteitasi. Joten alkuvaiheessa tarvitsemme kaksi ohjelmaa ja joitakin tarpeeton Vähimmäiskokoinen flash-asema. Kaivoin 1 Gt (se formatoituu nopeasti, eikä se ole sääli, jos mitään). Kun käynnistyslataimemme toimii, flash-asema ei enää toimi normaalisti. Windows 7 kieltäytyy alustamasta flash-asemaa. Suosittelen apuohjelman käyttöä flash-aseman palauttamiseksi eloon HP USB-levy Tallennusmuototyökalu ( HPUSBFW.EXE) tai muita apuohjelmia flash-asemien alustamiseen.

Asennamme ne ja heitämme vastaavat pikakuvakkeet työpöydälle tai minne haluat.

Valmistelut on valmis, jatketaan toimintaan

Avaa Fasmw.exe ja kirjoita sinne seuraava. Piirrämme minimikoodin nähdäksemme tuloksen. Myöhemmin analysoimme, mitä täällä on kirjoitettu. Esitän kommenttini lyhyesti.

FASM-koodi: ============= boot.asm ===============

org 7C00h ; Ohjelma-osoitteemme on laskettu ottaen huomioon tämä ohje

käyttö16 ; heksadesimaalikoodi luodaan

cli ;poista keskeytykset osoitteiden vaihtamisesta segmenttirekistereissä

mov ax, 0

mov sp, 7C00h

sti ;ota keskeytykset käyttöön (osoitteiden vaihtamisen jälkeen)

mov ax, 0003h ;asettaa videotilan rivin näyttämiseksi näytöllä

int 10h

mov ax, 1301h ;merkkijonon todellinen tulos on funktio 13h int 10h (lisätietoja myöhemmin)

mov bp, stroka ;tulostusjonon osoite

mov dx, 0000h ;rivi ja sarake, jossa teksti näytetään

mov cx, 15 ;tulostusjonon merkkien määrä

mov bx, 000eh ;00-videon sivunumero (parempi olla koskematta) 0e-merkin attribuutit (väri, tausta)

int 10h

jmp $ ;talla vettä (silmukat ohjelman tässä vaiheessa)

string db "Ok, MBR ladattu!"

kertaa 510 - ($ - $$) db 0 ;täytä edellisen ja seuraavan tavun välinen tila nolilla

db 0x55 ,0xAA ;kaksi viimeistä tavua

Käännä tämä koodi (Ctrl+F9) fasm"e:ssä ja tallenna tuloksena oleva binaaritiedosto boot.bin-tiedostona johonkin sopivaan paikkaan. Ennen kuin kirjoitat binaarimme muistitikulle, vähän teoriaa.

Kun liität flash-aseman tietokoneeseen, BIOS-järjestelmälle ei todellakaan ole selvää, että haluat käynnistää flash-asemalta, joten BIOS-asetuksista on valittava laite, josta haluat käynnistää. käynnistää USB:ltä (sinun on keksittävä, miten tämä tehdään itse, koska BIOS-liittymässä on erilaisia ​​muunnelmia... voit googlettaa sen BIOS-asetukset sinun emolevy. Siellä ei yleensä ole mitään monimutkaista).

Nyt kun BIOS tietää, että haluat käynnistää flash-asemalta, sen on varmistettava, että flash-aseman sektori nolla on käynnistettävä. Tätä varten BIOS skannaa sektorin nollan viimeiset kaksi tavua ja jos ne ovat yhtä suuria kuin 0x55 0xAA, se ladataan vain silloin RAM. Muussa tapauksessa BIOS yksinkertaisesti ohittaa flash-asemasi. Löydettyään nämä kaksi taikatavua, se lataa sektorin nolla RAM-muistiin osoitteessa 0000:7С00h ja unohtaa sitten flash-aseman ja siirtää ohjauksen tähän osoitteeseen. Nyt kaikki tietokoneen valta kuuluu käynnistyslataimellesi ja se voi RAM-muistista toimien ladata lisäkoodia muistitikulta. Nyt näemme, miltä juuri tämä sektori näyttää DMDE-ohjelmassa.

1.Aseta flash-asema tietokoneeseen ja varmista, että se ei sisällä tarvitsemiasi tietoja.

2.Avaa DMDE-ohjelma. Lue kaikki muut vaiheet kuvista:

Kun olet katsonut tämän sarjakuvan, sinulla on taito ladata MBR muistitikulle. Ja tältä näyttää kuormaimemme kauan odotettu tulos:


Muuten, jos puhumme käynnistyslataimen vähimmäiskoodista, se saattaa näyttää tältä:

Organisaatio 7C00h
jmp$
db 508 dup(0)
db 0x55,0xAA

Tällainen käynnistyslatain, saatuaan hallinnan, yksinkertaisesti ripustaa tietokoneen ja suorittaa yhden merkityksettömän jmp $ -komennon silmukassa. Kutsun häntä polkevaksi vedeksi.

Julkaisin YouTubeen videon, joka saattaa auttaa sinua:

Lopuksi muutama lyhyt fakta käynnistyslataimesta:

1. Käynnistyslataimen, joka tunnetaan myös nimellä käynnistyslatain, joka tunnetaan myös nimellä MBR, on 512 tavua. Historiallisesti
että tämän ehdon on täytyttävä tukea vanhempia mediaa ja laitteita.
2. Käynnistyslatain sijaitsee aina flash-aseman, levykkeen, kovalevy, DMDE-ohjelman tai muiden hex-editorien näkökulmasta, joiden avulla voit työskennellä laitteiden kanssa. Ladataksemme binaaritiedoston (meidän boot.bin) johonkin luetelluista laitteista, meidän ei tarvitse ajatella niiden sisäistä fyysistä rakennetta. DMDE-ohjelma yksinkertaisesti osaa lukea näiden laitteiden sektorit ja näyttää ne LBA-tilassa (numeroi ne 0:sta viimeiseen sektoriin). Voit lukea LBA:sta
3. Käynnistyslataimen tulee aina päättyä kahteen tavuun 0x55 0xAA.
4. Bootloader ladataan aina muistiin osoitteessa 0000:7С00h.
5. Käyttöjärjestelmä alkaa käynnistyslataimella.


Alkuperäinen: AsmSchool: Tee käyttöjärjestelmä
Kirjailija: Mike Saunders
Julkaistu: 15. huhtikuuta 2016
Käännös: A. Panin
Käännöspäivä: 16. huhtikuuta 2016

Osa 4: Tämän sarjan aiempia artikkeleita lukemalla saamillasi taidoilla voit aloittaa oman käyttöjärjestelmän kehittämisen!

Mitä varten se on?

  • Ymmärtääksesi kuinka kääntäjät toimivat.
  • Ymmärtääksesi prosessorin ohjeet.
  • Optimoi koodisi suorituskykyä varten.

Useiden kuukausien aikana kävimme läpi vaikean polun, joka alkoi kehityksestä yksinkertaisia ​​ohjelmia asennuskielellä Linuxille ja päättyi sarjan viimeiseen artikkeliin itsenäisen koodin kehittämiseen, joka toimii henkilökohtaisessa tietokoneessa ilman käyttöjärjestelmää. No, nyt yritämme kerätä kaikki tiedot yhteen ja luoda todellisen käyttöjärjestelmän. Kyllä, seuraamme Linus Torvaldsin jalanjälkiä, mutta ensin meidän on vastattava seuraaviin kysymyksiin: "Mikä on käyttöjärjestelmä? Mitkä sen toiminnot meidän on luotava uudelleen?"

Tässä artikkelissa keskitymme vain käyttöjärjestelmän perustoimintoihin: ohjelmien lataamiseen ja suorittamiseen. Monimutkaiset käyttöjärjestelmät suorittavat monia muita toimintoja, kuten virtuaalisen muistin hallinnan ja käsittelyn verkkopaketteja, mutta niiden oikea toteutus vaatii vuosien jatkuvaa työtä, joten tässä artikkelissa tarkastellaan vain kaikissa käyttöjärjestelmissä olevia perustoimintoja. Viime kuussa kehitimme pienen ohjelman, joka sopii levykkeen 512-tavuiseen sektoriin (sen ensimmäinen sektori), ja nyt muokkaamme sitä hieman lisäämään lisätietojen lataamisen levyltä.

Käynnistyslataimen kehitys

Voisimme yrittää pienentää käyttöjärjestelmämme binaarikoodin kokoa mahdollisimman paljon, jotta se mahtuisi levykkeen ensimmäiseen 512-tavuiseen sektoriin, johon BIOS lataa, mutta tässä tapauksessa emme pystyisi. toteuttaa mielenkiintoisia toimintoja. Siksi käytämme näitä 512 tavua yksinkertaisen järjestelmän käynnistyslataimen binäärikoodin sijoittamiseen, joka lataa käyttöjärjestelmän ytimen binaarikoodin RAM-muistiin ja suorittaa sen. (Tämän jälkeen kehitämme itse käyttöjärjestelmäytimen, joka lataa muiden ohjelmien binäärikoodin levyltä ja myös suorittaa sen, mutta puhumme tästä hieman myöhemmin.)

Voit ladata tässä artikkelissa käsiteltyjen esimerkkien lähdekoodin osoitteesta www.linuxvoice.com/code/lv015/asmschool.zip. Ja tämä on järjestelmän käynnistyslataimen koodi tiedostosta nimeltä boot.asm:

BITS 16 jmp lyhyt käynnistys ; Siirry etikettiin, ohita levyn kuvaus nop ; Lisäys ennen levyn kuvausta %include "bpb.asm" aloitus: mov ax, 07C0h ; Latausosoite mov ds, ax ; Datasegmentti mov ax, 9000h ; Pinon valmistelu mov ss, ax mov sp, 0FFFFh ; Pino kasvaa alas! cld ; Suuntalipun asettaminen mov si, kern_filename kutsu load_file jmp 2000h:0000h ; Siirtyminen käyttöjärjestelmän ytimen binaarikoodiin, joka on ladattu tiedostosta kern_filename db "MYKERNELBIN" %include "disk.asm" kertaa 510-($-$$) db 0 ; Binaarikoodin täyttö nollilla 510 tavuun asti dw 0AA55h ; Käynnistyslataimen binääripään merkkipuskuri: ; Levyn sisällön puskurin aloitus

Tässä koodissa ensimmäinen CPU-käsky on jmp-käsky, joka sijaitsee BITS-direktiivin jälkeen, joka kertoo NASM-asentajalle, että käytössä on 16-bittinen tila. Kuten luultavasti muistat sarjan edellisestä artikkelista, BIOS:sta levyltä ladatun 512-tavuisen binäärikoodin suorittaminen alkaa alusta, mutta meidän on hypättävä tunnisteeseen ohittaaksemme erityisen tietojoukon. Ilmeisesti viime kuussa kirjoitimme koodin vain levyn alkuun (dd-apuohjelmalla) ja jätimme loput levytilasta tyhjäksi.

Nyt meidän on käytettävä levykettä sopivalla MS-DOS-tiedostojärjestelmällä (FAT12), ja toimiaksemme oikein tämän tiedostojärjestelmän kanssa meidän on lisättävä joukko erikoistietoja lähellä sektorin alkua. Tätä joukkoa kutsutaan BIOS-parametrilohkoksi (BPB), ja se sisältää tietoja, kuten levyn nimilapun, sektoreiden lukumäärän ja niin edelleen. Sen ei pitäisi kiinnostaa meitä tässä vaiheessa, koska tällaisille aiheille voisi olla omistettu useampi kuin yksi artikkelisarja, minkä vuoksi olemme sijoittaneet kaikki siihen liittyvät ohjeet ja tiedot erilliseen lähdekooditiedostoon nimeltä bpb.asm.

Yllä olevan perusteella tämä koodimme ohje on erittäin tärkeä:

%include "bpb.asm"

Tämä on NASM-direktiivi, joka sallii tietyn lähdetiedoston sisällön sisällyttämisen nykyiseen lähdetiedostoon kokoonpanon aikana. Näin voimme tehdä käynnistyslatauskoodistamme mahdollisimman lyhyen ja ymmärrettävän sijoittamalla kaikki BIOS-parametrilohkon toteutuksen yksityiskohdat erilliseen tiedostoon. BIOS-parametrilohkon on sijaittava kolme tavua sektorin alun jälkeen, ja koska jmp-käsky vie vain kaksi tavua, meidän on käytettävä nop-käskyä (sen nimi tarkoittaa "no operation" - tämä on ohje, joka ei vain tuhlaa CPU-jaksoja) jäljellä olevan tavun täyttämiseksi.

Työskentely pinon kanssa

Seuraavaksi meidän on käytettävä edellisessä artikkelissa käsiteltyjen kaltaisia ​​ohjeita rekistereiden ja pinon valmistukseen sekä cld (lyhenne sanoista "clear direction") -käsky, jonka avulla voimme asettaa suuntalipun tietyille ohjeille, kuten esim. lodsb-käskynä, joka suoritettuna lisää SI-rekisterin arvoa sen sijaan, että se pienentää sitä.

Sen jälkeen laitamme merkkijonon osoitteen SI-rekisteriin ja kutsumme load_file-funktiota. Mutta mieti sitä hetki – emme ole vielä kehittäneet tätä ominaisuutta! Kyllä, tämä on totta, mutta sen toteutus löytyy toisesta sisällyttämästämme lähdekooditiedostosta nimeltä disk.asm.

FAT12-tiedostojärjestelmä, jota käytetään levykkeillä, jotka on alustettu MS-DOSissa, on yksi yksinkertaisimmista saatavilla olevista tiedostojärjestelmät, mutta sen sisällön käsitteleminen vaatii myös huomattavan määrän koodia. load_file-aliohjelma on noin 200 riviä pitkä, eikä sitä näytetä tässä artikkelissa, koska harkitsemme käyttöjärjestelmän kehittämisprosessia, emme tietyn tiedostojärjestelmän ajuria, joten ei ole kovin viisasta tuhlata tilaa tiedostoon. lokisivuja tällä tavalla. Yleensä sisällytimme lähdekooditiedoston disk.asm melkein ennen nykyisen lähdekooditiedoston loppua ja voimme unohtaa sen. (Jos olet edelleen kiinnostunut FAT12-tiedostojärjestelmän rakenteesta, voit lukea erinomaisen yleiskatsauksen osoitteessa http://tinyurl.com/fat12spec ja katsoa sitten lähdekooditiedostoa disk.asm - sen sisältämä koodi on hyvin kommentoitu.)

Kummassakin tapauksessa load_file-rutiini lataa binäärikoodin SI-rekisterissä nimetystä tiedostosta segmenttiin 2000 offsetissa 0, jonka jälkeen siirrytään sen alkuun suoritettavaksi. Ja siinä kaikki - käyttöjärjestelmän ydin on ladattu ja järjestelmän käynnistyslatain on suorittanut tehtävänsä!

Olet ehkä huomannut, että koodimme käyttää MYKERNELBIN-koodia MYKERNEL.BINin sijaan käyttöjärjestelmän ytimen tiedostonimenä, mikä sopii hyvin DOS-levykkeillä käytettävään 8+3-nimeämisjärjestelmään. Itse asiassa FAT12-tiedostojärjestelmä käyttää tiedostonimien sisäistä esitystä, ja säästämme tilaa käyttämällä tiedostonimeä, joka ei taatusti vaadi load_file-rutiiniamme toteuttaakseen mekanismin, jolla etsitään pistemerkki ja muunnetaan tiedoston nimi tiedostojärjestelmän sisäinen esitys.

Disk.asm-lähdekooditiedoston yhdistämisohjeen rivin jälkeen on kaksi riviä, jotka on suunniteltu täyttämään järjestelmän käynnistyslataimen binäärikoodi nolilla 512 tavuun asti ja sisältävät sen binaarikoodin loppumerkin (tästä keskusteltiin edellisessä artikkelissa). Lopuksi koodin lopussa on "puskuri"-tunniste, jota load_file-rutiini käyttää. Pohjimmiltaan load_file-rutiini tarvitsee vapaata tilaa RAM-muistissa tehdäkseen välitöitä etsiessään tiedostoa levyltä, ja meillä on runsaasti vapaata tilaa käynnistyslataimen lataamisen jälkeen, joten asetamme puskurin tähän.

Kokoaksesi järjestelmän käynnistyslataimen käytä seuraavaa komentoa:

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

Nyt meidän on luotava virtuaalinen levykekuva MS-DOS-muodossa ja lisättävä käynnistyslataimen binaarikoodi sen ensimmäiseen 512 tavuun seuraavilla komennoilla:

Mkdosfs -C floppy.img 1440 dd conv=notrunc if=boot.bin of=floppy.img

Tässä vaiheessa järjestelmän käynnistyslataimen kehitysprosessia voidaan pitää valmiina! Meillä on nyt käynnistyslevyke, jonka avulla voimme ladata käyttöjärjestelmän ytimen binaarikoodin tiedostosta nimeltä mykernel.bin ja suorittaa sen. Seuraavaksi meitä odottaa mielenkiintoisempi osa työstä - itse käyttöjärjestelmäytimen kehitys.

Käyttöjärjestelmän ydin

Haluamme käyttöjärjestelmäytimen suorittavan monia tärkeitä tehtäviä: näyttävän tervehdysviestin, hyväksyvän syötteen käyttäjältä, määrittävän, onko syöte tuettu komento, ja suorittavan ohjelmia levyltä, kun käyttäjä määrittää nimensä. Tämä on käyttöjärjestelmän ydinkoodi mykernel.asm-tiedostosta:

Mov ax, 2000h mov ds, axe mov es, ax loop: mov si, kehotekutsu lib_print_string mov si, user_input call lib_input_string cmp tavu , 0 je silmukan cmp sana, "ls" je list_files mov c_x, call si mov_load JC Load_Fail -soitto 32768 JMP Loop Load_Fail: MOV SI, lataus_fail_msg Call lib_print_string JMP Loop List_Files: mov si, tiedosto_lista soita lib_get_file_list Call lib_print_string JMP Loop -kehotukselle 13, 10, "ei", ", 0", 0 ", 0 user_input kertaa 256 db 0 file_list kertaa 1024 db 0 %sisältää "lib.asm"

Ennen kuin katsot koodia, sinun tulee kiinnittää huomiota viimeiselle riville, joka sisältää lähdekooditiedoston lib.asm, joka sijaitsee myös verkkosivustomme asmschool.zip-arkistossa. Tämä on kirjasto hyödyllisiä rutiineja työskennelläksesi näytön, näppäimistön, merkkijonojen ja levyjen kanssa, joita voit myös käyttää - tässä tapauksessa sisällytämme tämän lähdekooditiedoston käyttöjärjestelmän ytimen päälähdekooditiedoston loppuun. jotta jälkimmäinen olisi mahdollisimman kompakti ja kaunis . Katso lib.asm Library Routines -osasta lisäinformaatio kaikista käytettävissä olevista aliohjelmista.

Käyttöjärjestelmän ydinkoodin kolmella ensimmäisellä rivillä täytämme segmenttirekisterit tiedoilla, jotka osoittavat segmenttiin 2000, johon binäärikoodi ladattiin. Tämä on tärkeää takuun kannalta oikea toiminta ohjeet, kuten lodsb, joiden on luettava tiedot nykyisestä segmentistä eikä mistään muusta. Tämän jälkeen emme suorita segmenteille lisätoimenpiteitä; käyttöjärjestelmämme toimii 64 kt RAM-muistilla!

Edelleen koodissa on silmukan alkua vastaava etiketti. Ensinnäkin käytämme yhtä lib.asm-kirjaston rutiineista, nimittäin lib_print_string, tulostamaan tervehdys. Tavut 13 ja 10 ennen tervehdysriviä ovat erotusmerkkejä. uusi rivi, jonka ansiosta tervehdys ei näy heti minkään ohjelman tulostuksen jälkeen, vaan aina uudella rivillä.

Tämän jälkeen käytämme toista rutiinia lib.asm-kirjastosta nimeltä lib_input_string, joka ottaa käyttäjän näppäimistösyötteen ja tallentaa sen SI-rekisterissä osoitettuun puskuriin. Meidän tapauksessamme puskuri ilmoitetaan lähellä käyttöjärjestelmän ydinkoodin loppua seuraavasti:

User_input kertaa 256 db 0

Tämän ilmoituksen avulla voit luoda 256 merkin puskurin, joka on täytetty nolilla - sen pituuden pitäisi riittää käskyjen tallentamiseen yksinkertaiselle käyttöjärjestelmälle, kuten meidän!

Seuraavaksi suoritamme käyttäjän syötteen validoinnin. Jos user_input puskurin ensimmäinen tavu on nolla, käyttäjä painoi yksinkertaisesti Enter-näppäintä antamatta mitään komentoa; Älä unohda, että kaikki merkkijonot päättyvät nollamerkkeihin. Joten tässä tapauksessa meidän pitäisi vain mennä silmukan alkuun ja tulostaa tervehdys uudelleen. Kuitenkin, jos käyttäjä antaa jonkin komennon, meidän on ensin tarkistettava, onko hän antanut ls-komennon. Tähän asti voit tarkkailla vain yksittäisten tavujen vertailuja kokoonpanokieliohjelmissamme, mutta älä unohda, että on myös mahdollista vertailla kaksitavuisia arvoja tai konesanoja. Tässä koodissa vertaamme ensimmäistä konesanaa user_input puskurista ls-riviä vastaavaan konesanaan ja jos ne ovat identtisiä, siirrymme alla olevaan koodilohkoon. Tässä koodilohkossa käytämme toista rutiinia tiedostosta lib.asm hakeaksemme pilkuilla erotetun luettelon levyllä olevista tiedostoista (joka tulee tallentaa file_list-puskuriin), tulostaa luettelon näytölle ja siirtyä takaisin silmukkaan käsitellä käyttäjän syötettä.

Kolmannen osapuolen ohjelmien suorittaminen

Jos käyttäjä ei anna ls-komentoa, oletamme, että hän syötti ohjelman nimen levyltä, joten on järkevää yrittää ladata se. Lib.asm-kirjastomme sisältää hyödyllisen lib_load_file-rutiinin toteutuksen, joka jäsentää FAT12-levyn tiedostojärjestelmätaulukot: se vie osoittimen tiedostonimen rivin alkuun AX-rekisterin kautta sekä offset-arvon latausta varten. binäärikoodi ohjelmatiedostosta CX-rekisterin kautta. Käytämme jo SI-rekisteriä tallentaaksemme osoittimen käyttäjän syötteen sisältävään merkkijonoon, joten kopioimme tämän osoittimen AX-rekisteriin ja asetamme sitten arvon 32768, jota käytetään siirtymänä lataamaan binäärikoodi ohjelmatiedostosta, CX-rekisteriin.

Mutta miksi käytämme tätä arvoa siirtymänä binäärikoodin lataamiseen ohjelmatiedostosta? No, tämä on vain yksi käyttöjärjestelmämme muistikarttavaihtoehdoista. Koska työskentelemme yhdessä 64 kt:n segmentissä ja ytimen binaari on ladattu offsetissa 0, meidän on käytettävä ensimmäiset 32 ​​kt muistia ytimen tiedoille ja loput 32 kt ohjelman tietojen lataamiseen. Siten offset 32768 on segmenttimme keskipiste ja antaa meille mahdollisuuden tarjota riittävästi RAM-muistia sekä käyttöjärjestelmän ytimelle että ladatuille ohjelmille.

Rutiini lib_load_file suorittaa sitten erittäin tärkeän toiminnon: jos se ei löydä levyltä annettua tiedostoa tai jostain syystä ei voi lukea sitä levyltä, se yksinkertaisesti poistuu ja asettaa erityisen siirtolipun. Tämä on CPU-tilalippu, joka asetetaan joidenkin matemaattisten operaatioiden suorittamisen aikana ja jonka ei pitäisi kiinnostaa meitä tällä hetkellä, mutta samalla voimme määrittää tämän lipun olemassaolon tehdäksemme nopeita päätöksiä. Jos lib_load_asm-rutiini asettaa siirtolipun, käytämme jc-komentoa (jump if carry) hyppäämään koodilohkoon, joka tulostaa virheilmoituksen ja palaa käyttäjän syöttösilmukan alkuun.

Samassa tapauksessa, jos siirtolippua ei ole asetettu, voimme päätellä, että lib_load_asm-alirutiini on onnistuneesti ladannut binaarikoodin ohjelmatiedostosta RAM-muistiin osoitteessa 32768. Tässä tapauksessa tarvitsemme vain käynnistää binaarin suoritus. koodi ladattu tähän osoitteeseen, eli aloita käyttäjän määrittämän ohjelman suorittaminen! Ja sen jälkeen, kun tässä ohjelmassa on käytetty ret-käskyä (palatakseen kutsukoodiin), meidän on yksinkertaisesti palattava silmukkaan käyttäjän syötteiden käsittelyä varten. Näin loimme käyttöjärjestelmän: se koostuu yksinkertaisimmista komentojen jäsennys- ja ohjelmien latausmekanismeista, toteutettu noin 40 rivillä kokoonpanokoodia, vaikkakin lib.asm-kirjaston rutiinien avulla.

Kokoa käyttöjärjestelmän ydinkoodi käyttämällä seuraavaa komentoa:

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

Tämän jälkeen meidän on jotenkin lisättävä mykernel.bin-tiedosto levykekuvatiedostoon. Jos olet perehtynyt tempun asentaa levykuvia silmukkalaitteiden avulla, voit käyttää levykuvan sisältöä käyttämällä tiedostoa floppy.img, mutta helpompi tapa on käyttää GNU Mtoolsia (www.gnu.org/software /mtools). Tämä on sarja ohjelmia MS-DOS/FAT12-tiedostojärjestelmiä käyttävien levykkeiden kanssa työskentelyyn, saatavilla pakettivarastoista ohjelmisto kaikki suosittuja Linux-jakelut, joten sinun tarvitsee vain käyttää apt-get, yum, pacman tai mitä tahansa apuohjelmaa, jota käytät ohjelmistopakettien asentamiseen jakeluasi.

Kun olet asentanut sopivan ohjelmistopaketin, sinun on suoritettava seuraava komento lisätäksesi mykernel.bin-tiedoston floppy.img-levykuvatiedostoon:

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

Huomaa komennon lopussa olevat hauskat symbolit: kaksoispiste, kaksoispiste ja kauttaviiva. Nyt olemme melkein valmiita käynnistämään käyttöjärjestelmämme, mutta mitä järkeä on, jos sille ei ole sovelluksia? Korjataan tämä väärinkäsitys kehittämällä erittäin yksinkertainen sovellus. Kyllä, nyt olet kehittämässä sovellusta omalle käyttöjärjestelmällesi - kuvittele kuinka paljon auktoriteettisi nousee nörttien joukossa. Tallenna seuraava koodi tiedostoon, jonka nimi on test.asm:

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

Tämä koodi yksinkertaisesti käyttää BIOS-toimintoa tulostamaan "X":n näytölle ja palauttaa sitten ohjauksen koodille, joka kutsui sitä - meidän tapauksessamme tämä koodi on käyttöjärjestelmän koodi. Organisaatiorivi, joka aloittaa sovelluksen lähdekoodin, ei ole CPU-käsky, vaan NASM-asennusohjekirja, joka kertoo sille, että binäärikoodi ladataan RAM-muistiin offsetissa 32768, ja siksi kaikki offsetit on laskettava uudelleen tämän huomioimiseksi.

Tämä koodi on myös koottava ja tuloksena oleva binääritiedosto on lisättävä levykekuvatiedostoon:

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

Hengitä nyt syvään, valmistaudu pohtimaan oman työsi vertaansa vailla olevia tuloksia ja käynnistä levykekuva PC-emulaattorilla, kuten Qemu tai VirtualBox. Esimerkiksi seuraavaa komentoa voidaan käyttää tähän tarkoitukseen:

Qemu-system-i386 -fda floppy.img

Voila: järjestelmän käynnistyslatain boot.img, jonka integroimme levyvedoksen ensimmäiseen sektoriin, lataa käyttöjärjestelmän ytimen mykernel.bin, joka näyttää tervetuloviestin. Anna ls-komento saadaksesi kahden levyllä olevan tiedoston nimet (mykernel.bin ja test.bin), ja anna sitten viimeisen tiedoston nimi suorittaaksesi sen ja näyttääksesi X:n.

Se on siistiä, eikö? Nyt voit aloittaa viimeistelyn komentokuori käyttöjärjestelmääsi, lisää uusien komentojen toteutuksia ja lisää myös muita ohjelmatiedostoja levylle. Jos haluat käyttää tätä käyttöjärjestelmää todellisessa tietokoneessa, sinun tulee katsoa sarjan edellisen artikkelin kohtaa "Käynnistyslataimen suorittaminen todellisella laitteistoalustalla" - tarvitset täsmälleen samat komennot. Ensi kuussa teemme käyttöjärjestelmästämme tehokkaamman sallimalla ladattavien ohjelmien käyttää järjestelmätoimintoja ja ottamalla käyttöön koodinjakokonseptin koodin päällekkäisyyden vähentämiseksi. Suuri osa työstä on vielä edessä.

lib.asm-kirjaston rutiinit

Kuten aiemmin mainittiin, lib.asm-kirjasto tarjoaa suuren joukon hyödyllisiä rutiineja käytettäväksi ytimissäsi käyttöjärjestelmät ja yksittäisiä ohjelmia. Jotkut heistä käyttävät ohjeita ja käsitteitä, joita ei ole vielä käsitelty tämän sarjan artikkeleissa, toiset (kuten levyrutiinit) liittyvät läheisesti tiedostojärjestelmien suunnitteluun, mutta jos koet olevasi pätevä näissä asioissa, voit lukea ne itse niiden toteutusten kanssa ja ymmärrät toimintaperiaatteen. On kuitenkin tärkeämpää selvittää, kuinka kutsua niitä omasta koodistasi:

  • lib_print_string - hyväksyy osoittimen nollapäätteiseen merkkijonoon SI-rekisterin kautta ja tulostaa merkkijonon näytölle.
  • lib_input_string - hyväksyy osoittimen puskuriin SI-rekisterin kautta ja täyttää tämän puskurin käyttäjän näppäimistöllä syöttämillä merkeillä. Kun käyttäjä on painanut Enter-näppäintä, puskurin rivi on tyhjä ja ohjaus palaa kutsuvaan ohjelmakoodiin.
  • lib_move_cursor - siirtää kohdistimen näytöllä kohtaan, jonka koordinaatit välitetään DH (rivinumero) ja DL (sarakenumero) -rekisterien kautta.
  • lib_get_cursor_pos - tämä aliohjelma tulee kutsua nykyisten rivi- ja sarakenumeroiden saamiseksi käyttämällä DH- ja DL-rekistereitä.
  • lib_string_uppercase - vie osoittimen tyhjäpääteisen merkkijonon alkuun käyttämällä AX-rekisteriä ja muuntaa merkkijonon merkit isoiksi kirjaimille.
  • lib_string_length - vie osoittimen nollapäätteisen merkkijonon alkuun AX-rekisterin kautta ja palauttaa sen pituuden AX-rekisterin kautta.
  • lib_string_compare - hyväksyy osoittimet kahden nollapäätteisen merkkijonon alkuun käyttämällä SI- ja DI-rekistereitä ja vertaa näitä merkkijonoja. Asettaa siirtolipun, jos rivit ovat identtisiä (käytä hyppykäskyä jc-siirtolipusta riippuen) tai tyhjentää tämän lipun, jos rivit ovat erilaisia ​​(käytä jnc-käskyä).
  • lib_get_file_list - Vie osoittimen puskurin alkuun SI-rekisterin kautta ja asettaa puskuriin nollapäätteisen merkkijonon, joka sisältää pilkuilla erotetun luettelon tiedostojen nimistä levyltä.
  • lib_load_file - vie osoittimen tiedostonimen sisältävän rivin alkuun AX-rekisterin avulla ja lataa tiedoston sisällön CX-rekisterin läpi kulkevan offsetin kohdalla. Palauttaa muistiin kopioitujen tavujen määrän (eli tiedoston koon) BX-rekisterin avulla tai asettaa siirtolipun, jos tietynnimistä tiedostoa ei löydy.

Sanon heti, älä sulje artikkelia ajatuksella "Hitto, toinen Popov". Hänellä on vain hiottu Ubuntu, kun taas minulla on kaikki tyhjästä, mukaan lukien ydin ja sovellukset. Jatkoa siis leikkauksen alle.

Käyttöjärjestelmäryhmä: Tässä.
Ensin annan sinulle yhden kuvakaappauksen.

Niitä ei ole enää, ja nyt puhutaan tarkemmin siitä, miksi kirjoitan sen.

Oli lämmin huhtikuun ilta, torstai. Lapsuudesta lähtien haaveilin käyttöjärjestelmän kirjoittamisesta, kun yhtäkkiä ajattelin: "Nyt tiedän edut ja asm, miksi en toteuttaisi unelmaani?" Googlettelin tätä aihetta käsitteleviä sivustoja ja löysin Habrin artikkelin: "Kuinka aloittaa käyttöjärjestelmän kirjoittaminen ja lopettaa se." Kiitos sen kirjoittajalle alla olevasta linkistä OSDev Wikiin. Menin sinne ja aloin työskennellä. Kaikki tiedot vähimmäiskäyttöjärjestelmästä oli yhdessä artikkelissa. Aloin rakentaa cross-gcc:tä ja binutileja, ja sitten kirjoitin kaiken uudelleen sieltä. Sinun olisi pitänyt nähdä iloni, kun näin tekstin "Hei, kernel World!" Hyppäsin heti tuoliltani ja tajusin, että en antaisi periksi. Kirjoitin "konsoli" (lainausmerkeissä; minulla ei ollut pääsyä näppäimistöön), mutta päätin sitten kirjoittaa ikkunajärjestelmän. Lopulta se toimi, mutta minulla ei ollut pääsyä näppäimistöön. Ja sitten päätin keksiä nimen, joka perustuu X Window Systemiin. Googlasin Y Window Systemiä - se on olemassa. Tämän seurauksena annoin nimeksi Z Window System 0.1, joka sisältyy OS365 pre-alpha 0.1:een. Ja kyllä, kukaan ei nähnyt häntä paitsi minä. Sitten keksin, kuinka näppäimistön tuki toteutetaan. Kuvakaappaus aivan ensimmäisestä versiosta, kun ei vielä ollut mitään, ei edes ikkunajärjestelmää:

Tekstikohdistin ei edes liikkunut, kuten näet. Sitten kirjoitin pari yksinkertaisia ​​sovelluksia perustuu Z. Ja tässä on julkaisu 1.0.0 alpha. Siellä oli paljon asioita, jopa järjestelmävalikoita. A Tiedostonhallinta ja laskin ei vain toiminut.

Minua terrorisoi suoraan ystävä, joka välittää vain kauneudesta (Mitrofan, anteeksi). Hän sanoi: "Pese VBE-tila 1024*768*32, pese se, pese se! No, juodaan se!" No, olin jo kyllästynyt kuuntelemaan häntä ja silti leikkasin hänet alas. Tietoja toteutuksesta alla.

Tein kaiken käynnistyslataimellani, eli GRUB:lla, jonka avulla voit asettaa graafisen tilan ilman komplikaatioita lisäämällä Multiboot-otsikkoon muutama taikasivi.

Aseta ALIGN, 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
Ja sitten Multiboot-tietorakenteesta otan kehyspuskurin osoitteen ja näytön resoluution ja kirjoitan sinne pikseleitä. VESA teki kaiken erittäin hämmentävästi - RGB-värit on syötettävä käänteisessä järjestyksessä (ei R G B, vaan B G R). En useaan päivään ymmärtänyt, miksi pikseleitä ei näkynyt!? Lopulta tajusin, että unohdin muuttaa 16 värivakion arvot 0...15 RGB-vastineiksi. Tämän seurauksena vapautin sen ja leikkasin samalla gradienttitaustaa. Sitten tein konsolin, 2 sovellusta ja julkaisin 1.2. Voi kyllä, melkein unohdin - voit ladata käyttöjärjestelmän osoitteessa

Kokoonpanija

Kokoonpanija(englannin kielestä assemble - assemble) - kääntäjä assembly-kielestä konekielisiksi komentoiksi.
Jokaiselle prosessoriarkkitehtuurille ja jokaiselle käyttöjärjestelmälle tai käyttöjärjestelmäperheelle on oma kokoaja. On olemassa myös niin sanottuja "ristikokoajia", joiden avulla voit koota ohjelmia toista kohdearkkitehtuuria tai toista käyttöjärjestelmää varten koneissa, joissa on yksi arkkitehtuuri (tai yhden käyttöjärjestelmän ympäristössä) ja saada suoritettavaa koodia sellaisessa muodossa, joka sopii suoritettavaksi kohdearkkitehtuurissa tai kohdeympäristön käyttöjärjestelmässä.

x86 arkkitehtuuri

Kokoonpanijat DOS:lle

Tunnetuimmat DOS-käyttöjärjestelmän kokoajat olivat Borland Turbo Assembler (TASM) ja Microsoft Macro Assembler (MASM). Yksinkertainen kokoaja A86 oli myös suosittu aikoinaan.
Aluksi ne tukivat vain 16-bittisiä ohjeita (Intel 80386 -prosessorin tuloon asti). Myöhemmät TASM- ja MASM-versiot tukevat sekä 32-bittisiä käskyjä että kaikkia nykyaikaisemmissa prosessoreissa käyttöön otettuja käskyjä sekä arkkitehtuurikohtaisia ​​käskyjärjestelmiä (kuten esim. MMX, SSE, 3DNow! jne.).

Microsoft Windows

Microsoft Windows -käyttöjärjestelmän myötä ilmestyi TASM-laajennus nimeltä TASM32, joka mahdollisti Windows-ympäristössä toimivien ohjelmien luomisen. Tasmin uusin tunnettu versio on 5.3, joka tukee MMX-ohjeita ja sisältyy tällä hetkellä Turbo C++ Exploreriin. Mutta virallisesti ohjelman kehitys on pysähtynyt kokonaan.
Microsoft ylläpitää tuotetta nimeltä Microsoft Macro Assembler. Sen kehitystä jatketaan tähän päivään asti, ja uusimmat versiot sisältyvät DDK:ihin. Mutta ohjelman versiota, jonka tarkoituksena on luoda DOS-ohjelmia, ei kehitetä. Lisäksi Stephen Hutchesson loi MASM-ohjelmointipaketin nimeltä "MASM32".

GNU ja GNU/Linux

GNU-käyttöjärjestelmä sisältää gcc-kääntäjän, joka sisältää kaasukokoonpanon (GNU Assembler), joka käyttää AT&T-syntaksia, toisin kuin useimmat muut suositut kokoajat, jotka käyttävät Intel-syntaksia.

Kannettavat kokoajat

Käytössä on myös avoimen lähdekoodin assembler-projekti, josta on saatavana versioita eri käyttöjärjestelmille ja jonka avulla voit hankkia objektitiedostoja näihin järjestelmiin. Tämän kokoajan nimi on NASM (Netwide Assembler).
YASM on NASM:n uudelleenkirjoitettu versio BSD-lisenssillä (joitakin poikkeuksia lukuun ottamatta).
FASM (Flat Assembler) on nuori kokoaja BSD-lisenssillä, joka on muutettu estämään uudelleenlisensointi (mukaan lukien GNU GPL). On olemassa versioita KolibriOS:lle, GNU/Linuxille, MS-DOS:lle ja Microsoft Windowsille, ne käyttävät Intelin syntaksia ja tukevat AMD64-ohjeita.

RISC-arkkitehtuurit


MCS-51
AVR
Tällä hetkellä Atmelin tuottamia kääntäjiä on kaksi (AVRStudio 3 ja AVRStudio4). Toinen versio on yritys korjata ei kovin onnistunut ensimmäinen. Kokoonpanija sisältyy myös WinAVR:ään.
ARM
AVR32
MSP430
PowerPC

Kokoaminen ja kokoaminen

Assembly-ohjelman kääntämistä objektikoodiksi kutsutaan yleensä kokoonpanoksi. Toisin kuin kääntäminen, kokoonpano on enemmän tai vähemmän yksiselitteinen ja palautuva prosessi. Assembly-kielessä jokainen muistomerkki vastaa yhtä konekäskyä, kun taas korkean tason ohjelmointikielissä jokainen lauseke voi kätkeä suuren määrän erilaisia ​​käskyjä. Periaatteessa tämä jako on melko mielivaltainen, joten joskus kokoonpanoohjelmien kääntämistä kutsutaan myös kääntämiseksi.

Kokoonpanokieli

Kokoonpanokieli- eräänlainen matalan tason ohjelmointikieli, joka on koneen komentojen tallennusmuoto, joka on kätevä ihmisen havaitsemiseksi. Usein lyhyyden vuoksi sitä kutsutaan yksinkertaisesti kokoonpanoksi, mikä ei ole totta.

Assembly-kielen komennot vastaavat prosessorin komentoja ja edustavat itse asiassa kätevää symbolista tallennusmuotoa (muistokoodi) komentojen ja niiden argumenttien tallentamiseen. Assembly-kieli tarjoaa myös ohjelmiston perusabstraktioita: ohjelman osien ja tietojen linkittämistä symbolisten nimien tarrojen (kokoonpanon aikana jokaiselle tarralle lasketaan osoite, jonka jälkeen jokainen tarran esiintyminen korvataan tällä osoitteella) ja ohjeiden kautta.
Kokoonpanokäskyjen avulla voit sisällyttää ohjelmaan tietolohkoja (kuvattuja eksplisiittisesti tai luettuina tiedostosta); toista tietty fragmentti tietyn määrän kertoja; kokoa fragmentti ehdon mukaan; aseta fragmentin suoritusosoite eri kuin muistipaikan osoite[määritä!]; muuta etikettiarvoja kokoamisen aikana; käytä makromäärityksiä parametrien kanssa jne.
Jokaisella prosessorimallilla on periaatteessa omat käskyt ja vastaava kokoonpanokieli (tai murre).

Hyödyt ja haitat

Assembly-kielen edut

Minimaalinen redundantti koodi, toisin sanoen vähemmän käskyjä ja muistin käyttöjä, mahdollistaa suuremman nopeuden ja pienentää ohjelmakokoa.
Halutun alustan täyden yhteensopivuuden ja mahdollisuuksien maksimaalisen käytön varmistaminen: tämän alustan erityisohjeiden ja teknisten ominaisuuksien käyttö.
Assembly-kielellä ohjelmoitaessa saataville tulee erikoisominaisuuksia: suora pääsy laitteistoon, tulo/lähtöportteihin ja erityisiin prosessorirekistereihin sekä mahdollisuus kirjoittaa itsemuovautuvaa koodia (eli metaohjelmointia ilman ohjelmistotulkkia) .
Uusimmat käyttöjärjestelmiin tuodut suojaustekniikat eivät salli itsemuovautuvan koodin luomista, koska ne sulkevat pois mahdollisuuden suorittaa käskyjä ja kirjoittaa samalle muistialueelle samanaikaisesti (W^X-tekniikka BSD-järjestelmissä, DEP Windowsissa).

Assembly-kielen haitat

Suuret koodimäärät ja suuri määrä pieniä lisätehtäviä, mikä johtaa siihen, että koodista tulee erittäin vaikea lukea ja ymmärtää, ja siksi ohjelman virheenkorjaus ja muokkaaminen vaikeutuu, samoin kuin ohjelmointiparadigmien toteuttamisen vaikeus. ja muut sopimukset. mikä johtaa yhteisen kehityksen monimutkaisuuteen.
Vähemmän käytettävissä olevia kirjastoja, niiden huono yhteensopivuus keskenään.
Ei siirretä muille alustoille (paitsi binaariyhteensopiville).

Sovellus

Seuraa suoraan eduista ja haitoista.
Koska suuria kokoonpanokielisiä ohjelmia on erittäin hankala kirjoittaa, ne kirjoitetaan korkean tason kielillä. Assemblerissa kirjoitetaan pieniä fragmentteja tai moduuleja, joille seuraavat ovat tärkeitä:
suorituskyky (ohjaimet);
koodin koko (käynnistyssektorit, ohjelmistot mikro-ohjaimille ja prosessoreille, joilla on rajalliset resurssit, virukset, ohjelmistosuojaus);
erikoisominaisuudet: työskentely suoraan laitteiston tai konekoodin, eli käyttöjärjestelmän latauslaitteiden, ohjainten, virusten, turvajärjestelmien kanssa.

Assembly-koodin linkittäminen muihin kieliin

Koska vain ohjelman fragmentit kirjoitetaan useimmiten kokoonpanokielellä, ne on linkitettävä muihin osiin muilla kielillä. Tämä saavutetaan kahdella päätavalla:
Kokoonpanovaiheessa— Assembler-fragmenttien (inline assembler) lisääminen ohjelmaan käyttämällä erityisiä kieliohjeita, mukaan lukien kirjoitusmenettelyt assembly-kielellä. Menetelmä on kätevä yksinkertaisiin datamuunnoksiin, mutta sen avulla ei voida luoda täysimittaista kokoonpanokoodia, jossa on tietoja ja alirutiineja, mukaan lukien aliohjelmat, joissa on monia tuloja ja lähtöjä, joita korkean tason kielet eivät tue.
Asetteluvaiheessa tai erillinen kokoelma. Koottujen moduulien vuorovaikutukseen riittää, että kytkentätoiminnot tukevat vaadittuja kutsukäytäntöjä ja tietotyyppejä. Yksittäiset moduulit voidaan kirjoittaa millä tahansa kielellä, myös kokoonpanokielellä.

Syntaksi

Assembly-kielten syntaksille ei ole yleisesti hyväksyttyä standardia. On kuitenkin olemassa standardeja, joita useimmat assembly-kielten kehittäjät noudattavat. Tärkeimmät tällaiset standardit ovat Intel-syntaksi ja AT&T-syntaksi.

Ohjeet

Tallennusohjeiden yleinen muoto on sama molemmissa standardeissa:

[tunniste:] opcode [operandit] [;kommentti]

missä opcode on suorittimelle osoitettujen käskyjen suora muistomerkki. Siihen voidaan lisätä etuliitteitä (toistot, muutokset osoitetyypissä jne.).
Operandit voivat olla vakioita, rekisterinimiä, osoitteita RAM-muistissa jne. Erot Intel- ja AT&T-standardien välillä liittyvät pääasiassa operandien listausjärjestykseen ja niiden syntaksiin eri osoitusmenetelmille.
Käytettävät muistomerkit ovat yleensä samat kaikille saman arkkitehtuurin tai arkkitehtuuriperheen prosessoreille (laajasti tunnettujen joukossa ovat Motorola-, ARM-, x86-prosessorien ja ohjaimien muistomerkit). Ne on kuvattu prosessorin teknisissä tiedoissa. Mahdollisia poikkeuksia:
Jos kokoaja käyttää monialustaista AT&T-syntaksia (alkuperäiset muistomerkit muunnetaan AT&T-syntaksiksi)
Jos alun perin muiston tallentamiseen oli kaksi standardia (komentojärjestelmä perittiin toisen valmistajan prosessorilta).
Esimerkiksi Zilog Z80 -prosessori peri Intel i8080 -käskyjärjestelmän, laajensi sitä ja muutti muistiinpanoja (ja rekisterimerkintöjä) omalla tavallaan. Vaihdoin esimerkiksi Intelin movin ld:ksi. Motorola Fireball -prosessorit perivät Z80-ohjejärjestelmän, mikä pienensi sitä jonkin verran. Samaan aikaan Motorola on virallisesti palannut Intelin muistiin. Ja tällä hetkellä puolet Fireballin kokoajista työskentelee Intel-muistotekniikalla ja puolet Zilog-muistotekniikalla.

direktiivit

Ohjeiden lisäksi ohjelma voi sisältää direktiivejä: komentoja, joita ei käännetä suoraan konekäskyiksi, mutta jotka ohjaavat kääntäjän toimintaa. Niiden joukko ja syntaksi vaihtelevat merkittävästi eivätkä riipu laitteistoalustasta, vaan käytetystä kääntäjästä (saman arkkitehtuuriperheen kielten murteita luomalla). "Herrasmiesjoukona" direktiivejä voimme korostaa:
datan määritelmä (vakiot ja muuttujat)
ohjelman organisoinnin hallinta muistissa ja tulostiedostoparametreissa
kääntäjän toimintatilan asettaminen
kaikenlaisia ​​abstraktioita (eli korkean tason kielten elementtejä) - menettelyjen ja toimintojen suunnittelusta (proseduuriohjelmointiparadigman toteuttamisen yksinkertaistamiseksi) ehdollisiin konstrukteihin ja silmukoihin (strukturoidun ohjelmoinnin paradigma)
makroja

Esimerkkiohjelma

Esimerkki Hello world -ohjelmasta MS-DOS:lle x86-arkkitehtuurille TASM-murteella:

.MODEL TINY CODE SEGMENT OLETA CS:CODE, DS:CODE ORG 100h ALOITUS: mov ah,9 mov dx,OFFSET Viesti int 21h int 20h Viesti DB "Hello World",13,10,"$" KOODI PÄÄTTYY LOPPU ALOITUS

Termin "assembly language" alkuperä ja kritiikki

Tämäntyyppinen kieli saa nimensä näiden kielien kääntäjän (kääntäjän) nimestä - assembler (englanninkielinen assembler). Jälkimmäisen nimi johtuu siitä, että ensimmäisissä tietokoneissa ei ollut korkeamman tason kieliä, ja ainoa vaihtoehto ohjelmien luomiselle assemblerilla oli ohjelmointi suoraan koodeihin.
Venäjän kokoonpanokieltä kutsutaan usein "assembleriksi" (ja jotain siihen liittyvää - "assembler"), joka sanan englanninkielisen käännöksen mukaan on virheellinen, mutta sopii venäjän kielen sääntöihin. Itse assembleria (ohjelmaa) kutsutaan kuitenkin myös yksinkertaisesti "assembleriksi" eikä "assembly language -kääntäjäksi" jne.
Termin "assembly language" käyttö voi myös johtaa siihen väärinkäsitykseen, että on olemassa yksi matalan tason kieli tai ainakin standardi sellaisille kielille. Nimeäessään kieltä, jolla tietty ohjelma kirjoitetaan, on suositeltavaa määrittää, mihin arkkitehtuuriin se on tarkoitettu ja millä kielen murteella se on kirjoitettu.

Tänään uteliaisuuksien kabinetissamme on utelias esimerkki - käyttöjärjestelmä, joka on kirjoitettu puhtaalla assemblerilla. Yhdessä ohjainten, graafisen kuoren, kymmenien esiasennettujen ohjelmien ja pelien kanssa se vie alle puolitoista megatavua. Tapaa poikkeuksellisen nopea ja pääosin venäläinen käyttöjärjestelmä "Hummingbird".

"Hummingbirdin" kehitys eteni melko nopeasti vuoteen 2009 asti. Lintu oppi lentämään eri laitteilla, vaatien mahdollisimman vähän ensimmäistä Pentiumia ja kahdeksan megatavua RAM-muistia. Hummingbirdin järjestelmän vähimmäisvaatimukset ovat:

  • CPU: Pentium, AMD 5x86 tai Cyrix 5x86 ilman MMX:ää taajuudella 100 MHz;
  • RAM: 8 MB;
  • näytönohjain: VESA-yhteensopiva ja tukee VGA-tilaa (640 × 480 × 16).

Moderni "Hummingbird" on säännöllisesti päivitettävä "iltaisin versio" uusimmasta virallisesta versiosta, joka julkaistiin vuoden 2009 lopussa. Testasimme 20. elokuuta 2017 päivätyn version 0.7.7.0+.

VAROITUS

Oletusasetuksissa KolibriOS:llä ei ole pääsyä levyille, jotka näkyvät BIOSin kautta. Harkitse huolellisesti ja tee varmuuskopio ennen tämän asetuksen muuttamista.

Muutoksia öisissä rakennuksissa, vaikkakin pieniä, on vuosien varrella kertynyt varsin paljon. Päivitetty "Hummingbird" voi kirjoittaa FAT16-32 / ext2 - ext4-osioihin ja tukee muita suosittuja tiedostojärjestelmiä (NTFS, XFS, ISO-9660) lukutilassa. Se lisäsi tuen USB- ja verkkokorteille sekä lisäsi TCP/IP-pinon ja äänikoodekit. Yleisesti ottaen voit jo tehdä jotain siinä, eikä vain katsoa kerran erittäin kevyttä käyttöjärjestelmää graafisella käyttöliittymällä ja olla vaikuttunut käynnistysnopeudesta.



Kuten aiemmat versiot, uusin ”Hummingbird” on kirjoitettu flat assemblerilla (FASM) ja vie yhden levykkeen - 1,44 MB. Tämän ansiosta se voidaan sijoittaa kokonaan johonkin erikoismuistiin. Esimerkiksi käsityöläiset kirjoittivat KolibriOS:n suoraan Flash BIOSiin. Käytön aikana se voi sijaita kokonaan joidenkin prosessorien välimuistissa. Kuvittele vain: koko käyttöjärjestelmä, ohjelmat ja ajurit, on välimuistissa!

TIEDOT

Kun vierailet sivustolla kolibrios.org, selain voi varoittaa sinua vaarasta. Syynä on ilmeisesti jakelun assembler-ohjelmat. VirusTotal määrittelee sivuston nyt täysin turvalliseksi.

"Hummingbird" voidaan ladata helposti levykkeeltä, kiintolevyltä, flash-asemalta, Live CD:ltä tai virtuaalikoneelta. Emuloidaksesi määritä vain käyttöjärjestelmän tyyppi "other", varaa yksi prosessoriydin ja vähän RAM-muistia. Asemaa ei tarvitse kytkeä, ja jos sinulla on reititin, jossa on DHCP, "Hummingbird" muodostaa välittömästi yhteyden Internetiin ja paikalliseen verkkoon. Heti latauksen jälkeen näet vastaavan ilmoituksen.


Yksi ongelma on, että Kolibriin sisäänrakennettu selain ei tue HTTPS-protokollaa. Siksi ei ollut mahdollista katsoa siinä olevaa sivustoa, aivan kuten Googlen, Yandexin, Wikipedian, Sberbankin sivujen avaaminen... itse asiassa ei tavallista osoitetta. Kaikki ovat pitkään siirtyneet suojattuun protokollaan. Ainoa vanhan koulun puhtaalla HTTP:llä varustettu sivusto, johon törmäsin, oli "Venäjän hallituksen portaali", mutta se ei myöskään näyttänyt parhaalta tekstiselaimessa.



Hummingbirdin ulkonäköasetukset ovat parantuneet vuosien varrella, mutta ne ovat edelleen kaukana ihanteellisista. Luettelo tuetuista videotiloista tulee näkyviin Hummingbirdin latausnäytölle, kun painat a-näppäintä.



Käytettävissä olevien vaihtoehtojen luettelo on pieni, eikä vaadittua resoluutiota välttämättä löydy. Jos sinulla on näytönohjain, jossa on AMD (ATI) GPU, voit heti lisätä mukautettuja asetuksia. Tätä varten sinun on välitettävä -m-parametri ATIKMS-lataimelle x x , Esimerkiksi:

/RD/1/DRIVERS/ATIKMS -m1280x800x60 -1

Tässä /RD/1/DRIVERS/ATIKMS on polku käynnistyslataimeen (RD - RAM-levy).

Kun järjestelmä on käynnissä, valittua videotilaa voidaan katsella vmode-komennolla ja (teoreettisesti) vaihtaa manuaalisesti. Jos "Hummingbird" on käynnissä virtuaalikoneessa, tämä ikkuna pysyy tyhjänä, mutta puhtaalla käynnistyksellä Intel-videoohjaimet voidaan lisätä i915: stä Skylakeen.

Yllättäen KolibriOS mahtuu paljon pelejä. Niiden joukossa on logiikka- ja arcade-pelejä, tagi, käärme, tankit (ei, ei WoT) - koko "Game Center"! Jopa Doom ja Quake siirrettiin Kolibrille.



Toinen tärkeä asia oli FB2READ-lukija. Se toimii oikein kyrillisillä kirjaimilla ja siinä on tekstinäyttöasetukset.



Suosittelen kaikkien käyttäjätiedostojen tallentamista flash-asemaan, mutta se on liitettävä USB 2.0 -portin kautta. USB 3.0 -flash-asemamme (USB 2.0 -portissa), jonka kapasiteetti on 16 Gt NTFS-tiedostojärjestelmällä, tunnistettiin välittömästi. Jos sinun on kirjoitettava tiedostoja, sinun tulee liittää flash-asema, jossa on FAT32-osio.



Kolibri-jakelusarja sisältää kolme tiedostonhallintaa, apuohjelmat kuvien ja asiakirjojen katseluun, ääni- ja videosoittimet sekä muut käyttäjäsovellukset. Sen pääpaino on kuitenkin assembly-kielen kehittämisessä.



Sisäänrakennetussa tekstieditorissa on ASM-syntaksin korostus, ja voit jopa käynnistää kirjoitetut ohjelmat välittömästi.



Kehitystyökalujen joukossa on Oberon-07/11-kääntäjä i386 Windowsille, Linuxille ja KolibriOS:lle sekä matalan tason emulaattorit: E80 - ZX Spectrum -emulaattori, FCE Ultra - yksi parhaista NES-emulaattoreista, DOSBox v.0.74 ja muut. Ne kaikki siirrettiin erityisesti Kolibrille.

Jos jätät KolibriOS:n muutamaksi minuutiksi, näytönsäästäjä käynnistyy. Näytölle ilmestyvät koodirivit, joissa näet viittauksen MenuetOS:ään.

Jatkoa on vain jäsenille

Vaihtoehto 1. Liity "sivusto"-yhteisöön lukeaksesi kaiken sivuston materiaalin

Yhteisön jäsenyys tietyn ajanjakson sisällä antaa sinulle pääsyn KAIKKIIN Hacker-materiaaliin, lisää henkilökohtaista kumulatiivista alennustasi ja voit kerätä ammattimaisen Xakep Score -luokituksen!


Yläosa