Ukazi zbirnega jezika za delo s steklom. Programiranje: zbirni jezik. Osnove zbirnega jezika. Na kratko o strukturi jezika

Programiranje na ravni strojnih navodil je minimalna raven, na kateri je možno programiranje. Sistem strojnih navodil mora zadostovati za izvajanje zahtevanih dejanj z izdajanjem navodil strojni opremi računalnika.

Vsako strojno navodilo je sestavljeno iz dveh delov:

  • operacijska soba - določanje "kaj storiti";
  • operand - definiranje predmetov obdelave, "kaj storiti s".

Strojni ukaz mikroprocesorja, napisan v zbirnem jeziku, je ena vrstica z naslednjo sintaktično obliko:

ukaz/naredba label operand(i); komentarji

V tem primeru je obvezno polje v vrstici ukaz ali direktiva.

Oznaka, ukaz/naredba in operandi (če obstajajo) so ločeni z vsaj enim presledkom ali tabulatorjem.

Če je treba ukaz ali direktivo nadaljevati v naslednji vrstici, se uporabi poševnica nazaj: \.

Privzeto zbirni jezik ne razlikuje med velikimi in malimi črkami v ukazih ali direktivah.

Primer vrstic kode:

štetje 1 ;Ime, direktiva, en operand
mov eax,0 ;Ukaz, dva operanda
cbw ; Ekipa

Oznake

Oznaka v zbirnem jeziku lahko vsebuje naslednje znake:

  • vse črke latinske abecede;
  • številke od 0 do 9;
  • posebni znaki: _, @, $, ?.

Piko lahko uporabite kot prvi znak oznake, vendar nekateri prevajalniki tega znaka odsvetujejo. Rezerviranih imen zbirnih jezikov (direktive, operaterji, imena ukazov) ni mogoče uporabiti kot oznake.

Prvi znak v oznaki mora biti črka ali poseben znak (ne številka). Največja dolžina nalepke - 31 znakov. Vse oznake, ki so zapisane v vrstici, ki ne vsebuje direktive za sestavljalnik, se morajo končati z dvopičjem: .

Ekipe

Ekipa pove prevajalcu, katero dejanje naj izvede mikroprocesor. V podatkovnem segmentu ukaz (ali direktiva) definira polje, delovni prostor ali konstanto. V segmentu kode navodilo definira dejanje, kot je premik (mov) ali dodajanje (add).

direktive

Sestavljalnik ima številne operaterje, ki vam omogočajo nadzor nad postopkom sestavljanja in generiranja seznama. Ti operaterji se imenujejo direktive . Delujejo samo v procesu sestavljanja programa in za razliko od navodil ne ustvarjajo strojnih kod.

operandov

Operand – objekt, na katerem se izvaja strojni ukaz ali operater programskega jezika.
Navodilo ima lahko enega ali dva operanda ali pa sploh nima operandov. Število operandov je implicitno določeno s kodo ukaza.
Primeri:

  • Brez operandov ret ;Return
  • En operand inc ecx ;Prirast ecx
  • Dva operanda seštejeta eax,12 ; Dodaj 12 v eax

Oznaki, ukazu (direktivi) in operandu ni treba začeti na nobenem določenem mestu v nizu. Priporočljivo pa jih je zapisati v stolpec za večjo berljivost programa.

Operandi so lahko

  • identifikatorji;
  • nizi znakov v enojnih ali dvojnih narekovajih;
  • cela števila v dvojiški, osmiški, decimalni ali šestnajstiški obliki.
Identifikatorji

Identifikatorji – zaporedja veljavnih znakov, ki se uporabljajo za označevanje programskih objektov, kot so operacijske kode, imena spremenljivk in imena oznak.

Pravila za pisanje identifikatorjev.

  • Identifikator je lahko en ali več znakov.
  • Kot znake lahko uporabite črke latinice, številke in nekatere posebne znake: _, ?, $, @.
  • Identifikator se ne more začeti s števko.
  • ID je lahko dolg do 255 znakov.
  • Prevajalec sprejme prvih 32 znakov identifikatorja in ignorira ostale.
Komentarji

Komentarji so od izvršljive vrstice ločeni z znakom; . V tem primeru je komentar vse, kar je zapisano za podpičjem in do konca vrstice. Uporaba komentarjev v programu izboljša njegovo jasnost, zlasti kadar je namen nabora navodil nejasen. Komentar lahko vsebuje poljubne natisljive znake, vključno s presledki. Komentar lahko zajema celotno vrstico ali sledi ukazu v isti vrstici.

Struktura programa skupščine

Program, napisan v zbirnem jeziku, je lahko sestavljen iz več delov, imenovanih moduli . Vsak modul lahko definira enega ali več segmentov podatkov, sklada in kode. Vsak popoln program v zbirnem jeziku mora vključevati en glavni ali glavni modul, od katerega se začne njegovo izvajanje. Modul lahko vsebuje kodo, podatke in segmente sklada, deklarirane z ustreznimi direktivami. Preden deklarirate segmente, morate podati pomnilniški model z uporabo direktive .MODEL.

Primer programa "ničesar" v zbirnem jeziku:

686P
.MODEL STANOVANJE, STDCALL
.PODATKI
.KODA
ZAČETEK:

RET
KONEC ZAČETEK

Ta program vsebuje samo en mikroprocesorski ukaz. Ta ukaz je RET. Zagotavlja pravilno prekinitev programa. Na splošno se ta ukaz uporablja za izhod iz postopka.
Preostali del programa je povezan z delovanjem prevajalnika.
.686P - dovoljeni so ukazi zaščitenega načina Pentium 6 (Pentium II). Ta direktiva izbere podprt niz ukazov asemblerja z določitvijo modela procesorja. Črka P na koncu direktive pove prevajalcu, da procesor deluje v zaščitenem načinu.
.MODEL FLAT, stdcall je ploščati pomnilniški model. Ta spominski model se uporablja v operacijski sobi sistem Windows. stdcall
.DATA je segment programa, ki vsebuje podatke.
.CODE je programski blok, ki vsebuje kodo.
START je oznaka. V asemblerju imajo oznake veliko vlogo, česar pa ne moremo reči o sodobnih jezikih na visoki ravni.
END START - konec programa in sporočilo prevajalniku, da mora program zagnati z oznake START .
Vsak modul mora vsebovati direktivo END, ki označuje konec izvorna koda programi. Vse vrstice, ki sledijo direktivi END, so prezrte. Če izpustite direktivo END, pride do napake.
Oznaka za direktivo END pove prevajalniku ime glavnega modula, od katerega se začne izvajanje programa. Če program vsebuje en modul, lahko oznako za direktivo END izpustite.

UZBEKISTANSKA NACIONALNA UNIVERZA PO IMENU MIRZO ULUGBEK

FAKULTETA ZA RAČUNALNIŠTVO

Na temo: Semantično razčlenjevanje datoteke EXE.

Dokončano:

Taškent 2003.

Predgovor.

Zbirni jezik in struktura navodil.

Struktura datoteke EXE (semantično razčlenjevanje).

Struktura datoteke COM.

Kako virus deluje in se širi.

Razstavljalec.

Programi.

Predgovor

Poklic programerja je neverjeten in edinstven. V našem času si znanosti in življenja ni mogoče predstavljati brez najnovejše tehnologije. Brez vsega, kar je povezano s človeško dejavnostjo, ne gre Računalništvo. In to prispeva k njegovemu visokemu razvoju in popolnosti. Tudi če se je razvoj osebnih računalnikov začel ne tako dolgo nazaj, so bili v tem času narejeni ogromni koraki v programskih izdelkih in ti izdelki bodo še dolgo v široki uporabi. Področje znanja, povezanega z računalnikom, je eksplodiralo, prav tako povezana tehnologija. Če ne upoštevamo komercialne plati, potem lahko rečemo, da tujkov na tem področju poklicnega delovanja ni. Mnogi se ne ukvarjajo z razvojem programov zaradi dobička ali zaslužka, temveč po lastni volji, iz strasti. Seveda to ne bi smelo vplivati ​​na kakovost programa, v tem poslu tako rekoč obstajata konkurenca in zahteva po kakovostni izvedbi, po stabilnem delu in izpolnjevanju vseh zahtev našega časa. Tukaj velja omeniti tudi pojav mikroprocesorjev v 60. letih prejšnjega stoletja, ki so nadomestili veliko število kompletov svetilk. Obstaja nekaj vrst mikroprocesorjev, ki se med seboj zelo razlikujejo. Ti mikroprocesorji se med seboj razlikujejo po bitni zmogljivosti in vgrajenih sistemskih ukazih. Najpogostejši so: Intel, IBM, Celeron, AMD itd. Vsi ti procesorji so povezani z napredno arhitekturo procesorjev Intel. Širjenje mikroračunalnikov je povzročilo ponoven razmislek o odnosu do zbirnega jezika iz dveh glavnih razlogov. Prvič, programi, napisani v zbirnem jeziku, zahtevajo bistveno manj pomnilnika in izvajalnega časa. Drugič, poznavanje zbirnega jezika in nastale strojne kode omogoča razumevanje strojne arhitekture, ki je težko zagotovljena pri delu v jeziku na visoki ravni. Čeprav večina programskih inženirjev razvija v jezikih visoke ravni, kot so Pascal, C ali Delphi, ki je lažje pisati programe, so najmočnejši in najučinkovitejši programsko opremo v celoti ali delno napisana v zbirnem jeziku. Jeziki na visoki ravni so bili zasnovani tako, da se izognejo posebnim tehnične značilnosti specifičnih računalnikih. In zbirni jezik je zasnovan za posebne posebnosti procesorja. Zato je treba za pisanje programa v zbirnem jeziku za določen računalnik poznati njegovo arhitekturo. Dandanes je pogled na glavno programski izdelek je datoteka EXE. Ob upoštevanju pozitivne strani zato je avtor programa lahko prepričan o njegovi nedotakljivosti. A velikokrat še zdaleč ni tako. Obstaja tudi razstavljalnik. S pomočjo disassemblerja lahko ugotovite prekinitve in programske kode. Osebi, ki dobro pozna asembler, ne bo težko predelati celotnega programa po svojem okusu. Morda od tod izvira najbolj nerešljiva težava – virus. Zakaj ljudje napišejo virus? Nekateri postavljajo to vprašanje s presenečenjem, nekateri z jezo, vendar še vedno obstajajo ljudje, ki jih ta naloga ne zanima z vidika povzročanja škode, ampak kot zanimanje za sistemsko programiranje. Pišite viruse različni razlogi. Nekateri imajo radi sistemske klice, drugi izpopolnjujejo svoje znanje v asemblerju. Vse to bom poskušal razložiti v svojem seminarska naloga. Prav tako ne govori le o strukturi datoteke EXE, ampak tudi o zbirnem jeziku.

