Da bi razumeli, kako so računalniki organizirani in kako delujejo na zelo nizki ravni, je treba razumeti, kako deluje program v asemblerju. Na najbolj poenostavljeni ravni imajo računalniki tri glavne dele:
- glavni pomnilnik ali RAM, ki hrani podatke in navodila,
- procesor, ki obdeluje podatke z izvajanjem navodil, in
- vhod in izhod (včasih skrajšano I/O), ki računalniku omogočata komunikacijo z zunanjim svetom in shranjevanje podatkov zunaj glavnega pomnilnika, da jih lahko pozneje dobi nazaj.
Glavni pomnilnik
V večini računalnikov je pomnilnik razdeljen na bajte. Vsak bajt vsebuje 8 bitov. Vsak bajt v pomnilniku ima tudi naslov, ki je številka, ki pove, kje v pomnilniku se bajt nahaja. Prvi bajt v pomnilniku ima naslov 0, naslednji ima naslov 1 in tako naprej. Če pomnilnik razdelimo na bajte, ga je mogoče nasloviti na bajte, saj ima vsak bajt edinstven naslov. Naslovov bajtnih pomnilnikov ni mogoče uporabiti za sklicevanje na posamezen bit bajta. Bajt je najmanjši del pomnilnika, ki ga je mogoče nasloviti.
Čeprav se naslov nanaša na določen bajt v pomnilniku, procesorji omogočajo uporabo več bajtov pomnilnika zaporedoma. Najpogostejša uporaba te funkcije je uporaba 2 ali 4 bajtov v vrsti za predstavitev števila, običajno celega števila. Včasih se za predstavitev celih števil uporabljajo tudi posamezni bajti, a ker so dolgi le 8 bitov, lahko vsebujejo le 2 8ali 256 različnih možnih vrednosti. Z uporabo 2 ali 4 bajtov v vrstici se število različnih možnih vrednosti poveča na 2 16, 65536 oziroma 2 32, 4294967296.
Ko program uporabi bajt ali več bajtov v vrsti za predstavitev nečesa, na primer črke, številke ali česa drugega, se ti bajti imenujejo objekt, ker so vsi del iste stvari. Čeprav so vsi objekti shranjeni v enakih bajtih pomnilnika, jih obravnavamo, kot da imajo "tip", ki pove, kako naj se bajti razumejo: kot celo število, znak ali kakšen drug tip (na primer neceloštevilska vrednost). Strojno kodo si lahko predstavljamo tudi kot tip, ki se interpretira kot navodila. Pojem tipa je zelo, zelo pomemben, saj določa, katere stvari se lahko in katere ne smejo početi z objektom in kako interpretirati bajte objekta. Na primer, negativnega števila ni dovoljeno shraniti v objekt s pozitivnim številom, prav tako ni dovoljeno shraniti ulomka v celo število.
Naslov, ki kaže na (je naslov) večbajtnega objekta, je naslov prvega bajta tega objekta - bajta, ki ima najnižji naslov. Ob tem je treba opozoriti, da po naslovu ne morete ugotoviti, kakšna je vrsta predmeta - ali celo njegova velikost. Pravzaprav niti s pogledom ne morete ugotoviti, kakšne vrste je objekt. Program v zbirnem jeziku mora spremljati, na katerih pomnilniških naslovih se nahajajo posamezni objekti in kako veliki so ti objekti. Program, ki to počne, je varen glede na tip, saj z objekti počne le stvari, ki so glede na njihov tip varne. Program, ki tega ne počne, verjetno ne bo deloval pravilno. Upoštevajte, da večina programov dejansko ne shranjuje izrecno, kakšen je tip objekta, temveč do objektov dostopajo dosledno - isti objekt se vedno obravnava kot isti tip.
Procesor
Procesor izvaja navodila, ki so kot strojna koda shranjena v glavnem pomnilniku. Večina procesorjev ima poleg dostopa do pomnilnika za shranjevanje tudi nekaj majhnih, hitrih prostorov fiksne velikosti za shranjevanje predmetov, s katerimi se trenutno dela. Ti prostori se imenujejo registri. Procesorji običajno izvajajo tri vrste ukazov, čeprav so lahko nekateri ukazi kombinacija teh vrst. Spodaj je nekaj primerov posameznih vrst v zbirnem jeziku x86.
Navodila za branje ali pisanje v pomnilnik
Naslednje navodilo jezika zbirke x86 prebere (naloži) dvobajtni objekt iz bajta na naslovu 4096 (0x1000 v šestnajstiškem sistemu) v 16-bitni register z imenom "ax":
mov ax, [1000h]
V tem jeziku sestavljanja oglati oklepaji okrog številke (ali imena registra) pomenijo, da je treba številko uporabiti kot naslov za podatke, ki jih je treba uporabiti. Uporaba naslova za kazanje na podatke se imenuje indirekcija. V naslednjem primeru je brez oglatih oklepajev v drug register, bx, dejansko naložena vrednost 20.
mov bx, 20
Ker ni bila uporabljena nobena indirekcija, je bila v register vnesena dejanska vrednost.
Če so operandi (stvari, ki so za mnemotehniko) prikazani v obratnem vrstnem redu, se ukaz, ki nekaj naloži iz pomnilnika, namesto da bi to zapisal v pomnilnik:
mov [1000h], ax
V tem primeru dobi pomnilnik na naslovu 1000h vrednost ax. Če se ta primer izvede takoj za prejšnjim, bosta 2 bajta na naslovih 1000h in 1001h 2 bajta celega števila z vrednostjo 20.
Navodila, ki izvajajo matematične ali logične operacije.
Nekatera navodila izvajajo stvari, kot je odštevanje, ali logične operacije, kot je ne:
Primer strojne kode iz prejšnjega članka bi bil to v zbirnem jeziku:
dodaj os, 42
V tem primeru se seštejeta 42 in ax, rezultat pa se shrani nazaj v ax. Tudi v zbirki x86 je mogoče združiti dostop do pomnilnika in matematično operacijo, kot je ta:
dodaj ax, [1000h]
Ta ukaz doda vrednost dvobajtnega celega števila, shranjenega na 1000h, k ax in odgovor shrani v ax.
ali ax, bx
To navodilo izračuna ali vsebine registrov ax in bx ter rezultat shrani nazaj v ax.
Navodila, ki odločajo o tem, katero bo naslednje navodilo.
Navadno se navodila izvajajo v vrstnem redu, v katerem so prikazana v pomnilniku, kar je tudi vrstni red, v katerem so vnesena v kodo zbirnika. Procesor jih izvaja enega za drugim. Da pa lahko procesorji izvajajo zapletene stvari, morajo izvajati različna navodila glede na to, kakšni so podatki, ki so jih dobili. Sposobnost procesorjev, da izvajajo različna navodila glede na izid nečesa, se imenuje vejitev. Navodila, ki odločajo o tem, kakšno naj bo naslednje navodilo, se imenujejo navodila za vejitev.
Predpostavimo, da želi nekdo izračunati količino barve, ki jo bo potreboval za pobarvanje kvadrata z določeno dolžino stranice. Vendar mu zaradi ekonomije obsega trgovina z barvami ne bo prodala manjše količine barve, kot je potrebna za pobarvanje kvadrata 100 x 100.
Da bi ugotovili, koliko barve bodo potrebovali glede na dolžino kvadrata, ki ga želijo pobarvati, si zamislijo ta sklop korakov:
- od dolžine stranice odštejemo 100
- če je odgovor manjši od nič, nastavite dolžino stranice na 100
- pomnožite dolžino stranice s samim seboj
Ta algoritem lahko izrazimo z naslednjo kodo, kjer je ax dolžina stranice.
mov bx, ax sub bx, 100 jge continue mov ax, 100 continue: mul ax
Ta primer uvaja več novih stvari, vendar sta prvi dve navodili znani. Kopirata vrednost ax v bx in nato od bx odštejeta 100.
Ena od novih stvari v tem primeru se imenuje nalepka, koncept, ki ga najdemo v jezikih sestavljanja na splošno. Etikete so lahko vse, kar želi programer (razen če gre za ime navodila, kar bi zmedlo asembler). V tem primeru je oznaka "continue". Assembler jo razume kot naslov navodila. V tem primeru je to naslov mult ax.
Novost je tudi koncept zastavic. V procesorjih x86 številna navodila v procesorju nastavijo "zastavice", ki jih lahko naslednje navodilo uporabi pri odločanju, kaj storiti. V tem primeru, če je bil bx manjši od 100, bo sub nastavil zastavico, ki pove, da je bil rezultat manjši od nič.
Naslednje navodilo je jge, kar je kratica za "Jump if Greater than or Equal to". To je ukaz za vejitev. Če je rezultat večji ali enak nič, procesor namesto na naslednji ukaz preskoči na ukaz z oznako continue, ki je mul ax.
Ta primer deluje dobro, vendar ga večina programerjev ne bi napisala. Ukaz za odštevanje pravilno nastavi zastavico, vendar spremeni tudi vrednost, na kateri deluje, zaradi česar je bilo treba ax prekopirati v bx. Večina jezikov za sestavljanje omogoča primerjalna navodila, ki ne spremenijo nobenega od posredovanih argumentov, vendar še vedno pravilno nastavijo zastavice, in sestavljanje x86 ni nobena izjema.
cmp ax, 100 jge continue mov ax, 100 continue: mul ax
Namesto da bi odšteli 100 od ax, preverili, ali je to število manjše od nič, in ga pripisali nazaj ax, ostane ax nespremenjen. Zastave so še vedno nastavljene na enak način in skok se izvede v enakih primerih.
Vhod in izhod
Čeprav sta vhod in izhod temeljni del računalništva, ju v zbirnem jeziku ni mogoče izvesti na en sam način. To je zato, ker je način delovanja vhoda in izhoda odvisen od konfiguracije računalnika in operacijskega sistema, ki ga uporablja, in ne le od vrste procesorja, ki ga ima. V razdelku s primeri primer Hello World uporablja klice operacijskega sistema MS-DOS, primer za njim pa klice BIOS.
Vhod/izhod je mogoče izvajati v zbirnem jeziku. V zbirnem jeziku lahko na splošno izrazimo vse, kar je računalnik sposoben narediti. Vendar pa kljub temu, da v jeziku montaže obstajajo navodila za dodajanje in vejanje, ki vedno naredijo isto stvar, v jeziku montaže ni navodil, ki bi vedno izvajala I/O.
Pomembno je poudariti, da način delovanja vhodno-izhodnega sistema ni del nobenega jezika zbirke, saj ni del delovanja procesorja.