Osnovne komponente zbirnega jezika in struktura ukazov. Format podatkov in struktura navodil zbirnega jezika. Predmet "Sistemsko programiranje"

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 v operacijskih sistemih ter krmilnike naprav v vgrajenih sistemih 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 ena od latiničnih črk: B,

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.

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 periferne 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 uporaba tega registra obvezna;

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 pisma: 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

Struktura ukazov zbirnega jezika Programiranje na ravni strojnih ukazov je najnižja raven, na kateri je možno računalniško programiranje. Sistem strojnih navodil mora zadostovati za izvajanje zahtevanih dejanj z izdajanjem navodil strojni opremi stroja. Vsak strojni ukaz je sestavljen iz dveh delov: operacijskega dela, ki definira "kaj narediti" in operanda, ki definira procesne objekte, to je "kaj narediti". Strojni ukaz mikroprocesorja, napisan v zbirnem jeziku, je ena vrstica in ima naslednjo obliko: operand(i) ukaza oznake/direktive; komentarji Oznaka, ukaz/naredba in operand so ločeni z vsaj enim presledkom ali tabulatorjem. Operandi ukazov so ločeni z vejicami.

Struktura ukaza zbirnega jezika Instrukcija zbirnega jezika pove prevajalniku, katero dejanje naj izvede mikroprocesor. Direktive za sestavljanje so parametri, podani v besedilu programa, ki vplivajo na proces sestavljanja ali lastnosti izhodne datoteke. Operand podaja začetno vrednost podatkov (v podatkovnem segmentu) ali elemente, na katere mora ukaz vplivati ​​(v kodnem segmentu). Navodilo ima lahko enega ali dva operanda ali pa nima operandov. Število operandov je implicitno določeno s kodo ukaza. Če je treba ukaz ali direktivo nadaljevati v naslednji vrstici, se uporabi poševnica nazaj: "" . Privzeto asembler ne razlikuje med velikimi in malimi črkami v ukazih in direktivah. Primeri direktiv in ukazov Count db 1 ; Ime, direktiva, en operand mov eax, 0 ; Ukaz, dva operanda

Identifikatorji so zaporedja veljavnih znakov, ki se uporabljajo za označevanje imen spremenljivk in imen oznak. Identifikator je lahko sestavljen iz enega ali več naslednjih znakov: vse črke latinske abecede; številke od 0 do 9; posebni znaki: _, @, $, ? . Kot prvi znak oznake lahko uporabite piko. Rezerviranih imen zbirnikov (direktiv, operaterjev, imen ukazov) ni mogoče uporabiti kot identifikatorje. Prvi znak identifikatorja mora biti črka ali poseben znak. Največja dolžina identifikator 255 znakov, vendar prevajalec sprejme prvih 32, ostalo prezre. Vse oznake, ki so zapisane v vrstici, ki ne vsebuje direktive za sestavljalnik, se morajo končati z dvopičjem ":". Oznaki, ukazu (direktivi) in operandu ni treba začeti na nobenem določenem mestu v nizu. Priporočljivo jih je zapisati v stolpec za večjo berljivost programa.

Oznake Vse oznake, ki so zapisane v vrstici, ki ne vsebuje direktive za sestavljalnik, se morajo končati z dvopičjem ":". Oznaki, ukazu (direktivi) in operandu ni treba začeti na nobenem določenem mestu v nizu. Priporočljivo jih je zapisati v stolpec za večjo berljivost programa.

Komentarji Uporaba komentarjev v programu izboljša njegovo jasnost, zlasti kadar je namen nabora navodil nejasen. Komentarji se začnejo v kateri koli vrstici izvornega modula s podpičjem (;). Vsi znaki desno od "; ' do konca vrstice so komentarji. Komentar lahko vsebuje poljubne natisljive znake, vključno s "presledkom". Komentar lahko zajema celotno vrstico ali sledi ukazu v isti vrstici.

Struktura programa v zbirnem jeziku Program v zbirnem jeziku je lahko sestavljen iz več delov, imenovanih moduli, od katerih lahko vsak 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 programskih segmentih, podatki in segmenti sklada, deklarirani z uporabo ustreznih direktiv.

