Struktura navodil zbirnega jezika vsebuje. Splošne značilnosti ukaznega sistema jezika Assembler za IBM-PC (osnovni nabor ukazov, osnovni načini naslavljanja operandov). Struktura programa v jeziku Assembler. programskih segmentih. prevzeti direktivo

Tema 1.4 Mnemotehnika programa Assembler. Struktura in formati ukazov. Vrste naslavljanja. Nabor navodil za mikroprocesor

načrt:

1 zbirni jezik. Osnovni pojmi

2 Simboli zbirnega jezika

3 Vrste zbirnih stavkov

4 Smernice za montažo

5 Nabor navodil za procesor

1 jazzbirni jezik. Osnovni pojmi

zbirni jezikje 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.

Program v zbirnem jeziku je zbirka blokov pomnilnika, imenovana spominske segmente. 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:

1) ukaze ali navodila ki so simbolni analogi strojnih ukazov. Med procesom prevajanja se navodila za sestavljanje pretvorijo v ustrezne ukaze nabora ukazov mikroprocesorja;

2) makri -stavki besedila programa, ki so na določen način formalizirani, se med oddajo nadomestijo z drugimi stavki;

3) direktive,ki so navodila asemblerskemu prevajalcu za izvedbo nekaterih dejanj. Direktive nimajo primerkov v strojni predstavitvi;

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

­ Struktura programa skupščine. sintaksa asemblerja.

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, kot je ta - sintaksni diagrami in razširjene oblike Backus-Naur. Za praktično uporabo bolj udobno sintaksni diagrami. Na primer, sintakso stavkov zbirnega jezika je mogoče opisati z uporabo sintaksnih diagramov, prikazanih na naslednjih slikah 10, 11, 12.

Slika 10 - Format stavka sklopa


­ Slika 11 - Format direktiv

­ Slika 12 - 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;

­ delovna koda (COP) in direktiva - to so mnemonični simboli za ustrezen strojni ukaz, makro ukaz ali direktivo prevajalnika;

­ operandi -deli ukaza, makra ali direktive zbirnika, ki označujejo objekte, na katerih se izvajajo dejanja. Operandi asemblerja so opisani z izrazi s številskimi in besedilnimi konstantami, oznakami spremenljivk in identifikatorji z uporabo operacijskih znakov in nekaterih rezerviranih besed.

V pomoč so sintaktični diagrami poiščite in nato prehodite pot 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.

­ 2 Simboli zbirnega jezika

Dovoljeni znaki pri pisanju besedila programov so:

1) Vse pisma: A-Ž,a-z. V tem primeru se velike in male črke štejejo za enakovredne;

2) številke iz 0 prej 9 ;

3) znaki ? , @ , $ , _ , & ;

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

Sestavljalni stavki so sestavljeni iz žetoni, ki so sintaktično neločljiva zaporedja veljavnih jezikovnih znakov, ki so smiselni za prevajalca.

žetoni so:

1) identifikatorji - 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;

2) znakovni nizi - zaporedja znakov, zaprtih v enojni oz dvojni narekovaji;

3) cela števila v enem od naslednjih številskih sistemov : dvojiško, decimalno, šestnajstiško. Identifikacija številk pri pisanju v programih za montažo poteka po določenih pravilih:

4) decimalna števila ne zahtevajo dodatnih simbolov za njihovo identifikacijo, na primer 25 ali 139. Za identifikacijo v izvorni kodi programa binarna števila je treba po pisanju ničel in enic, vključenih v njihovo sestavo, postaviti latinico " b«, na primer 10010101 b.

5) šestnajstiška števila imajo več konvencij v svojem zapisu:

Prvič, sestavljeni so iz številk. 0...9 , male in velike črke latinske abecede a,b, c,d,e,f oz A,B,C,D,E,F.