^ Zbirni jezik.

Zanimivo je spremljati, od časa pojava prvih računalnikov do danes, preobrazbo idej o zbirnem jeziku med programerji.

Nekoč je bil asembler jezik, ne da bi vedel, da je bilo nemogoče pripraviti računalnik do česar koli koristnega. Postopoma se je stanje spremenilo. Pojavila so se bolj priročna sredstva za komunikacijo z računalnikom. Toda za razliko od drugih jezikov asembler ni umrl, poleg tega tega načeloma ni mogel storiti. Zakaj? V iskanju odgovora bomo poskušali razumeti, kaj je zbirni jezik na splošno.

Skratka, zbirni jezik je simbolna predstavitev strojnega jezika. Vse procese v stroju na najnižjem, strojnem nivoju poganjajo le ukazi (navodila) strojnega jezika. Iz tega je razvidno, da je kljub skupnemu imenu zbirni jezik za vsako vrsto računalnika drugačen. To tudi velja videz programe, napisane v asemblerju, in ideje, katerih odsev je ta jezik.

Nemogoče je resnično rešiti težave, povezane s strojno opremo (ali celo tiste, povezane s strojno opremo, kot je izboljšanje hitrosti programa), brez znanja asemblerja.

Programer ali kateri koli drug uporabnik lahko uporablja katera koli orodja na visoki ravni, vse do programov za gradnjo virtualnih svetov, in morda niti ne sumi, da računalnik dejansko ne izvaja ukazov jezika, v katerem je napisan njegov program, ampak njihove preoblikovano predstavitev v obliki dolgočasnih in dolgočasnih zaporedij ukazov povsem drugega jezika – strojnega jezika. Zdaj pa si predstavljajmo, da ima tak uporabnik nestandardno težavo ali pa je šlo le nekaj narobe. Na primer, njegov program mora delovati z neko nenavadno napravo ali izvajati druga dejanja, ki zahtevajo poznavanje načel računalniške strojne opreme. Ne glede na to, kako pameten je programer, ne glede na to, kako dober je jezik, v katerem je napisal svoj čudovit program, ne more brez znanja asemblerja. In ni naključje, da skoraj vsi prevajalniki jezikov na visoki ravni vsebujejo sredstva za povezovanje svojih modulov z moduli v asemblerju ali podpirajo dostop do ravni programiranja asemblerja.

Seveda je čas računalniških vagonov že minil. Kot pravi pregovor, ne moreš objeti neizmernosti. Nekaj ​​pa je skupnega, nekakšen temelj, na katerem se gradi vsako resno računalniško izobraževanje. To je znanje o principih delovanja računalnika, njegovi arhitekturi in zbirnem jeziku kot odrazu in utelešenju tega znanja.

Tipičen sodoben računalnik (i486 ali Pentium) je sestavljen iz naslednjih komponent (slika 1).

riž. 1. Računalnik in zunanje naprave

riž. 2. Blokovna shema osebnega računalnika

Iz slike (slika 1) je razvidno, da je računalnik sestavljen iz več fizičnih naprav, od katerih je vsaka povezana z eno enoto, imenovano sistemska enota. Logično je jasno, da igra vlogo neke koordinacijske naprave. Poglejmo noter sistemski blok(ni treba poskušati priti v notranjost monitorja - tam ni nič zanimivega, poleg tega je nevarno): odpremo ohišje in vidimo nekaj plošč, blokov, povezovalnih žic. Da bi razumeli njihov funkcionalni namen, si oglejmo blokovni diagram tipičnega računalnika (slika 2). Ne pretvarja se v absolutno natančnost in želi le prikazati namen, medsebojno povezanost in tipično sestavo elementov sodobnega osebnega računalnika.

Pogovorimo se o diagramu na sl. 2 v nekoliko nekonvencionalnem slogu.
V človeški naravi je, da ob srečanju z nečim novim išče neke asociacije, ki mu lahko pomagajo pri spoznavanju neznanega. Kakšne asociacije vzbuja računalnik? Zame je na primer računalnik pogosto povezan s človekom samim. Zakaj?

Človek, ki ustvarja računalnik, je nekje v globinah sebe mislil, da ustvarja nekaj podobnega sebi. Računalnik ima organe zaznavanja informacij iz zunanjega sveta - to je tipkovnica, miška, magnetni disk. Na sl. 2 ti organi se nahajajo desno od sistemskih vodil. Računalnik ima organe, ki "prebavljajo" prejete informacije - to so procesor in delovni spomin. In končno, računalnik ima govorne organe, ki dajejo rezultate obdelave. To je tudi nekaj naprav na desni.

Sodobni računalniki, seveda daleč od človeka. Lahko jih primerjamo z bitji, ki komunicirajo z zunanjim svetom na ravni velikega, a omejenega nabora brezpogojnih refleksov.
Ta niz refleksov tvori sistem strojnih navodil. Ne glede na to, kako visoko raven komunicirate z računalnikom, se na koncu vse skrči na dolgočasno in monotono zaporedje strojnih ukazov.
Vsak strojni ukaz je neke vrste dražljaj za vzbujanje tega ali onega brezpogojnega refleksa. Reakcija na ta dražljaj je vedno nedvoumna in je v bloku mikroukazov "vgrajena" v obliki mikroprograma. Ta mikroprogram izvaja dejanja za izvajanje strojnega ukaza, vendar že na ravni signalov, danih določenim logika računalnik, s čimer nadzoruje različne podsisteme računalnika. To je tako imenovani princip mikroprogramskega krmiljenja.

Če nadaljujemo analogijo z osebo, ugotavljamo: da bi računalnik pravilno jedel, je bilo izumljenih veliko operacijskih sistemov, prevajalnikov za stotine programskih jezikov itd.. Toda vsi so pravzaprav le jed, na kateri hrana (programi) se dostavlja po določenih pravilih želodec (računalnik). Samo želodec računalnika ljubi dietno, enolično hrano - dajte mu strukturirane informacije, v obliki strogo organiziranih zaporedij ničel in enic, katerih kombinacije sestavljajo strojni jezik.

Tako računalnik, ki je navzven poliglot, razume le en jezik - jezik strojnih navodil. Seveda za komunikacijo in delo z računalnikom ni potrebno znanje tega jezika, vendar se skoraj vsak profesionalni programer prej ali slej sooči s potrebo po učenju. Na srečo programerju ni treba poskušati ugotoviti pomena različnih kombinacij binarnih števil, saj so programerji že v 50. letih prejšnjega stoletja za programiranje začeli uporabljati simbolni analog strojnega jezika, ki so ga imenovali zbirni jezik. Ta jezik natančno odraža vse značilnosti strojnega jezika. Zato je za razliko od visokonivojskih jezikov zbirni jezik drugačen za vsako vrsto računalnika.

Iz navedenega lahko sklepamo, da ker je zbirni jezik za računalnik “domači”, je le v njem mogoče napisati najučinkovitejši program (pod pogojem, da ga je napisal usposobljen programer). Tukaj je en majhen "ampak": to je zelo naporen proces, ki zahteva veliko pozornosti in praktičnih izkušenj. Zato v resnici asembler piše predvsem programe, ki naj bi zagotavljali učinkovito delo s strojno opremo. Včasih so kritični deli programa glede časa izvajanja ali porabe pomnilnika napisani v asemblerju. Nato so izdelani v obliki podprogramov in združeni s kodo v jeziku visoke ravni.

Z učenjem zbirnega jezika katerega koli računalnika se je smiselno lotiti šele, ko ugotovimo, kateri del računalnika je ostal viden in na voljo za programiranje v tem jeziku. To je tako imenovani računalniški programski model, katerega del je mikroprocesorski programski model, ki vsebuje 32 registrov, ki so programerju bolj ali manj na voljo za uporabo.

Te registre lahko razdelimo v dve veliki skupini:

^16 registrov po meri;

16 sistemskih registrov.

Programi v zbirnem jeziku zelo pogosto uporabljajo registre. Večina registrov ima določen funkcionalni namen.

Kot že ime pove, se uporabniški registri imenujejo, ker jih lahko programer uporablja pri pisanju svojih programov. Ti registri vključujejo (slika 3):

Osem 32-bitnih registrov, ki jih programerji lahko uporabljajo za shranjevanje podatkov in naslovov (imenovani tudi registri splošnega namena (RON)):

šest segmentnih registrov: cs, ds, ss, es, fs, gs;

statusni in kontrolni registri:

Zastave register eflags/flags;

register kazalca ukazov eip/ip.

riž. 3. Registri uporabnikov mikroprocesorjev i486 in Pentium

Zakaj je veliko teh registrov prikazanih s poševnico? Ne, to niso različni registri - so deli enega velikega 32-bitnega registra. V programu jih je mogoče uporabiti kot ločene objekte. To je bilo storjeno, da bi zagotovili delovanje programov, napisanih za mlajše modele 16-bitnih mikroprocesorjev Intel, začenši z i8086. Mikroprocesorji i486 in Pentium imajo večinoma 32-bitne registre. Njihovo število, z izjemo segmentnih registrov, je enako kot pri i8086, vendar je dimenzija večja, kar se odraža v njihovih oznakah - imajo
predpono e (razširjeno).

^ Splošni registri
Vsi registri te skupine omogočajo dostop do svojih "nižjih" delov (glej sliko 3). Ko gledate to sliko, upoštevajte, da se lahko za samonaslavljanje uporabljajo le spodnji 16- in 8-bitni deli teh registrov. Zgornjih 16 bitov teh registrov ni na voljo kot neodvisni objekti. Kot smo omenili zgoraj, je to storjeno zaradi združljivosti z mlajšimi modeli 16-bitnih mikroprocesorjev Intel.

Naštejmo registre, ki spadajo v skupino splošnih registrov. Ker se ti registri fizično nahajajo v mikroprocesorju znotraj aritmetične logične enote (ALU), jih imenujemo tudi registri ALU:

eax/ax/ah/al (Accumulator register) - akumulator.
Uporablja se za shranjevanje vmesnih podatkov. V nekaterih ukazih je potrebna uporaba tega registra;

ebx/bx/bh/bl (Base register) - osnovni register.
Uporablja se za shranjevanje osnovnega naslova nekega predmeta v pomnilnik;

ecx/cx/ch/cl (Count register) - števec register.
Uporablja se v ukazih, ki izvajajo nekatera ponavljajoča se dejanja. Njegova uporaba je pogosto implicitna in skrita v algoritmu ustreznega ukaza.
Na primer, ukaz organizacije zanke poleg prenosa nadzora na ukaz, ki se nahaja na določenem naslovu, analizira in zmanjša vrednost registra ecx/cx za eno;

edx/dx/dh/dl (Register podatkov) - register podatkov.
Tako kot register eax/ax/ah/al shranjuje vmesne podatke. Nekateri ukazi zahtevajo njegovo uporabo; pri nekaterih ukazih se to zgodi implicitno.

Naslednja dva registra se uporabljata za podporo tako imenovanih verižnih operacij, to je operacij, ki zaporedno obdelujejo verige elementov, od katerih je vsak lahko dolg 32, 16 ali 8 bitov:

esi/si (Source Index register) - izvorno kazalo.
Ta register v verižnih operacijah vsebuje trenutni naslov elementa v izvorni verigi;

edi/di (Destination Index register) - indeks prejemnika (prejemnika).
Ta register v verižnih operacijah vsebuje trenutni naslov v ciljni verigi.

V arhitekturi mikroprocesorja na ravni strojne in programske opreme je podprta takšna podatkovna struktura, kot je sklad. Za delo s skladom v sistemu ukazov mikroprocesorja obstajajo posebni ukazi, v modelu programske opreme mikroprocesorja pa za to obstajajo posebni registri:

esp/sp (Stack Pointer register) - register kazalca sklada.
Vsebuje kazalec na vrh sklada v trenutnem segmentu sklada.

ebp/bp (Base Pointer register) - register osnovnega kazalca okvirja sklada.
Zasnovan za organiziranje naključnega dostopa do podatkov znotraj sklada.

Sklad je programsko področje za začasno shranjevanje poljubnih podatkov. Podatke seveda lahko hranimo tudi v podatkovnem segmentu, vendar je treba v tem primeru za vsak začasno shranjen podatek izdelati posebno poimenovano pomnilniško celico, kar poveča velikost programa in število uporabljenih imen. Priročnost sklada je v tem, da se njegovo območje ponovno uporabi, shranjevanje podatkov v sklad in njihovo pridobivanje od tam pa poteka z uporabo učinkovitih ukazov push in pop brez podajanja imen.
Sklad se tradicionalno uporablja na primer za shranjevanje vsebine registrov, ki jih uporablja program, preden pokliče podprogram, ki bo nato uporabil registre procesorja "za lastne namene". Izvirna vsebina registrov uhaja iz sklada po vrnitvi iz podprograma. Druga običajna tehnika je posredovanje parametrov, ki jih zahteva, v podprogram prek sklada. Podprogram, ki ve, v kakšnem vrstnem redu so parametri postavljeni na sklad, jih lahko vzame od tam in jih uporabi pri svojem izvajanju. Posebnost sklad je nekakšen vrstni red vzorčenja podatkov, ki jih vsebuje: kadar koli je v skladu na voljo samo zgornji element, tj. zadnji element, naložen v sklad. Če izstopite zgornji element iz sklada, postane na voljo naslednji element. Elementi sklada se nahajajo v območju pomnilnika, dodeljenem skladu, začenši od dna sklada (tj. od njegovega največjega naslova) do zaporedoma padajočih naslovov. Naslov zgornjega dostopnega elementa je shranjen v registru kazalca sklada SP. Kot vsako drugo področje programskega pomnilnika mora biti sklad vključen v neki segment ali tvoriti ločen segment. V obeh primerih se naslov segmenta tega segmenta postavi v register sklada segmentov SS. Tako par registrov SS:SP opisuje naslov razpoložljive celice sklada: SS shrani naslov segmenta sklada, SP pa odmik zadnjih podatkov, shranjenih na skladu (slika 4, a). Bodimo pozorni na to, da v začetnem stanju kazalec sklada SP kaže na celico, ki leži pod dnom sklada in vanj ni vključena.

Slika 4. Organizacija sklada: a - začetno stanje, b - po nalaganju enega elementa (v tem primeru vsebina registra AX), c - po nalaganju drugega elementa (vsebina registra DS), d - po razkladanju enega element, e - po raztovarjanju dveh elementov in vrnitvi v prvotno stanje.

Nalaganje na sklad se izvede s posebnim ukazom push stack. To navodilo najprej zmanjša vsebino kazalca sklada za 2 in nato postavi operand na naslov v SP. Če želimo na primer vsebino registra AX začasno shraniti na sklad, moramo izvesti ukaz

Sklad preide v stanje, prikazano na sl. 1.10, b. Vidimo lahko, da je kazalec sklada premaknjen za dva bajta navzgor (proti nižjim naslovom) in da je operand, določen v ukazu push, zapisan na ta naslov. Naslednji ukaz za nalaganje na sklad, na primer,

bo sklad premaknil v stanje, prikazano na sl. 1.10, c. Sklad bo zdaj vseboval dva elementa, pri čemer bo dostopen samo zgornji, na katerega kaže kazalec sklada SP. Če moramo čez nekaj časa obnoviti izvirno vsebino registrov, shranjenih na skladu, moramo izvesti pop ukaze (pop) iz sklada:

pop DS
pop SEKIRA

Kako velik mora biti kup? Odvisno od tega, kako intenzivno se uporablja v programu. Če na primer nameravate shraniti polje 10.000 bajtov na sklad, mora biti sklad vsaj te velikosti. Upoštevati je treba, da v nekaterih primerih sistem samodejno uporablja sklad, zlasti pri izvajanju prekinitvenega ukaza int 21h. S tem ukazom procesor najprej potisne povratni naslov na sklad, nato pa DOS tja potisne vsebino registrov in druge informacije, povezane s prekinjenim programom. Torej, tudi če program sklada sploh ne uporablja, mora biti še vedno prisoten v programu in imeti velikost vsaj nekaj deset besed. V našem prvem primeru smo na sklad postavili 128 besed, kar je vsekakor dovolj.

^ Struktura programa skupščine

Program v zbirnem jeziku je zbirka blokov pomnilnika, imenovanih pomnilniški segmenti. Program je lahko sestavljen iz enega ali več teh blokovnih segmentov. Vsak segment vsebuje zbirko jezikovnih stavkov, od katerih vsak zaseda ločeno vrstico programske kode.

Stavki sklopa so štiri vrste:

ukazi ali navodila, ki so simbolični dvojniki strojnih navodil. Med procesom prevajanja se navodila za sestavljanje pretvorijo v ustrezne ukaze nabora ukazov mikroprocesorja;

makroukazi - stavki programskega besedila, ki so oblikovani na določen način in se med prevodom nadomestijo z drugimi stavki;

direktive, ki povedo prevajalniku asemblerja, naj izvede neko dejanje. Direktive nimajo primerkov v strojni predstavitvi;

vrstice komentarjev, ki vsebujejo poljubne znake, vključno s črkami ruske abecede. Komentarje prevajalec ignorira.

^ Sintaksa zbirnega jezika

Stavki, ki sestavljajo program, so lahko sintaktični konstrukt, ki ustreza ukazu, makru, direktivi ali komentarju. Da jih asemblerski prevajalnik prepozna, morajo biti oblikovane po določenih sintaktičnih pravilih. Če želite to narediti, je najbolje uporabiti formalni opis sintakse jezika, kot so pravila slovnice. Najpogostejši načini za opis programskega jezika na ta način so sintaktični diagrami in razširjene Backus-Naur oblike. Za praktično uporabo sintaktični diagrami so bolj priročni. Na primer, sintakso stavkov zbirnega jezika je mogoče opisati z uporabo sintaksnih diagramov, prikazanih na naslednjih slikah.

riž. 5. Format stavkov Assemblerja

riž. 6. Formatne direktive

riž. 7. Oblika ukazov in makrov

Na teh risbah:

ime oznake - identifikator, katerega vrednost je naslov prvega bajta stavka izvorne kode programa, ki ga označuje;

ime - identifikator, ki razlikuje to direktivo od drugih direktiv z istim imenom. Kot rezultat obdelave določene direktive s strani asemblerja se lahko temu imenu dodelijo določene značilnosti;

koda operacije (COP) in direktiva sta mnemonični oznaki ustreznega strojnega ukaza, makro ukaza ali direktive prevajalca;

operandi - deli ukazov, makrov ali direktiv asemblerja, ki označujejo objekte, na katerih se izvajajo operacije. Operandi asemblerja so opisani z izrazi s številskimi in besedilnimi konstantami, oznakami spremenljivk in identifikatorji z uporabo operacijskih znakov in nekaterih rezerviranih besed.

^ Kako uporabljati sintaksne diagrame? Je zelo preprosto: vse kar morate storiti je, da poiščete in nato sledite poti od vhoda diagrama (levo) do njegovega izhoda (desno). Če taka pot obstaja, je stavek ali konstrukcija sintaktično pravilna. Če te poti ni, prevajalnik ne bo sprejel te konstrukcije. Pri delu s sintaksnimi diagrami bodite pozorni na smer obvoza, ki ga označujejo puščice, saj so med potmi lahko tiste, ki jim je mogoče slediti od desne proti levi. Pravzaprav sintaktični diagrami odražajo logiko prevajalca pri razčlenjevanju vhodnih stavkov programa.

Dovoljeni znaki pri pisanju besedila programov so:

Vse latinične črke: A-Z, a-z. V tem primeru se velike in male črke štejejo za enakovredne;

Številke od 0 do 9;

Znaki?, @, $, _, &;

Ločila,. ()< > { } + / * % ! " " ? \ = # ^.

Sestavljalni stavki so sestavljeni iz leksemov, ki so sintaktično neločljiva zaporedja veljavnih jezikovnih simbolov, ki so smiselni za prevajalca.

Žetoni so:

identifikatorji so zaporedja veljavnih znakov, ki se uporabljajo za označevanje programskih objektov, kot so kode operacij, imena spremenljivk in imena oznak. Pravilo za pisanje identifikatorjev je naslednje: identifikator je lahko sestavljen iz enega ali več znakov. Kot znake lahko uporabite črke latinice, številke in nekatere posebne znake - _, ?, $, @. Identifikator se ne more začeti s števko. Dolžina identifikatorja je lahko do 255 znakov, čeprav prevajalec sprejme le prvih 32 znakov in prezre ostale. Z možnostjo lahko prilagodite dolžino možnih identifikatorjev ukazna vrstica mv. Poleg tega je mogoče prevajalcu ukazati, naj razlikuje med velikimi in malimi črkami ali pa prezre njihovo razliko (kar je privzeto storjeno).

^ Ukazi zbirnega jezika.

Ukazi asemblerja odpirajo možnost prenosa svojih zahtev na računalnik, mehanizem za prenos krmiljenja v programu (zanke in skoki) za logične primerjave in organizacijo programa. Vendar pa so programske naloge le redko tako preproste. Večina programov vsebuje vrsto zank, v katerih se ponavlja več ukazov, dokler ni dosežena določena zahteva, in različna preverjanja, da se ugotovi, katero od več dejanj je treba izvesti. Nekateri ukazi lahko prenesejo nadzor s spreminjanjem običajnega zaporedja korakov z neposrednim spreminjanjem vrednosti odmika v ukaznem kazalcu. Kot smo že omenili, obstajajo različni ukazi za različne procesorje, vendar bomo razmislili o nekaterih ukazih za procesorje 80186, 80286 in 80386.

Za opis stanja zastavic po izvedbi določenega ukaza bomo uporabili izbor iz tabele, ki odraža strukturo registra zastavic eflags:

V spodnji vrstici te tabele so navedene vrednosti zastavic po izvedbi ukaza. V tem primeru se uporabljajo naslednji zapisi:

1 - po izvedbi ukaza se nastavi zastavica (enaka 1);

0 - po izvedbi ukaza se zastavica ponastavi (enaka 0);

r - vrednost zastavice je odvisna od rezultata ukaza;

Po izvedbi ukaza je zastavica nedefinirana;

presledek - po izvedbi ukaza se zastavica ne spremeni;

Naslednji zapis se uporablja za predstavitev operandov v sintaksnih diagramih:

r8, r16, r32 - operand v enem od registrov velikosti bajta, besede ali dvojne besede;

m8, m16, m32, m48 - operand v velikosti pomnilnika bajtov, besede, dvojne besede ali 48 bitov;

i8, i16, i32 - neposredni operand velikosti bajt, beseda ali dvojna beseda;

a8, a16, a32 - relativni naslov (odmik) v segmentu kode.

Ukazi (po abecednem vrstnem redu):

*Ti ukazi so podrobno opisani.

DODAJ
(DODATEK)

Dodatek

^ Oris ukaza:

dodajte cilj, vir

Namen: dodatek dveh izvornih in ciljnih operandov dimenzij bajta, besede ali dvojne besede.

Algoritem dela:

dodajte izvorni in ciljni operand;

zapišite rezultat seštevanja v sprejemnik;

nastavite zastave.

Status zastavic po izvedbi ukaza:

Uporaba:
Ukaz add se uporablja za dodajanje dveh celih operandov. Rezultat seštevanja se postavi na naslov prvega operanda. Če rezultat dodajanja preseže meje ciljnega operanda (pride do prelivanja), je treba to situacijo upoštevati z analizo zastavice cf in nato po možnosti z uporabo ukaza adc. Na primer, dodamo vrednosti v register ax in pomnilniško območje ch. Pri dodajanju je treba upoštevati možnost prelivanja.

Register plus register ali pomnilnik:

|000000dw|modregr/rm|

Register AX (AL) plus takojšnja vrednost:

|0000010w|--podatki--|podatki, če je w=1|

Register ali spomin plus takojšnja vrednost:

|100000sw|mod000r/m|--podatki--|podatki, če je BW=01|

POKLIČITE
(KLIC)

Klicanje postopka ali opravila

^ Oris ukaza:

Namen:

prenos nadzora na bližnji ali daljni postopek s shranjevanjem naslova povratne točke na sklad;

preklapljanje nalog.

Algoritem dela:
določeno z vrsto operanda:

Oznaka je blizu - vsebina kazalca ukaza eip / ip se potisne na sklad in nova vrednost naslova, ki ustreza oznaki, se naloži v isti register;

Daljnja oznaka - vsebina kazalca ukaza eip/ip in cs je potisnjena na sklad. Nato se nove vrednosti naslova, ki ustrezajo oddaljeni oznaki, naložijo v iste registre;

R16, 32 ali m16, 32 - definira register ali pomnilniško celico, ki vsebuje odmike v trenutnem segmentu ukaza, kamor se prenaša krmiljenje. Ko se nadzor prenese, se vsebina kazalca ukaza eip/ip potisne na sklad;

Kazalec pomnilnika - definira pomnilniško lokacijo, ki vsebuje 4 ali 6 bajtni kazalec na proceduro, ki se kliče. Struktura takega kazalca je 2+2 ali 2+4 bajtov. Razlaga takšnega kazalca je odvisna od načina delovanja mikroprocesorja:

^ Stanje zastavic po izvedbi ukaza (razen preklopa nalog):

izvajanje ukaza ne vpliva na zastavice

Ko se naloga preklopi, se vrednosti zastavic spremenijo glede na informacije o registru eflags v statusnem segmentu TSS naloge, na katero se preklopi.
Uporaba:
Ukaz za klic vam omogoča organiziranje prilagodljivega in večvariantnega prenosa nadzora na podprogram, pri čemer ohranite naslov povratne točke.

Objektna koda (štirje formati):

Neposredno naslavljanje v segmentu:

|11101000|disp-nizko|diep-visoko|

Posredno naslavljanje v segmentu:

|11111111|mod010r/m|

Posredno naslavljanje med segmenti:

|11111111|mod011r/m|

Neposredno naslavljanje med segmenti:

|10011010|odmik-nizek|odmik-visok|seg-nizek|seg-visok|

CMP
(primerjaj operande)

Primerjava operandov

^ Oris ukaza:

cmp operand1, operand2

Namen: primerjava dveh operandov.

Algoritem dela:

izvedite odštevanje (operand1-operand2);

odvisno od rezultata, nastavite zastavice, ne spremenite operand1 in operand2 (to je, ne shranite rezultata).

Uporaba:
Ta ukaz uporablja se za primerjavo dveh operandov z odštevanjem, medtem ko se operanda ne spremenita. Zastavice se nastavijo kot rezultat izvajanja ukaza. Ukaz cmp se uporablja z navodili za pogojni skok in navodilom za nastavitev bajta po vrednosti setcc.

Objektna koda (trije formati):

Register ali registrirani pomnilnik:

|001110dw|modreg/m|

Takojšnja vrednost z registrom AX (AL):

|0011110w|--podatki--|podatki, če je w=1|

Takojšnja vrednost z registrom ali pomnilnikom:

|100000sw|mod111r/m|--podatki--|podatki, če je sw=0|

DEC
(ZMANJŠAJ operand za 1)

Zmanjšanje operanda za eno

^ Oris ukaza:

dec operand

Namen: zmanjšati vrednost operanda v pomnilniku ali registru za 1.

Algoritem dela:
navodilo odšteje 1 od operanda. Status zastavic po izvedbi ukaza:

Uporaba:
Ukaz dec se uporablja za zmanjšanje vrednosti bajta, besede, dvojne besede v pomnilniku ali registru za eno. Upoštevajte, da ukaz ne vpliva na zastavo cf.

Register: |01001reg|

^ Register ali spomin: |1111111w|mod001r/m|

DIV
(DIVide nepodpisan)

Divizija brez predznaka

Shema ukazov:

div delilnik

Namen: izvesti operacijo deljenja dveh binarnih nepredznačenih vrednosti.

^ Algoritem dela:
Ukaz zahteva dva operanda - delitelj in delitelj. Dividenda je določena implicitno, njena velikost pa je odvisna od velikosti delitelja, ki je podana v ukazu:

če je delitelj v bajtih, mora biti dividenda v registru ax. Po operaciji se količnik postavi v al in preostanek v ah;

če je delitelj beseda, se mora dividenda nahajati v registrskem paru dx:ax, pri čemer je spodnji del dividende v ax. Po operaciji se količnik postavi v ax, preostanek pa v dx;

če je delitelj dvojna beseda, mora biti dividenda v registrskem paru edx:eax, pri čemer je spodnji del dividende v eax. Po operaciji se količnik postavi v eax, preostanek pa v edx.

^ Stanje zastavic po izvedbi ukaza:

Uporaba:
Ukaz izvede celoštevilsko deljenje operandov, pri čemer vrne rezultat deljenja kot količnik in preostanek deljenja. Pri izvajanju operacije deljenja lahko pride do izjeme: 0 - napaka deljenja. Ta situacija se pojavi v enem od dveh primerov: delitelj je 0 ali pa je količnik prevelik, da bi se prilegal v register eax/ax/al.

Koda objekta:

|1111011w|mod110r/m|

INT
(INterrupt)

Klicanje prekinitvene servisne rutine

^ Oris ukaza:

int številka_prekinitve

Namen: pokličite prekinitveno servisno rutino s številko prekinitve, podano z operandom ukaza.

^ Algoritem dela:

potisnite register eflags/flags in povratni naslov na sklad. Pri pisanju povratnega naslova se najprej zapiše vsebina segmentnega registra cs, nato pa vsebina ukaznega kazalca eip/ip;

ponastavite zastavici if in tf na nič;

prenesite nadzor na upravljalnik prekinitev z določeno številko. Mehanizem prenosa krmiljenja je odvisen od načina delovanja mikroprocesorja.

^ Stanje zastavic po izvedbi ukaza:

Uporaba:
Kot lahko vidite iz sintakse, obstajata dve obliki tega ukaza:

int 3 - ima lastno individualno opcode 0cch in zaseda en bajt. Zaradi te okoliščine je uporaba v različnih razhroščevalnikih programske opreme zelo priročna za nastavitev prekinitvenih točk z zamenjavo prvega bajta katerega koli ukaza. Mikroprocesor, ko v zaporedju ukazov naleti na ukaz z operacijsko kodo 0cch, pokliče upravljalnik prekinitev z vektorsko številko 3, ki služi za komunikacijo s programskim razhroščevalnikom.