Modeli pomnilnika Preden deklarirate segmente, morate z direktivo podati model pomnilnika. MODEL modifikator memory_model, calling_convention, OS_type, stack_parameter Pomnilniški modeli osnovnega zbirnega jezika: pomnilniški model Naslavljanje kode Naslavljanje podatkov operacijski sistem Prepletanje kode in podatkov Drobno BLIZU MS-DOS Dovoljeno MAJHNO BLIZU MS-DOS, Windows Ne SREDNJE DALEČ BLIZU MS-DOS, Windows Ne KOMPAKTNO BLIZU DALEČ MS-DOS, Windows Ne VELIKO DALEČ MS-DOS, Windows Ne OGROMNO DALEČ MS-DOS, Windows Ne BLIZU Windows 2000, Windows XP, dovoljeno Windows BLIZU NT,

Modeli pomnilnika Majhen model deluje samo v 16-bitnih aplikacijah MS-DOS. V tem modelu so vsi podatki in koda v enem fizičnem segmentu. Velikost programske datoteke v tem primeru ne presega 64 KB. Majhen model podpira en segment kode in en segment podatkov. Podatki in koda pri uporabi tega modela so naslovljeni kot blizu (blizu). Srednji model podpira več kodnih segmentov in en podatkovni segment, pri čemer se vse povezave v kodnih segmentih privzeto štejejo za daleč (daleč), povezave v podatkovnem segmentu pa za blizu (blizu). Kompaktni model podpira več podatkovnih segmentov, ki uporabljajo oddaljeno naslavljanje podatkov (daleč), in en segment kode, ki uporablja bližnje podatkovno naslavljanje (bližnje). Velik model podpira več segmentov kode in več segmentov podatkov. Privzeto se vse kode in sklicevanja na podatke upoštevajo daleč. Ogromen model je skoraj enakovreden modelu z velikim pomnilnikom.

Modeli pomnilnika Ploski model predvideva nesegmentirano konfiguracijo programa in se uporablja samo v 32-bitnih operacijskih sistemih. Ta model je podoben majhnemu modelu, saj so podatki in koda v istem 32-bitnem segmentu. Razviti program za ploski model pred direktivo. model stanovanje mora postaviti eno od direktiv: . 386, . 486, . 586 oz. 686. Izbira direktive o izbiri procesorja določa nabor ukazov, ki so na voljo pri pisanju programov. Črka p za direktivo o izbiri procesorja pomeni zaščiten način delovanja. Naslavljanje podatkov in kod je blizu, saj so vsi naslovi in ​​kazalci 32-bitni.

spominski modeli. Modifikator MODEL memory_model, calling_convention, OS_type, stack_parameter Parameter modifikatorja se uporablja za definiranje tipov segmentov in ima lahko naslednje vrednosti: uporabite 16 (segmenti izbranega modela se uporabljajo kot 16-bitni) uporabite 32 (uporabljajo se segmenti izbranega modela kot 32-bitni). Parameter calling_convention se uporablja za določanje, kako se parametri posredujejo pri klicanju procedure iz drugih jezikov, vključno z jeziki na visoki ravni (C++, Pascal). Parameter ima lahko naslednje vrednosti: C, BASIC, FORTRAN, PASCAL, SYSCALL, STDCALL.

spominski modeli. Modifikator MODEL memory_model, calling_convention, OS_type, stack_parameter Parameter OS_type je privzeto OS_DOS in na ta trenutek to je edina podprta vrednost za ta parameter. Parameter stack_param je nastavljen na: NEARSTACK (register SS je enak DS, področja podatkov in sklada so v istem fizičnem segmentu) FARSTACK (register SS ni enak DS, območja podatkov in sklada so v različnih fizičnih segmentih). Privzeta vrednost je NEARSTACK.

Primer programa "ničesar". 686 P. MODEL STANOVANJA, STDCALL. PODATKI. CODE START: RET END START RET - mikroprocesorski ukaz. Zagotavlja pravilno prekinitev programa. Preostali del programa je povezan z delovanjem prevajalnika. . 686 P - dovoljeni so ukazi zaščitenega načina Pentium 6 (Pentium II). Ta direktiva izbere podprt niz ukazov asemblerja z določitvijo modela procesorja. . MODEL FLAT, stdcall - ploščati pomnilniški model. Ta model pomnilnika se uporablja v operacijskem sistemu Windows. stdcall je konvencija za klicanje postopkov.