Drugič, prevajalec ima lahko težave pri prepoznavanju šestnajstiških števil zaradi dejstva, da so lahko sestavljena samo iz števk 0...9 (na primer 190845) ali se začnejo s črko latinske abecede (na primer ef15). Da bi prevajalcu "razložili", da dani leksem ni decimalno število ali identifikator, mora programer šestnajstiško število posebej dodeliti. Če želite to narediti, na koncu zaporedja šestnajstiških števk, ki sestavljajo šestnajstiško število, napišite latinično črko " h". To je predpogoj. Če se šestnajstiško število začne s črko, je pred njim prva ničla: 0 ef15 h.

Skoraj vsak stavek vsebuje opis predmeta, na katerem ali s pomočjo katerega se izvaja neko dejanje. Ti predmeti se imenujejo operandov. Opredelimo jih lahko takole: operandov- to so objekti (nekatere vrednosti, registri ali pomnilniške celice), na katere vplivajo navodila ali direktive, ali pa so to objekti, ki definirajo ali izboljšajo delovanje navodil ali direktiv.

Možno je izvesti naslednjo klasifikacijo operandov:

­ stalni ali neposredni operandi;

­ naslovni operandi;

­ premaknjeni operandi;

števec naslovov;

­ register operand;

­ osnovni in indeksni operandi;

­ strukturni operandi;

zapisi.

Operandi so osnovne komponente, ki tvorijo del strojnega ukaza in označujejo objekte, na katerih se izvaja operacija. V splošnejšem primeru lahko operande vključimo kot komponente v bolj zapletene formacije, imenovane izrazi.

Izrazi so kombinacije operandov in operatorjev, obravnavanih kot celota. Rezultat vrednotenja izraza je lahko naslov neke pomnilniške celice ali neka konstantna (absolutna) vrednost.

­ 3 Vrste zbirnih stavkov

Naštejmo možne vrste stavki asemblerja in sintaktična pravila za oblikovanje asemblerskih izrazov:

­ aritmetični operatorji;

­ izmenski operaterji;

­ primerjalni operaterji;

­ logični operatorji;

­ operater indeksa;

­ operator preglasitve tipa;

­ operator redefinicije segmenta;

­ operator za poimenovanje tipa strukture;

­ operator za pridobitev segmentne komponente naslova izraza;

­ izraz offset get operator.

1 Smernice za montažo

­ Navodila za asembler so:

1) Direktive o segmentaciji. V prejšnji razpravi smo ugotovili vsa osnovna pravila za pisanje navodil in operandov v programu v zbirnem jeziku. Odprto ostaja vprašanje, kako pravilno oblikovati zaporedje ukazov, da jih lahko prevajalec obdela, mikroprocesor pa izvede.

Pri obravnavi arhitekture mikroprocesorja smo izvedeli, da ima šest segmentnih registrov, preko katerih lahko deluje hkrati:

­ z enim segmentom kode;

­ z enim segmentom sklada;

­ z enim podatkovnim segmentom;

­ s tremi dodatnimi segmenti podatkov.

Fizično je segment pomnilniško območje, ki ga zasedajo ukazi in (ali) podatki, katerih naslovi so izračunani glede na vrednost v ustreznem segmentnem registru. Sintaktični opis segmenta v asemblerju je konstrukcija, prikazana na sliki 13:


­ Slika 13 - Sintaktični opis segmenta v asemblerju

Pomembno je omeniti, da je funkcionalnost segmenta nekoliko širša od preproste razdelitve programa na bloke kode, podatkov in sklada. Segmentacija je del bolj splošnega mehanizma, povezanega z koncept modularnega programiranja. Vključuje poenotenje zasnove objektnih modulov, ki jih ustvari prevajalnik, vključno s tistimi iz različnih programskih jezikov. To vam omogoča kombiniranje programov, napisanih v različnih jezikih. Operandi v direktivi SEGMENT so namenjeni izvajanju različnih možnosti za takšno zvezo.