Druga oblika ukaza je dolga dva bajta, ima operacijsko kodo 0cdh in vam omogoča, da sprožite klic prekinitvene storitvene rutine z vektorsko številko v območju 0-255. Značilnosti prenosa nadzora, kot je navedeno, so odvisne od načina delovanja mikroprocesorja.

Objektna koda (dva formata):

Register: |01000reg|

^ Register ali spomin: |1111111w|mod000r/m|

JCC
JCXZ/JECXZ
(Skoči, če je pogoj)

(Skoči, če je CX=Nič/ Skoči, če je ECX=Nič)

Skoči, če je pogoj izpolnjen

Skoči, če je CX/ECX nič

^ Oris ukaza:

oznaka jcc
oznaka jcxz
oznaka jecxz

Namen: prehod znotraj trenutnega segmenta ukazov, odvisno od nekega pogoja.

^ Algoritem ukazov (razen za jcxz/jecxz):
Preverjanje stanja zastavic glede na operacijsko kodo (odraža stanje, ki se preverja):

če je preizkušeni pogoj resničen, pojdite v celico, ki jo označuje operand;

če je pogoj, ki se preverja, napačen, nato prenesite nadzor na naslednji ukaz.

algoritem ukazov jcxz/jecxz:
Preverjanje pogoja, da je vsebina registra ecx/cx enaka nič:

če je preverjeno stanje

Splošne informacije o zbirnem jeziku

Simbolni zbirni jezik omogoča v veliki meri odpravo pomanjkljivosti programiranja v strojnem jeziku.

Njegova glavna prednost je, da so v zbirnem jeziku vsi programski elementi predstavljeni v simbolni obliki. Za preoblikovanje simboličnih imen ukazov v njihove binarne kode je odgovoren poseben program- asembler, ki programerja osvobodi napornega dela in odpravi neizogibne napake.

Simbolična imena, uvedena pri programiranju v zbirnem jeziku, praviloma odražajo semantiko programa in okrajšave ukazov - njihovo glavno funkcijo. Na primer: PARAM - parameter, TABLE - tabela, MASK - maska, ADD - seštevanje, SUB - odštevanje itd. Takšna imena si programer zlahka zapomni.

Za programiranje v zbirnem jeziku je potrebno imeti zapletena orodja kot za programiranje v strojnem jeziku: potrebujete računalniške sisteme, ki temeljijo na mikroračunalnikih ali osebnih računalnikih z naborom periferne naprave(alfanumerična tipkovnica, prikaz znakov, disketni pogon in tiskalnik), kot tudi rezidenčni ali navzkrižni programski sistemi za zahtevane tipe mikroprocesorjev. Zbiralni jezik vam omogoča učinkovito pisanje in odpravljanje napak v veliko bolj zapletenih programih kot strojni jezik (do 1 - 4 KB).

Zbiralni jeziki so strojno usmerjeni, to je odvisni od strojnega jezika in strukture ustreznega mikroprocesorja, saj vsakemu ukazu mikroprocesorja dodelijo določeno simbolno ime.

Zbirni jeziki zagotavljajo znatno povečanje produktivnosti programerjev v primerjavi s strojnimi jeziki in hkrati ohranjajo možnost uporabe vseh programsko dostopnih strojnih virov mikroprocesorja. To omogoča izkušenim programerjem, da napišejo programe, ki delujejo v več kot kratek čas in zasedejo manj pomnilnika kot programi, napisani v jeziku visoke ravni.

V zvezi s tem so skoraj vsi programi za nadzor V / I naprav (gonilniki) napisani v zbirnem jeziku, kljub prisotnosti precej velikega števila jezikov na visoki ravni.

S pomočjo zbirnega jezika lahko programer nastavi naslednje parametre:

mnemonika (simbolno ime) vsakega ukaza strojnega jezika mikroprocesorja;

standardni format za vrstice programa, opisanega v asemblerju;

format za določanje različne načine možnosti naslavljanja in ukazov;

format za podajanje znakovnih konstant in konstant celoštevilskega tipa v različnih številskih sistemih;

psevdoukazi, ki nadzorujejo proces sestavljanja (prevajanja) programa.

V zbirnem jeziku je program napisan vrstico za vrstico, kar pomeni, da je vsakemu ukazu dodeljena ena vrstica.

Za mikroračunalnike, zgrajene na podlagi najpogostejših tipov mikroprocesorjev, lahko obstaja več različic zbirnega jezika, vendar ima ena običajno eno praktično distribucijo - to je tako imenovani standardni zbirni jezik

Programiranje na ravni strojnih navodil je minimalna raven, na kateri je možno programiranje. Sistem strojnih navodil mora zadostovati za izvajanje zahtevanih dejanj z izdajanjem navodil strojni opremi računalnika.

Vsako strojno navodilo je sestavljeno iz dveh delov:

delovanje - določanje "kaj storiti";

· operand - definiranje procesnih objektov, "kaj narediti s".

Strojni ukaz mikroprocesorja, napisan v zbirnem jeziku, je ena vrstica z naslednjo sintaktično obliko:

operand(i) ukaza/navodila oznake; komentarji

V tem primeru je obvezno polje v vrstici ukaz ali direktiva.

Oznaka, ukaz/naredba in operandi (če obstajajo) so ločeni z vsaj enim presledkom ali tabulatorjem.

Če je treba ukaz ali direktivo nadaljevati v naslednji vrstici, se uporabi poševnica nazaj: \.

Privzeto zbirni jezik ne razlikuje med velikimi in malimi črkami v ukazih ali direktivah.

Neposredno naslavljanje: Učinkovit naslov je določen neposredno s poljem odmika strojnega ukaza, ki je lahko velikosti 8, 16 ali 32 bitov.

mov eax, vsota ; eax = vsota

Sestavljalnik zamenja vsoto z ustreznim naslovom, shranjenim v podatkovnem segmentu (privzeto naslovljen z registrom ds) in postavi vrednost, shranjeno na vsoto naslova, v register eax.

posredno naslavljanje pa ima naslednje vrste:

posredno osnovno (registrsko) naslavljanje;

posredno osnovno (registrsko) naslavljanje z odmikom;

· posredno indeksno naslavljanje;

· posredno osnovno indeksno naslavljanje.

Posredno osnovno (registrsko) naslavljanje. S tem naslavljanjem je lahko učinkovit naslov operanda v katerem koli registru splošnega namena, razen sp / esp in bp / ebp (to so posebni registri za delo s segmentom sklada). Sintaktično v navodilu je ta način naslavljanja izražen tako, da se ime registra zapre v oglate oklepaje.

mov eax, ; eax = *esi; *esi vrednost na naslovu esi

Tema 2.5 Osnove programiranja procesorja

Ko se program daljša, si je težje zapomniti kode za različne operacije. Mnemotehnika nudi nekaj pomoči pri tem.

Imenuje se jezik za kodiranje simbolnih navodil sestavljalec.

zbirni jezik je jezik, v katerem vsak stavek ustreza točno enemu strojnemu ukazu.

Montaža imenovano pretvorba programa iz zbirnega jezika, tj. priprava programa v strojnem jeziku z zamenjavo simbolnih imen operacij s strojnimi kodami in simbolnih naslovov z absolutnimi ali relativnimi številkami, kot tudi vključitev knjižničnih programov in generiranje zaporedij simbolnih navodil z določanjem specifičnih parametrov v mikronavodilih. Ta program običajno nameščen v ROM ali vnesen v RAM z zunanjega medija.

Zbiralni jezik ima več lastnosti, po katerih se razlikuje od jezikov na visoki ravni:

1. To je ujemanje ena proti ena med stavki zbirnega jezika in strojnimi navodili.

2. Programer zbirnega jezika ima dostop do vseh objektov in ukazov, ki so prisotni na ciljnem računalniku.

Razumevanje osnov programiranja v strojno usmerjenih jezikih je koristno za:



Boljše razumevanje arhitekture osebnih računalnikov in boljša uporaba računalnikov;

Razviti bolj racionalne strukture algoritmov za programe za reševanje aplikativnih problemov;

Možnost ogleda in popravka izvedljivih programov s pripono .exe in .com, prevedenih iz katerega koli jezika na visoki ravni, v primeru izgube izvornih programov (s klicem teh programov v razhroščevalnik programov DEBUG in deprevajanjem njihovega prikaza v zbirnem jeziku );

Sestavljanje programov za reševanje najbolj kritičnih nalog (program, sestavljen v strojno orientiranem jeziku, je običajno učinkovitejši – krajši in hitrejši za 30-60 odstotkov od programov, pridobljenih kot rezultat prevajanja iz visokonivojskih jezikov)

Za izvajanje postopkov, ki so vključeni v glavni program kot ločeni fragmenti, v primeru, da jih ni mogoče implementirati bodisi v uporabljenem jeziku na visoki ravni bodisi z uporabo servisnih postopkov OS.

Program v zbirnem jeziku se lahko izvaja samo na računalnikih iste družine, medtem ko se program, napisan v jeziku visoke ravni, lahko izvaja na različnih strojih.

Abeceda zbirnega jezika je sestavljena iz znakov ASCII.

Števila so samo cela števila. Razlikovati:

Binarna števila, ki se končajo s črko B;

Decimalna števila, ki se končajo z D;

Šestnajstiška števila, ki se končajo s črko N.

Oven, registri, prikaz podatkov

Za določeno serijo MP se uporablja posamezen programski jezik - zbirni jezik.

Zbirni jezik zavzema vmesni položaj med strojnimi kodami in jeziki na visoki ravni. Programiranje v tem jeziku je lažje. Program v zbirnem jeziku bolj racionalno uporablja zmožnosti določenega stroja (natančneje MP) kot program v jeziku visoke ravni (kar je lažje za programerja kot za asemblerja). Upoštevali bomo osnovna načela programiranja v strojno usmerjenih jezikih z uporabo zbirnega jezika za MP KR580VM80 kot primer. Za programiranje v jeziku se uporablja splošna tehnika. Posebne tehnike za snemanje programov so povezane z arhitekturo in funkcijami ukaznega sistema ciljnega MP.

Model programske opreme mikroprocesorski sistem na osnovi MP KR580VM80