Primer programa "ničesar". 686 P. MODEL STANOVANJA, STDCALL. PODATKI. KODA START: RET END START . PODATKI - segment programa, ki vsebuje podatke. Ta program ne uporablja sklada, zato segmentirajte. STACK manjka. . KODA - segment programa, ki vsebuje kodo. START - oznaka. END START - konec programa in sporočilo prevajalniku, da je treba program zagnati z oznake START. Vsak program mora vsebovati direktivo END, ki označuje konec izvorna koda programi. Vse vrstice, ki sledijo direktivi END, so prezrte.Oznaka za direktivo END pove prevajalniku ime glavnega modula, iz katerega se začne izvajanje programa. Če program vsebuje en modul, lahko oznako za direktivo END izpustite.

Prevajalniki zbirnih jezikov Prevajalnik je program oz tehnična sredstva A, ki pretvori program v enem od programskih jezikov v program v ciljnem jeziku, ki se imenuje objektna koda. Poleg podpore mnemotehniki strojnih navodil ima vsak prevajalnik svoj nabor direktiv in makrov, ki so pogosto nezdružljivi s čim drugim. Glavne vrste prevajalnikov zbirnih jezikov so: MASM (Microsoft Assembler), TASM (Borland Turbo Assembler), FASM (Flat Assembler) - prosto distribuiran večprehodni sestavljalnik, ki ga je napisal Tomasz Gryshtar (poljščina), NASM (Netwide Assembler) - a brezplačni sestavljalnik za arhitekturo Intel x 86 je ustvaril Simon Tatham z Julianom Hallom, trenutno pa ga razvija majhna razvojna ekipa pri Source. Kovati. mreža.

Src="https://present5.com/presentation/-29367016_63610977/image-15.jpg" alt="Prevajanje programa v Microsoft Visual Studio 2005 1) Ustvarite projekt tako, da izberete Datoteka->Novo->Projekt meni In"> Трансляция программы в Microsoft Visual Studio 2005 1) Создать проект, выбрав меню File->New->Project и указав имя проекта (hello. prj) и тип проекта: Win 32 Project. В дополнительных опциях мастера проекта указать “Empty Project”.!}

Src="https://present5.com/presentation/-29367016_63610977/image-16.jpg" alt="Prevajanje programa v Microsoft Visual Studio 2005 2) V drevo projekta (Pogled->Raziskovalec rešitev) dodajte"> Трансляция программы в Microsoft Visual Studio 2005 2) В дереве проекта (View->Solution Explorer) добавить файл, в котором будет содержаться текст программы: Source. Files->Add->New. Item.!}

Prevod programa v Microsoft Visual Studio 2005 3) Izberite vrsto datoteke Code C++, vendar določite ime s končnico. asm:

Prevod programa v Microsoft Visual Studio 2005 5) Nastavite možnosti prevajalnika. Izberite desni gumb v meniju projektne datoteke Pravila gradnje po meri…

Prevod programa v Microsoft Visual Studio 2005 in v oknu, ki se prikaže, izberite Microsoft Macro Assembler.

Prevod programa v Microsoft Visual Studio 2005 Preverite z desnim gumbom v datoteki hello. asm drevesa projekta v meniju Lastnosti in nastavite Splošno->Orodje: Microsoft Macro Assembler.

Src="https://present5.com/presentation/-29367016_63610977/image-22.jpg" alt="Prevajanje programa v Microsoft Visual Studio 2005 6) Prevedite datoteko tako, da izberete Build->Build hello.prj ."> Трансляция программы в Microsoft Visual Studio 2005 6) Откомпилировать файл, выбрав Build->Build hello. prj. 7) Запустить программу, нажав F 5 или выбрав меню Debug->Start Debugging.!}

Programiranje v OS Windows Programiranje v OS Windows temelji na uporabi API funkcij (Application Program Interface, t. i. programski aplikacijski vmesnik). Njihovo število doseže 2000. Program za Windows je v veliki meri sestavljen iz takih klicev. Vse interakcije z zunanje naprave in viri operacijskega sistema se praviloma pojavljajo prek takšnih funkcij. operacijska soba sistem Windows uporablja model ploščatega pomnilnika. Naslov katere koli pomnilniške lokacije bo določen z vsebino enega 32-bitnega registra. Obstajajo 3 vrste programskih struktur za Windows: pogovorno okno (glavno okno je pogovorno okno), konzolna ali struktura brez oken, klasična struktura (okno, okvir).