2) Direktive za nadzor kotacije. Navodila za nadzor kotacije so razdeljena v naslednje skupine:

­ splošne direktive o nadzoru kotacije;

­ izhodne direktive za vključitev seznama datotek;

­ izhodne direktive za pogojne sestavne bloke;

­ izhodne direktive za seznam makrov;

­ navodila za prikaz informacij o navzkrižnih sklicih v seznamu;

­ direktive za spremembo formata seznama.

2 Komplet navodil za procesor

Nabor ukazov procesorja je prikazan na sliki 14.

Razmislite o glavnih skupinah ukazov.

­ Slika 14 - Razvrstitev navodil za sestavljanje

Ukazi so:

1 Ukazi za prenos podatkov. Ta navodila zavzemajo zelo pomembno mesto v naboru navodil vsakega procesorja. Opravljajo naslednje bistvene funkcije:

­ shranjevanje vsebine notranjih registrov procesorja v pomnilnik;

­ kopiranje vsebine iz enega pomnilniškega področja v drugega;

­ pisanje na V/I naprave in branje iz V/I naprav.

V nekaterih procesorjih vse te funkcije izvaja en sam ukaz MOV (za prenose bajtov - MOVB ) vendar z različnimi metodami naslavljanja operandov.

V drugih procesorjih poleg navodil MOV obstaja še več ukazov za izvajanje naštetih funkcij. Ukazi za prenos podatkov vključujejo tudi ukaze za izmenjavo informacij (njihova oznaka temelji na besedi Menjava ). Mogoče je zagotoviti izmenjavo informacij med notranjimi registri, med dvema polovicama enega registra ( ZAMENJAVA ) ali med registrom in pomnilniško lokacijo.

2 Aritmetični ukazi. Aritmetična navodila obravnavajo kode operandov kot numerične binarne ali BCD kode. Te ukaze lahko razdelimo v pet glavnih skupin:

­ ukazi za operacije s fiksno točko (seštevanje, odštevanje, množenje, deljenje);

­ navodila za plavajočo vejico (seštevanje, odštevanje, množenje, deljenje);

­ ukazi za čiščenje;

­ ukazi za povečanje in zmanjšanje;

­ primerjalni ukaz.

3 Instrukcije s fiksno vejico delujejo s kodami v registrih procesorja ali v pomnilniku, kot bi delovale z običajnimi binarnimi kodami. Navodila s plavajočo vejico (pika) uporabljajo obliko predstavitve števila z eksponentom in mantiso (običajno te številke zavzamejo dve zaporedni pomnilniški lokaciji). V sodobnem zmogljivi procesorji nabor ukazov za plavajočo vejico ni omejen le na štiri aritmetične operacije, ampak vsebuje tudi številne druge bolj zapletene ukaze, na primer izračun trigonometričnih funkcij, logaritemskih funkcij, pa tudi kompleksne funkcije, potrebne pri obdelavi zvoka in slike.

4 Ukazi za brisanje so namenjeni zapisovanju ničelne kode v register ali pomnilniško celico. Te ukaze je mogoče nadomestiti z navodili za prenos brez kode, vendar so posebna jasna navodila običajno hitrejša od navodil za prenos.

5 Ukazi za inkrement (povečanje za eno) in dekrement

(znižanja za eno) so tudi zelo priročni. Načeloma bi jih lahko nadomestili z navodili za dodajanje ena ali odštevanje ena, vendar sta povečanje in zmanjšanje hitrejša od dodajanja in odštevanja. Ta navodila zahtevajo en vhodni operand, ki je tudi izhodni operand.

6 Primerjava navodil je za primerjavo dveh vhodnih operandov. Pravzaprav izračuna razliko teh dveh operandov, vendar ne oblikuje izhodnega operanda, temveč le spremeni bite v statusnem registru procesorja na podlagi rezultata tega odštevanja. Navodilo, ki sledi navodilu za primerjavo (običajno navodilo za skok), bo razčlenilo bite v statusnem registru procesorja in izvedlo dejanja na podlagi njihovih vrednosti. Nekateri procesorji nudijo navodila za verižno primerjavo dveh zaporedij operandov v pomnilniku.