Programski model MPS v skladu s sliko 1

MP Ports Memory

S Z AC p C

Slika 1

Z vidika programerja ima KR580VM80 MP naslednje programsko dostopne registre.

A– 8-bitni akumulatorski register. Je glavni register MP. Vsaka operacija, izvedena v ALU, vključuje namestitev enega od operandov, ki jih je treba obdelati, v akumulator. Tudi rezultat operacije v ALU je običajno shranjen v A.

B, C, D, E, H, L– 8-bitni registri splošnega namena (RON). Notranji spomin MP. Zasnovan za shranjevanje obdelanih informacij in rezultatov operacije. Pri obdelavi 16-bitnih besed iz registrov se oblikujejo pari BC, DE, HL, dvojni register pa se imenuje prva črka - B, D, H. V registrskem paru je prvi register najvišji. Registra H, L, ki se uporabljata tako za shranjevanje podatkov kot za shranjevanje 16-bitnih naslovov celic RAM, imata posebno lastnost.

FL– zastavični register (feature register) 8-bitni register, ki v MP shrani pet značilnosti rezultata izvajanja aritmetičnih in logičnih operacij. FL format glede na sliko

Bit C (CY - prenos) - prenos, nastavljen na 1, če je med izvajanjem aritmetičnih operacij prišlo do prenosa iz višjega reda bajta.

Bit P (parnost) - pariteta, je nastavljena na 1, če je število enot v bitih rezultata sodo.

Bit AC je dodaten prenos, namenjen shranjevanju prenosne vrednosti iz nižje tetrade rezultata.

Bit Z (nič) - nastavljen na 1, če je rezultat operacije 0.

Bit S (predznak) je nastavljen na 1, če je rezultat negativen, in na 0, če je rezultat pozitiven.

SP-- kazalec sklada, 16-bitni register, je zasnovan za shranjevanje naslova pomnilniške lokacije, kamor je bil zapisan zadnji bajt, vnesen v sklad.

RS– programski števec (programski števec), 16-bitni register, namenjen shranjevanju naslova naslednjega izvršljivega ukaza. Vsebina programskega števca se samodejno poveča za 1 takoj po pridobitvi naslednjega ukaznega bajta.

V območju začetnega pomnilnika naslova 0000H se nahaja 07FF nadzorni program in demo programi. To je območje ROM.

0800 - 0AFF - naslovno območje za snemanje preučevanih programov. (OVEN).

0В00 - 0ВВ0 - naslovno območje za zapis podatkov. (OVEN).

0BB0 je začetni naslov sklada. (OVEN).

Stack je posebej organizirano območje RAM-a, namenjeno začasnemu shranjevanju podatkov ali naslovov. Zadnja številka, potisnjena na sklad, je prva številka, ki je izstopila iz sklada. Kazalec sklada shrani naslov zadnje lokacije sklada, kjer so shranjene informacije. Ob klicu podprograma se povratni naslov glavnega programa samodejno shrani na sklad. Praviloma se na začetku vsakega podprograma vsebine vseh registrov, ki sodelujejo pri njegovem izvajanju, shranijo na sklad, na koncu podprograma pa se obnovijo iz sklada.

Podatkovni format zbirnega jezika in ukazna struktura

Pomnilnik MP KR580VM80 je niz 8-bitnih besed, imenovanih bajti.Vsak bajt ima svoj 16-bitni naslov, ki določa njegov položaj v zaporedju pomnilniških celic. MP lahko naslovi 65536 bajtov pomnilnika, ki lahko vsebuje tako ROM kot RAM.

Format podatkov

Podatki so shranjeni v pomnilniku kot 8-bitne besede:

D7 D6 D5 D4 D3 D2 D1 D0

Najmanj pomemben bit je bit 0, najpomembnejši bit je bit 7.

Za ukaz je značilen format, to je število zanj dodeljenih bitov, ki so bajt za bajtom razdeljeni v določena funkcijska polja.

Oblika ukaza

Ukazi MP KR580VM80 imajo eno-, dvo- ali tribajtno obliko. Večbajtna navodila morajo biti postavljena v sosednje PL-je. Oblika ukaza je odvisna od posebnosti operacije, ki se izvaja.

Prvi bajt ukaza vsebuje opcode, zapisano v mnemonični obliki.

Določa obliko ukaza in dejanja, ki jih mora MP izvajati nad podatkom med njegovim izvajanjem, ter način naslavljanja, lahko pa vsebuje tudi podatek o lokaciji podatka.

Drugi in tretji bajt lahko vsebujeta podatke, s katerimi je treba delovati, ali naslove, ki označujejo lokacijo podatkov. Podatke, na katerih se izvajajo operacije, imenujemo operandi.

Enobajtni ukazni format v skladu s sliko 2

Slika 4

V navodilih za zbirni jezik ima opcode skrajšano obliko zapisa angleških besed – mnemonični zapis. Mnemotehnika (iz grščine mnemonic – veščina pomnjenja) omogoča lažje pomnjenje ukazov glede na njihov funkcionalni namen.

Izvorni program se pred izvedbo prevede s prevajalskim programom, imenovanim asembler, v jezik kodnih kombinacij – strojni jezik, v tej obliki se namesti v pomnilnik MP in nato uporabi pri izvajanju ukaza.


Metode naslavljanja

Vse kode operandov (vhodne in izhodne) se morajo nekje nahajati. Lahko so v internih registrih MP (najbolj priročno in hitra možnost). Lahko se nahajajo v sistemskem pomnilniku (najpogostejša možnost). Končno so lahko v V/I napravah (najredkejši primer). Lokacija operandov je določena z ukazno kodo. obstajati različne metode, s katerim lahko ukazna koda določi, kam vzeti vhodni operand in kam izhodni operand. Te metode se imenujejo metode naslavljanja.

Za MP KR580VM80 obstajajo naslednji načini naslavljanja:

Takojšnje;

Registracija;

posredno;

Stack.

Takoj naslavljanje predpostavlja, da je operand (vhod) v pomnilniku takoj za kodo ukaza. Operand je običajno konstanta, ki jo je treba nekam poslati, nečemu dodati itd. podatki so vsebovani v drugem ali drugem in tretjem bajtu ukaza, z nizkim podatkovnim bajtom v drugem ukaznem bajtu in visokim podatkovnim bajtom v tretjem ukaznem bajtu.

Naravnost (aka absolutno) naslavljanje predpostavlja, da se operand (vhod ali izhod) nahaja v pomnilniku na naslovu, katerega koda se nahaja znotraj programa takoj za kodo ukaza. Uporablja se v tribajtnih ukazih.

Registrirajte se naslavljanje predpostavlja, da je operand (vhod ali izhod) v notranjem registru MP. Uporablja se v enobajtnih ukazih

posredno (implicitno) naslavljanje predpostavlja, da notranji register MP ni sam operand, temveč njegov naslov v pomnilniku.

Stack naslavljanje predpostavlja, da ukaz ne vsebuje naslova. Naslavljanje pomnilniških celic z vsebino 16-bitnega registra SP (kazalec sklada).

Komandni sistem

Sistem ukazov MP je popoln seznam osnovnih dejanj, ki jih je MP sposoben izvesti. MP, ki ga nadzirajo ti ukazi, izvaja preprosta dejanja, kot so elementarne aritmetične in logične operacije, prenos podatkov, primerjava dveh vrednosti itd. Število ukazov MP KR580VM80 je 78 (vključno z modifikacijami 244).

Obstajajo naslednje skupine ukazov:

Prenos podatkov;

Aritmetika;

Uganka;

Ukazi za skok;

Ukazi za vnos-izhod, nadzor in delo s skladom.


Simboli in okrajšave, ki se uporabljajo pri opisovanju ukazov in pisanju programov

Simbol Zmanjšanje
NASLOV 16-bitni naslov
PODATKI 8-bitni podatki
PODATKI 16 16 bitni podatki
PORT 8-bitni V/I naslov (V/I naprave)
BAJT 2 Drugi ukazni bajt
BAJT 3 Tretji ukazni bajt
R, R1, R2 Eden od registrov: A, B, C, D, E, H, L
RP Eden od registrskih parov: B - nastavi par letal; D - nastavi par DE; H - določa par HL
RH Prvi register para
RL Drugi register para
Λ Logično množenje
V Boolov dodatek
Dodatek po modulu dva
M Pomnilniška celica, katere naslov določa vsebino para registrov HL, tj. M = (HL)

Uvod.

Imenuje se jezik, v katerem je napisan izvirni program vnos jezik in jezik, v katerega se prevede za izvajanje s strani procesorja - vikend jezik. Postopek pretvorbe vhodnega jezika v izhodni jezik se imenuje oddaja. Ker so procesorji sposobni izvajati programe v binarnem strojnem jeziku, ki se ne uporablja za programiranje, je potrebno prevajanje vseh izvornih programov. znan dva načina prevodi: kompilacija in tolmačenje.

pri kompilacija izvorni program je najprej v celoti preveden v enakovreden program v ciljnem jeziku, imenovan predmet program in nato izveden. Ta postopek se izvaja s posebnim programi, klical prevajalnik. Prevajalnik, za katerega je vhodni jezik simbolna predstavitev strojnega (izhodnega) jezika binarnih kod, se imenuje sestavljalec.

pri interpretacije vsaka vrstica besedila izvornega programa je razčlenjena (interpretirana) in v njej podani ukaz se takoj izvede. Izvedba te metode leži pri tolmaški program. Tolmačenje traja dolgo. Za povečanje učinkovitosti tolmač namesto obdelave vsake vrstice vse predhodno pretvori ukaz nizi v znake (

). Ustvarjeno zaporedje simbolov se uporablja za izvajanje funkcij, dodeljenih izvirnemu programu.

Zbiralni jezik, obravnavan spodaj, je implementiran s prevajanjem.

Značilnosti jezika.

Glavne značilnosti monterja:

● namesto binarnih kod jezik uporablja simbolna imena - mnemotehnika. Na primer za ukaz za dodajanje (

) se uporablja mnemotehnika