Pokliči Funkcije sistema Windows API V datoteki pomoči je katera koli funkcija API predstavljena kot tip ime_funkcije (FA 1, FA 2, FA 3) Tip – vrsta vrnjene vrednosti; FAX – seznam formalnih argumentov v njihovem vrstnem redu, na primer int sporočilo. Polje (HWND h. Wnd, LPCTSTR lp. Besedilo, LPCTSTR lp. Napis, UINT u. Vrsta); Ta funkcija prikaže okno s sporočilom in gumbom(-i) za izhod. Pomen parametrov: h. Wnd - ročaj okna, v katerem se prikaže okno s sporočilom, lp. Besedilo - besedilo, ki se bo pojavilo v oknu, lp. Napis - besedilo v naslovu okna, u. Vrsta - vrsta okna, zlasti lahko določite število gumbov za izhod.

Klicanje funkcij Windows API int Message. Polje (HWND h. Wnd, LPCTSTR lp. Besedilo, LPCTSTR lp. Napis, UINT u. Vrsta); Skoraj vsi parametri funkcije API so pravzaprav 32-bitna cela števila: HWND je 32-bitno celo število, LPCTSTR je 32-bitni kazalec niza, UINT je 32-bitno celo število. Pripona "A" je pogosto dodana imenu funkcij za skok na novejše različice funkcij.

Klicanje funkcij Windows API int Message. Polje (HWND h. Wnd, LPCTSTR lp. Besedilo, LPCTSTR lp. Napis, UINT u. Vrsta); Ko uporabljate MASM, morate na koncu imena dodati @N N - število bajtov, ki jih posredovani argumenti zasedajo v skladu. Za funkcije API-ja Win 32 je to število mogoče definirati kot število argumentov n krat 4 (bajti v vsakem argumentu): N=4*n. Za klic funkcije se uporabi ukaz CALL asemblerja. V tem primeru se vsi argumenti funkcije posredujejo prek sklada (ukaz PUSH). Smer podajanja argumenta: OD LEVE PROTI DESNI – SPODAJ GOR. Argument u bo najprej potisnjen na sklad. vrsta. Klic navedene funkcije bo izgledal takole: CALL Sporočilo. škatla. [e-pošta zaščitena]

Klicanje funkcij Windows API int Message. Polje (HWND h. Wnd, LPCTSTR lp. Besedilo, LPCTSTR lp. Napis, UINT u. Vrsta); Rezultat izvajanja katere koli funkcije API je običajno celo število, ki se vrne v registru EAX. Direktiva OFFSET je "odmik segmenta" ali, v izrazih jezika na visoki ravni, "kazalec" na začetek niza. Direktiva EQU, tako kot #define v C, definira konstanto. Direktiva EXTERN pove prevajalniku, da je funkcija ali identifikator zunaj modula.

Primer programa "Pozdravljeni vsi!" . 686 P. MODEL STANOVANJA, STDCALL. STACK 4096. DATA MB_OK EQU 0 STR 1 DB "Moj prvi program", 0 STR 2 DB "Pozdravljeni vsi!", 0 HW DD ? ZUNANJE sporočilo. škatla. [e-pošta zaščitena]: BLIZU. CODE START: PUSH MB_OK PUSH OFFSET STR 1 PUSH OFFSET STR 2 PUSH HW CALL Sporočilo. škatla. [e-pošta zaščitena] RET END START

Direktiva INVOKE Prevajalnik jezika MASM omogoča tudi poenostavitev klica funkcije z uporabo makro orodja - direktiva INVOKE: funkcija INVOKE, parameter1, parameter2, ... Klicu funkcije ni treba dodajati @16; parametri so zapisani natančno v vrstnem redu, kot so podani v opisu funkcije. prevajalski makri potisnejo parametre na sklad. če želite uporabiti direktivo INVOKE, morate imeti opis prototipa funkcije z uporabo direktive PROTO v obliki: Sporočilo. škatla. A PROTO: DWORD, : DWORD

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 je 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)



Vrh