7 Logični ukazi. Logična navodila izvajajo logične (bitne) operacije na operandih, to pomeni, da kode operanda ne obravnavajo kot eno število, temveč kot niz posameznih bitov. V tem se razlikujejo od aritmetična navodila. Logični ukazi izvajajo naslednje osnovne operacije:

­ logični IN, logični ALI, seštevanje po modulu 2 (XOR);

­ logični, aritmetični in ciklični premiki;

­ preverjanje bitov in operandov;

­ nastavitev in brisanje bitov (zastavic) statusnega registra procesorja ( PSW).

Logična navodila omogočajo bit za bitnim izračun osnovnih logičnih funkcij iz dveh vhodnih operandov. Poleg tega se operacija IN uporablja za prisilno brisanje danih bitov (eden od operandov je koda maske, v kateri so biti, ki zahtevajo brisanje, nastavljeni na nič). Operacija ALI se uporablja za vsiljevanje nastavljenih bitov (kot eden od operandov se uporablja koda maske, v kateri so biti, ki zahtevajo nastavitev na ena, enaki ena). Operacija XOR se uporablja za invertiranje danih bitov (kot eden od operandov se uporablja koda maske, v kateri so biti, ki jih je treba invertirati, nastavljeni na ena). Navodila zahtevajo dva vhodna operanda in tvorijo en izhodni operand.

8 Ukazi za premik vam omogočajo, da premaknete kodo operanda bit za bitom v desno (proti nižjim bitom) ali v levo (proti višjim bitom). Vrsta premika (logična, aritmetična ali ciklična) določa, kakšna bo nova vrednost najpomembnejšega bita (če je premaknjen v desno) ali najmanj pomembnega bita (če je premaknjen v levo), in tudi določa, ali je stara vrednost najpomembnejšega bit bo shranjen nekje (če ga premaknemo v levo) ali najmanj pomemben bit (če ga premaknemo v desno). Rotacijski premiki vam omogočajo premikanje bitov kode operanda v krogu (v smeri urinega kazalca pri premiku v desno ali v nasprotni smeri urinega kazalca pri premiku v levo). V tem primeru prestavni obroč lahko vključuje ali pa tudi ne nosi zastavico. Bit zastavice za prenos (če je uporabljen) je nastavljen na najpomembnejši bit za levo rotacijo in najmanj pomemben bit za desno rotacijo. V skladu s tem bo vrednost bita prenosne zastavice prepisana v najmanj pomemben bit pri levem cikličnem premiku in v najpomembnejši bit pri desnem cikličnem premiku.

9 Ukazi za skok. Ukazi za skok so zasnovani za organiziranje vseh vrst zank, vej, klicev podprogramov itd., kar pomeni, da motijo ​​​​zaporedni tok programa. Ta navodila zapišejo novo vrednost v register števca ukazov in s tem povzročijo, da procesor skoči na naslednji ukaz v vrstnem redu, ampak na kateri koli drug ukaz v programskem pomnilniku. Nekateri ukazi za skok vam omogočajo, da se vrnete na točko, s katere ste skočili, drugi pa ne. Če je zagotovljena vrnitev, so trenutni parametri procesorja shranjeni v skladu. Če vrnitev ni zagotovljena, se trenutni parametri procesorja ne shranijo.

Ukazi za skok brez vračanja so razdeljeni v dve skupini:

­ ukazi brezpogojnih skokov;

­ navodila za pogojni skok.

Ti ukazi uporabljajo besede Branch (veja) in Jump (skok).