Odštevanja (

množenje (

Divizije (

itd. Simbolična imena se uporabljajo tudi za naslavljanje pomnilniških celic. Za programiranje v zbirnem jeziku morate namesto binarnih kod in naslovov poznati samo simbolna imena, ki jih asembler prevede v binarne kode;

vsaka izjava ustreza en strojni ukaz(koda), kar pomeni, da obstaja ujemanje ena proti ena med strojnimi navodili in operaterji v programu v zbirnem jeziku;

● jezik omogoča dostop na vse predmete in ekipe. Jeziki na visoki ravni nimajo te sposobnosti. Na primer, zbirni jezik vam omogoča, da preverite bit registra zastavic in jezik na visoki ravni (npr.

) nima te zmožnosti. Upoštevajte, da jeziki za sistemsko programiranje (na primer C) pogosto zasedajo vmesni položaj. Po dostopnosti so bližje zbirnemu jeziku, vendar imajo sintakso visokonivojskega jezika;

● zbirni jezik ni univerzalni jezik. Vsaka posebna skupina mikroprocesorjev ima svoj asembler. Jeziki na visoki ravni nimajo te pomanjkljivosti.

Za razliko od visokonivojskih jezikov pisanje in odpravljanje napak v programu v zbirnem jeziku zahteva veliko časa. Kljub temu je zbirni jezik postal široko uporabo zaradi naslednjih okoliščin:

● Program, napisan v zbirnem jeziku, je veliko manjši in veliko hitrejši od programa, napisanega v jeziku visoke ravni. Za nekatere aplikacije imajo ti indikatorji primarno vlogo, na primer številni sistemski programi (vključno s prevajalniki), programi v kreditnih karticah, mobilni telefon, gonilniki naprav itd.;

● nekateri postopki zahtevajo popoln dostop na strojno opremo, kar običajno ni mogoče v jeziku na visoki ravni. Ta primer vključuje prekinitve in upravljalnike prekinitev operacijski sistemi, kot tudi krmilniki naprav v vgrajenih sistemih, ki delujejo v realnem času.

V večini programov je le majhen odstotek celotne kode odgovoren za velik odstotek časa izvajanja programa. Običajno je 1 % programa odgovoren za 50 % časa izvajanja, 10 % programa pa za 90 % časa izvajanja. Zato se za pisanje določenega programa v realnih pogojih uporabljata asembler in eden od jezikov na visoki ravni.

Oblika operatorja v zbirnem jeziku.

Program v zbirnem jeziku je seznam ukazov (izjav, stavkov), od katerih vsak zavzema posebno vrstico in vsebuje štiri polja: polje oznake, polje operacije, polje operanda in polje komentarja. Vsako polje ima ločen stolpec.

Polje oznake.

Polju oznake je dodeljen stolpec 1. Oznaka je simbolično ime ali identifikator, naslovi spomin. Potrebno je, da lahko:

● narediti pogojni ali brezpogojni prehod na ukaz;

● pridobite dostop do mesta, kjer so shranjeni podatki.

Take izjave so označene. Za označevanje imena se uporabljajo (velike) črke angleške abecede in številke. Ime se mora začeti s črko in končati z dvopičjem. Oznako dvopičja lahko zapišemo v ločeno vrstico, opcode pa lahko zapišemo v naslednjo vrstico v stolpcu 2, kar poenostavi delo prevajalnika. Odsotnost dvopičja onemogoča razlikovanje med oznako in opcode, če sta v ločenih vrsticah.

V nekaterih različicah zbirnega jezika so dvopičja postavljena le za oznakami navodil, ne za oznakami podatkov, dolžina oznake pa je lahko omejena na 6 ali 8 znakov.

Polje oznake ne sme vsebovati istih imen, saj je oznaka povezana z naslovi ukazov. Če med izvajanjem programa ni treba priklicati ukaza ali podatkov iz pomnilnika, ostane polje oznake prazno.

Polje kode transakcije.

To polje vsebuje ukaz mnemonic ali psevdo-ukaz (glejte spodaj). Mnemonično kodo ukaza izberejo razvijalci jezika. V zbirnem jeziku

mnemonika, izbrana za nalaganje registra iz pomnilnika

), in za shranjevanje vsebine registra v pomnilnik - mnemotehnika

). V zbirnih jezikih

lahko uporabite isto ime za obe operaciji

Če je izbira mnemoničnih imen lahko poljubna, potem je potreba po uporabi dveh strojnih ukazov posledica arhitekture procesorja

Mnemotehnika registra je odvisna tudi od različice asemblerja (tabela 5.2.1).

Polje operanda.

Tukaj se nahaja Dodatne informacije potrebno za izvedbo operacije. V polju operandov za skočne ukaze je označen naslov, kamor želite skočiti, ter naslovi in ​​registri, ki so operandi za strojni ukaz. Tukaj so na primer operandi, ki jih je mogoče uporabiti za 8-bitne procesorje

● številčni podatki,

predstavljeni v različnih številskih sistemih. Za označevanje uporabljenega številskega sistema konstanti sledi eden od latinske črke: IN,

V skladu s tem so binarni, osmiški, šestnajstiški, decimalni številski sistemi (

morda ne bodo posneti). Če je prva številka šestnajstiškega števila A, B, C,

Nato se spredaj doda nepomembna 0 (ničla);

● kode mikroprocesorskih notranjih registrov in pomnilniških celic

M (viri ali prejemniki informacij) v obliki črk A, B, C,

M ali njihovi naslovi v poljubnem številskem sistemu (na primer 10V - registrski naslov

v dvojiškem sistemu);

● identifikatorji,

za registrirane pare letal,

Prve črke B

H; za par akumulatorja in registra funkcij -

; za programski števec -

; za kazalec sklada -

● oznake, ki označujejo naslove operandov ali naslednjih navodil v pogojniku

(ko je pogoj izpolnjen) in brezpogojni prehodi. Na primer, operand M1 v ukazu

pomeni potrebo po brezpogojnem prehodu na ukaz, katerega naslov v polju oznake je označen z identifikatorjem M1;

● izrazi,

ki so zgrajeni s povezovanjem zgoraj obravnavanih podatkov z uporabo aritmetičnih in logičnih operatorjev. Upoštevajte, da je način rezerviranja podatkovnega prostora odvisen od različice jezika. Razvijalci zbirnih jezikov za

Opredelite besedo) in pozneje uveden Alternativna možnost.

ki je bil od samega začetka v jeziku za procesorje

V jezikovni različici

rabljeno

definirajte konstanto).

Procesorji obdelujejo operande različnih dolžin. Da bi ga definirali, so razvijalci asemblerjev sprejeli različne odločitve, na primer:

II registri različnih dolžin imajo različna imena: EAX - za namestitev 32-bitnih operandov (tip

); AX - za 16-bitno (tip

in AN - za 8-bitni (tip

● za procesorje

vsaki operacijski kodi so dodane pripone: pripona

Za vrsto

; pripona ".B" za vrsto

za operande različnih dolžin se uporabljajo različne opkode, na primer za nalaganje bajta, polbesede (

) in besede v 64-bitnem registru uporabljajo opcijske kode

oz.

Polje za komentarje.

V tem polju so razlage o dejanjih programa. Komentarji ne vplivajo na delovanje programa in so namenjeni osebi. Morda bodo potrebni za spremembo programa, ki je brez takšnih komentarjev morda popolnoma nerazumljiv celo izkušenim programerjem. Komentar se začne z znakom in se uporablja za razlago in dokumentiranje programov. Začetni znak komentarja je lahko:

● podpičje (;) v jezikih za procesorje podjetja

Klicaj(!) v jezikih za

Pred vsako ločeno vrstico, rezervirano za komentar, je začetni znak.

Psevdo ukazi (direktive).

V zbirnem jeziku lahko ločimo dve glavni vrsti ukazov:

osnovni navodila, ki so enakovredna strojni kodi procesorja. Ti ukazi izvajajo vso obdelavo, ki jo nudi program;

psevdoukazi oz direktive, zasnovan tako, da služi procesu prevajanja programa v jezik kodnih kombinacij. Kot primer v tabeli. 5.2.2 prikazuje nekaj psevdoukazov iz as-sestavljalnika

za družino

.

Pri programiranju obstajajo situacije, ko je treba v skladu z algoritmom večkrat ponoviti isto verigo ukazov. Če želite izstopiti iz te situacije, lahko:

● napišite želeno zaporedje ukazov, kadar koli se pojavi. Ta pristop vodi do povečanja obsega programa;

● uredite to zaporedje v proceduro (podprogram) in jo po potrebi pokličite. Takšen izhod ima svoje slabosti: vsakič je treba izvesti ukaz za klic posebne procedure in povratni ukaz, ki lahko s kratkim in pogosto uporabljenim zaporedjem zelo zmanjša hitrost programa.

Najbolj preprost in učinkovita metoda ponavljajoče se ponavljanje verige ukazov je uporaba makro, ki si ga lahko predstavljamo kot psevdoukaz, zasnovan za ponovno prevajanje skupine ukazov, ki se pogosto pojavljajo v programu.

Za makro ali makro navodilo so značilni trije vidiki: definicija makra, inverzija makra in razširitev makra.

makro definicija

To je oznaka za večkrat ponovljeno zaporedje programskih ukazov, ki se uporablja za sklicevanja v besedilu programa.

Makro ima naslednjo strukturo:

Seznam izrazov; makro definicija

Zgornja struktura definicije makra je sestavljena iz treh delov:

● glava

makro, ki vsebuje ime

Psevdo ukaz

in nabor parametrov;

● pikčasto telo makro;

● ekipa

matura

makro definicije.

Nabor parametrov makra vsebuje seznam vseh parametrov, podanih v polju operanda za izbrano skupino ukazov. Če so ti parametri podani prej v programu, jih je mogoče izpustiti v glavi definicije makra.

Za ponovno sestavljanje izbrane skupine navodil se uporablja klic, sestavljen iz imena

makro in seznam parametrov z drugimi vrednostmi.

Ko sestavljalnik med prevajanjem naleti na definicijo makra, jo shrani v tabelo z definicijami makra. S poznejšimi pojavitvami v programu imena (

) makra, ga sestavljalnik nadomesti s telesom makra.

Pokliče se uporaba imena makra kot opcijske kode makroobrat(makro klic) in njegovo zamenjavo s telesom makra - makro širitev.

Če je program predstavljen kot zaporedje znakov (črke, številke, presledki, ločila in znaki za premik v novo vrstico), potem razširitev makra sestoji iz zamenjave nekaterih nizov iz tega zaporedja z drugimi nizi.

Makro razširitev se pojavi med postopkom sestavljanja, ne med izvajanjem programa. Dodeljeni so načini za manipulacijo nizov znakov makro orodja.

Postopek montaže je izveden v dveh prehodih:

● Pri prvem prehodu se ohranijo vse definicije makrov in razširijo klici makrov. V tem primeru se izvorni program prebere in pretvori v program, v katerem so odstranjene vse definicije makra, vsak klic makra pa je nadomeščen s telesom makra;

● Drugi prehod obdela prejeti program brez makrov.

Makri s parametri.

Za delo s ponavljajočimi se zaporedji ukazov, katerih parametri lahko zavzamejo različne vrednosti, so na voljo definicije makrov:

● z dejansko parametri, ki so postavljeni v polje operanda klica makra;

● z formalno parametri. Med razširitvijo makra se vsak formalni parameter, ki se pojavi v telesu makra, nadomesti z ustreznim dejanskim parametrom.

z uporabo makrov s parametri.

Program 1 prikazuje dve podobni zaporedji ukazov, ki se razlikujeta po tem, da prvi zamenja P in

In drugo

Program 2 vključuje makro z dvema formalnima parametroma P1 in P2. Med razširitvijo makra se vsak znak P1 v telesu makra nadomesti s prvim dejanskim parametrom (P,

), simbol P2 pa se nadomesti z drugim dejanskim parametrom (

) iz programa št. 1. V makro klicu

program 2 je označen: P,

Prvi dejanski parameter,

Drugi dejanski parameter.

Program 1

Program 2

MOV EBX,Q MOV EAX,Pl

MOV Q,EAX MOV EBX,P2

MOV P,EBX MOV P2,EAX

Razširjene zmogljivosti.

Razmislite o nekaterih naprednih funkcijah jezika

Če je makro, ki vsebuje navodilo za pogojno razvejanje in oznako za skok, poklican dvakrat ali večkrat, bo oznaka podvojena (težava podvajanja oznake), kar bo povzročilo napako. Zato vsakemu klicu (programer) dodeli ločeno oznako kot parameter. V jeziku

oznaka je razglašena za lokalno (

) in zahvaljujoč naprednim funkcijam sestavljalnik samodejno ustvari drugačno oznako vsakič, ko je makro razširjen.

omogoča definiranje makrov znotraj drugih makrov. Ta napredna funkcija je zelo uporabna v kombinaciji s pogojnim povezovanjem programov. Razmislite

IF WORDSIZE GT 16 M2 MACRO

Makro M2 je mogoče definirati v obeh delih izjave

Vendar pa je definicija odvisna od tega, ali se program sestavlja na 16-bitnem ali 32-bitnem procesorju. Če M1 ni poklican, potem makro M2 sploh ne bo definiran.

Druga napredna funkcija je, da lahko makri kličejo druge makre, vključno s samim seboj - rekurzivno klic. V slednjem primeru mora makro, da bi se izognil neskončni zanki, sam sebi posredovati parameter, ki se spremeni z vsako razširitvijo in tudi preverite ta parameter in konča rekurzijo, ko parameter doseže določeno vrednost.

O uporabi makrov v asemblerju.

Pri uporabi makrov mora biti sestavljalnik sposoben izvajati dve funkciji: shrani definicije makrov in razširi makro klice.

Shranjevanje definicij makrov.

Vsa imena makrov so shranjena v tabeli. Vsako ime spremlja kazalec na ustrezni makro, tako da ga je mogoče po potrebi priklicati. Nekateri sestavljalniki imajo ločeno tabelo za imena makrov, drugi imajo skupno tabelo, v kateri so poleg imen makrov vsi strojni ukazi in direktive.

Ko med sestavljanjem naletite na makro ustvarjeno:

nov element tabele z imenom makra, številom parametrov in kazalcem na drugo tabelo definicij makra, kjer bo shranjeno telo makra;

● seznam formalno parametri.

Telo makra, ki je preprosto niz znakov, se nato prebere in shrani v tabeli definicij makra. Formalni parametri, ki se pojavljajo v telesu zanke, so označeni poseben značaj.

Notranja predstavitev makra

iz zgornjega primera za program 2 (str. 244) je:

MOV EAX, MOV EBX, MOV MOV &

kjer se podpičje uporablja kot znak za vrnitev v začetni začetek, ampersand & pa kot formalni znak parametra.

Makro klicna razširitev.

Kadar koli med sestavljanjem naletite na definicijo makra, je shranjena v tabeli makra. Ko je makro poklican, sestavljalnik začasno prekine branje vhodnih podatkov iz vhodne naprave in začne brati shranjeno telo makra. Formalni parametri, ekstrahirani iz telesa makra, so nadomeščeni z dejanskimi parametri in zagotovljeni s klicem. Znak & pred parametri omogoča asemblerju, da jih prepozna.

Čeprav obstaja veliko različic asemblerja, imajo postopki sestavljanja skupne lastnosti in so si v mnogih pogledih podobni. Spodaj je obravnavano delo dvohodnega monterja.

Dvohodni sestavljalnik.

Program je sestavljen iz številnih stavkov. Zato se zdi, da je med sestavljanjem mogoče uporabiti naslednje zaporedje dejanj:

● prevesti v strojni jezik;

● prenesti prejeto strojno kodo v datoteko, ustrezen del seznama pa v drugo datoteko;

● ponavljajte zgornje postopke, dokler ni predvajan celoten program.

Vendar ta pristop ni učinkovit. Primer je tako imenovana težava vodilna povezava.Če je prvi stavek skok na stavek P na samem koncu programa, ga asembler ne more prevesti. Najprej mora določiti naslov operaterja P, za to pa je potrebno prebrati celoten program. Pokliče se vsako popolno branje izvirnega programa prehod. Pokažimo, kako lahko z dvema prehodoma rešimo problem referenc naprej:

ob prvem prehodu zbirati in shrani vse definicije simbolov (vključno z oznakami) v tabelo, pri drugem prehodu pa preberi in sestavi vsak operator. Ta metoda je relativno preprosta, vendar drugi prehod skozi izvirni program zahteva dodaten V/I čas;

● ob prvem prehodu, Pretvorba program v vmesno obliko in shrani v tabelo, drugi prehod pa se izvede ne po izvirnem programu, temveč po tabeli. Ta način sestavljanja prihrani čas, saj se pri drugem prehodu ne izvajajo nobene V/I operacije.

Prvi prehod.

Namen prvega prehoda- sestavite tabelo simbolov. Kot je navedeno zgoraj, je drugi cilj prvega prehoda shraniti vse definicije makrov in razširiti klice, ko se pojavijo. Zato se definicija znakov in razširitev makra zgodita v istem prehodu. Simbol je lahko bodisi etiketa, oz pomen, ki mu je dodeljeno specifično ime z uporabo direktive -you:

;Vrednost - velikost medpomnilnika

Z dajanjem pomena simbolnim imenom v polju oznake ukaza asembler v bistvu nastavi naslove, ki jih bo imelo vsako navodilo med izvajanjem programa. Če želite to narediti, sestavljalec med postopkom sestavljanja shrani števec naslovov navodil(

) kot posebna spremenljivka. Na začetku prvega prehoda je vrednost posebne spremenljivke nastavljena na 0 in se po vsakem obdelanem ukazu poveča za dolžino tega ukaza. Kot primer v tabeli. 5.2.3 prikazuje delček programa, ki prikazuje dolžino ukazov in vrednosti števca. Tabele se ustvarijo med prvim prehodom imena simbolov, direktive in kode delovanja, in če je potrebno dobesedno tabela. Literal je konstanta, za katero asembler samodejno rezervira pomnilnik. Takoj opazimo, da sodobni procesorji vsebujejo navodila z neposrednimi naslovi, zato njihovi sestavljalci ne podpirajo literalov.

Tabela simbolov

vsebuje en element za vsako ime (tabela 5.2.4). Vsak element tabele simbolov vsebuje samo ime (ali kazalec nanj), svojo številčno vrednost in včasih nekaj dodatnih informacij, ki lahko vključujejo:

● dolžina podatkovnega polja, povezanega s simbolom;

● biti za ponovno preslikavo pomnilnika (ki kažejo, ali se vrednost simbola spremeni, če je program naložen na drugem naslovu, kot ga je predvidel asembler);

● informacije o tem, ali je do simbola mogoče dostopati izven postopka.

Simbolična imena so oznake. Določite jih lahko z operatorji (npr.

Tabela direktiv.

Ta tabela navaja vse direktive ali psevdoukaze, ki se pojavijo pri sestavljanju programa.

Kodna tabela operacij.

Za vsako operacijsko kodo ima tabela ločene stolpce: oznaka operacijske kode, operand 1, operand 2, šestnajstiška vrednost operacijske kode, dolžina ukaza in tip ukaza (tabela 5.2.5). Kode operacij so razdeljene v skupine glede na število in vrsto operandov. Tip ukaza določa številko skupine in podaja proceduro, ki se kliče za obdelavo vseh ukazov v tej skupini.

Drugi prehod.

Namen drugega prehoda- izdelava objektnega programa in tiskanje, če je potrebno, sestavnega protokola; izhodne informacije, ki jih povezovalnik potrebuje za povezovanje postopkov, ki so bili sestavljeni ob različnih časih v eno izvršljivo datoteko.

V drugem prehodu (kot v prvem) se vrstice, ki vsebujejo stavke, preberejo in obdelajo ena za drugo. Izvirni operator in iz njega izpeljan izhod v šestnajstiški obliki predmet kodo je mogoče natisniti ali shraniti v medpomnilnik za kasnejše tiskanje. Po ponastavitvi števca naslovov ukaza se ukaz pokliče naslednja izjava.

Izvirni program lahko vsebuje napake, na primer:

dani simbol ni definiran ali definiran večkrat;

● Operacijska koda je predstavljena z neveljavnim imenom (zaradi tipkarske napake), ni opremljena z dovolj operandov ali pa ima preveč operandov;

● brez operaterja

Nekateri sestavljalci lahko zaznajo nedefiniran simbol in ga zamenjajo. Vendar pa v večini primerov, ko je najden stavek z napako, sestavljalnik na zaslonu prikaže sporočilo o napaki in poskuša nadaljevati postopek sestavljanja.

Članki, posvečeni zbirnemu jeziku.




Vrh