Ukazi za brezpogojni skok povzročijo skok na nov naslov ne glede na vse. Lahko povzročijo skok na podano vrednost odmika (naprej ali nazaj) ali na podani pomnilniški naslov. Kot vhodni operand je navedena vrednost odmika ali nova vrednost naslova.

Ukazi za pogojni skok ne povzročijo vedno skoka, ampak le, ko so izpolnjeni navedeni pogoji. Takšni pogoji so običajno vrednosti zastavic v registru stanja procesorja ( PSW ). To pomeni, da je pogoj prehoda rezultat prejšnje operacije, ki spremeni vrednosti zastavic. Skupaj je lahko takšnih pogojev za skok od 4 do 16. Nekaj ​​primerov ukazov za pogojni skok:

­ skok, če je enak nič;

­ skok, če ni nič;

­ skoči, če pride do preliva;

­ skok, če ni preliva;

­ skok, če je večji od nič;

­ skok, če je manjši ali enak nič.

Če je prehodni pogoj izpolnjen, se v register števca ukazov naloži nova vrednost. Če pogoj skoka ni izpolnjen, se števec ukazov preprosto poveča, procesor pa izbere in izvede naslednji ukaz v zaporedju.

Posebej za preverjanje pogojev veje se uporablja primerjalno navodilo (CMP), ki je pred navodilom pogojnega skoka (ali celo več navodili pogojnega skoka). Toda zastavice lahko nastavi kateri koli drug ukaz, na primer ukaz za prenos podatkov, kateri koli aritmetični ali logični ukaz. Upoštevajte, da sami ukazi za skok ne spremenijo zastavic, kar vam le omogoča, da postavite več ukazov za skok enega za drugim.

Ukazi za prekinitev zavzemajo posebno mesto med ukazi za skok z vrnitvijo. Ta navodila zahtevajo številko prekinitve (naslov vektorja) kot vhodni operand.

Zaključek:

Zbirni jezik je simbolna predstavitev strojnega jezika. Zbirni jezik za vsako vrsto računalnika je drugačen. Program v zbirnem jeziku je zbirka blokov pomnilnika, imenovanih pomnilniški segmenti. Vsak segment vsebuje zbirko jezikovnih stavkov, od katerih vsak zaseda ločeno vrstico programske kode. Stavki sestavljanja so štiri vrste: ukazi ali navodila, makri, direktive, vrstice za komentarje.

Veljavni znaki pri pisanju besedila programov so vse latinične črke: A-Ž,a-z. V tem primeru se velike in male črke štejejo za enakovredne; figure iz 0 prej 9 ; znaki ? , @ , $ , _ , & ; ločila , . () < > { } + / * % ! " " ? = # ^ .

Veljajo naslednje vrste stavkov asemblerja in sintaksna pravila za oblikovanje izrazov asemblerja. aritmetični operatorji, operaterji premika, primerjalni operatorji, logični operatorji, operator indeksa, operator redefinicije tipa, operator redefinicije segmenta, operator za poimenovanje strukturnega tipa, operator za pridobivanje komponent segmenta naslova izraza, operator za pridobivanje odmika izraza.

Sistem ukazov je razdeljen na 8 glavnih skupin.

­ Kontrolna vprašanja:

1 Kaj je zbirni jezik?

2 Katere simbole lahko uporabimo za pisanje ukazov v asemblerju?

3 Kaj so oznake in kakšen je njihov namen?

4 Pojasnite zgradbo navodil za sestavljanje.

5 Naštejte 4 vrste stavkov za asembler.

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 Oven. 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 ukaznem sistemu mikroprocesorja obstajajo posebni ukazi in v programski model mikroprocesor 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 so sintaktični diagrami 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

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 model pomnilnika se uporablja v operacijskem sistemu 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.

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 identifikatorja je 255 znakov, vendar prevajalec sprejme prvih 32 znakov in prezre preostale. 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 segmente programa, podatkov in sklada, deklarirane z ustreznimi direktivami.

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 izvorne kode programa. 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




Vrh