Ukazna struktura zbirnega jezika vsebuje: Struktura ukazov v programiranju na ravni zbirnega jezika. Format podatkov in ukazna struktura zbirnega jezika

Ukazi zbirnega jezika (predavanje)

NAČRT PREDAVANJA

1. Glavne skupine operacij.

Pentium.

1. Glavne skupine operacij

Mikroprocesorji izvajajo niz ukazov, ki izvajajo naslednje glavne skupine operacij:

Posredovanje

Aritmetične operacije,

Logične operacije

Izmenično delovanje

Operacije primerjave in testiranja

Bitne operacije

Operacije upravljanja programov;

Nadzor procesorja.

2. Mnemonične kode procesorskih ukazov Pentium

Pri opisovanju ukazov se navadno uporabljajo njihove mnemonične oznake (mnemonične kode), s katerimi podajamo ukaz pri programiranju v jeziku Assembly. Za različne različice programa Assembler se lahko mnemonične kode nekaterih ukazov razlikujejo. Na primer, za ukaz za klic podprograma se uporablja mnemonična kodaPOKLIČITE oz JSR ("Skočiti Podrutina"). Vendar so mnemonične kode za večino ukazov za glavne vrste mikroprocesorjev enake ali se nekoliko razlikujejo, saj so okrajšave ustreznih angleških besed, ki opredeljujejo operacijo, ki se izvaja. Oglejmo si ukazne mnemonične kode, sprejete za procesorje Pentium.

Posredovanje ukazov. Glavna ekipa te skupine je ekipaMOV , ki zagotavlja prenos podatkov med dvema registroma ali med registrom in pomnilniško celico. Nekateri mikroprocesorji izvajajo prenose med dvema pomnilniškima celicama, pa tudi množične prenose vsebine več registrov iz pomnilnika. Na primer, mikroprocesorji družine 68 Motorola xxx izvrši ukazPREMAKNI SE , ki zagotavlja prenos iz ene pomnilniške celice v drugo, in ukazMOVEM , ki zapisuje v pomnilnik ali iz pomnilnika nalaga vsebino določenega niza registrov (do 16 registrov). EkipaXCHG medsebojno izmenjuje vsebino dveh procesorskih registrov ali registra in pomnilniške celice.

Vnosni ukazi IN in izhod VEN implementirati pošiljanje podatkov iz registra procesorja v zunanjo napravo ali sprejemanje podatkov iz zunanje naprave v register. Ti ukazi določajo številko vmesniške naprave (vhodno/izhodna vrata), prek katere se prenašajo podatki. Upoštevajte, da številni mikroprocesorji nimajo posebnih ukazov za dostop do zunanjih naprav. V tem primeru se vnos in izhod podatkov v sistem izvaja z ukazomMOV , ki določa naslov zahtevane vmesniške naprave. Tako je zunanja naprava naslovljena kot pomnilniška celica, v naslovnem prostoru pa je dodeljen določen odsek, v katerem se nahajajo naslovi vmesniških naprav (vrat), povezanih s sistemom.

Ukazi za aritmetične operacije. Glavni ukazi v tej skupini so seštevanje, odštevanje, množenje in deljenje, ki imajo številne možnosti. Ukazi za dodajanje DODAJ in odštevanje SUB opravite ustrezne operacije zcki ga posedujeta dva registra, register in pomnilniška lokacija, ali z uporabo neposrednega operanda. Ekipe AD C , S.B. B izvajajo seštevanje in odštevanje ob upoštevanju vrednosti atributaC, nastavljen pri oblikovanju nakazila med izvedbo predhodne operacije. S pomočjo teh ukazov se izvede zaporedno dodajanje operandov, katerih število bitov presega zmogljivost procesorja. Ekipa N.E.G. spremeni predznak operanda in ga pretvori v komplement dveh.

Operacije množenja in deljenja je mogoče izvajati na predpisanih številih (ukazijaz MUL, jaz DIV ) ali nepodpisan (ukazi MUL, DIV Eden od operandov se vedno nahaja v registru, drugi je lahko v registru, pomnilniški celici ali pa je neposredni operand. Rezultat operacije se nahaja v registru. Pri množenju (ukaziMUL , IMUL ) rezultat je dvobitni, za kar sta uporabljena dva registra. Pri delitvi (ukaziDIV , IDIV ) kot dividenda se uporabi dvobitni operand, ki se postavi v dva registra, posledično pa se količnik in ostanek zapišeta v dva registra.

Logični operacijski ukazi . Skoraj vsi mikroprocesorji izvajajo logične operacije IN, ALI, izključni ALI, ki se izvajajo na istih bitih operandov z uporabo ukazov IN, ALI, X ALI . Operacije se izvajajo nad vsebino dveh registrov, registra in pomnilniške lokacije, ali z uporabo neposrednega operanda. Ekipa NE obrne vrednost vsakega bita operanda.

Ukazi Shift. Mikroprocesorji izvajajo aritmetične, logične in ciklične premike naslovljenih operandov za enega ali več bitov. Operand, ki ga je treba premakniti, je lahko v registru ali pomnilniški lokaciji, število bitov premika pa je določeno z neposrednim operandom, ki ga vsebuje navodilo, ali določeno z vsebino navedenega registra. Prestopni znak običajno sodeluje pri izvedbi izmeneCv registru stanja (S.R. oz EFSTAVE), ki vsebuje zadnji bit operanda, odstranjen iz registra ali pomnilniške celice.

Ukazi za primerjavo in testiranje . Primerjava operandov se običajno izvede z uporabo ukazaCMP , ki odšteje operande in nastavi vrednosti funkcij N, Z, V, C v register statusov glede na dosežen rezultat. V tem primeru se rezultat odštevanja ne shrani in vrednosti operandov se ne spremenijo. Kasnejša analiza dobljenih vrednosti lastnosti nam omogoča določitev relativne vrednosti (>,<, =) операндов со знаком или без знака. Использование различных способов адресации позволяет производит сравнение содержимого двух регистров, регистра и ячейки памяти, непосредственно заданного операнда с содержимым регистра или ячейки памяти.

Nekateri mikroprocesorji izvajajo testni ukaz TST , ki je enooperandna različica ukaza za primerjavo. Ko je ta ukaz izveden, so znaki nastavljeni N, Ž glede na predznak in vrednost (enako ali različno od nič) naslovljenega operanda.

Navodila za uporabo bita . Ti ukazi nastavijo vrednost atributaCv statusni register v skladu z vrednostjo bita, ki se testirabn v naslovljenem operandu. V nekaterih mikroprocesorjih se na podlagi rezultata bitnega testiranja nastavi atributZ. Številka preskusnega bitanje podana z vsebino registra, podanega v ukazu, ali z neposrednim operandom.

Ukazi te skupine izvajajo različne možnosti za spreminjanje bita, ki se testira BT ohrani vrednost tega bita nespremenjeno.Command B T S post-test nastavi vrednost bn=1 in ukaz B T C - pomen bn=0.Ekipa B T C po preizkusu obrne vrednost bita bn.

Operacije upravljanja programa. Za nadzor programa se uporablja veliko število ukazov, med katerimi so:

- brezpogojni ukazi za prenos nadzora;

- ukazi za pogojni skok;

- ekipe za organizacijo programskih ciklov;

- prekinitveni ukazi;

- ukazi za spreminjanje atributov.

Brezpogojni prenos vodenja se izvaja z ukazomJMP , ki se naloži v programski števecPCnova vsebina, ki je naslov naslednjega ukaza, ki ga je treba izvesti. Ta naslov je neposredno določen v ukazuJMP (neposredno naslavljanje) ali izračunano kot vsota trenutne vsebinePCin odmik, določen v ukazu, ki je predpisano število (relativno naslavljanje). KerPCvsebuje naslov naslednjega programskega ukaza, slednja metoda določa naslov skoka, zamaknjen glede na naslednji naslov za določeno število bajtov. S pozitivnim odmikom se izvede prehod na naslednje ukaze programa, z negativnim odmikom - na prejšnje.

Podprogram se pokliče tudi z brezpogojnim prenosom nadzora z ukazomPOKLIČITE (oz JSR ). Vendar v tem primeru pred nalaganjem vPC novo vsebino, ki podaja naslov prvega ukaza podprograma, je potrebno shraniti njegovo trenutno vrednost (naslov naslednjega ukaza), da se po izvedbi podprograma zagotovi vrnitev v glavni program (ali v prejšnji podprogram pri gnezdenju podprogramov). Ukazi za pogojni skok (programske veje) se naložijo vPCnovo vsebino, če so izpolnjeni določeni pogoji, ki so praviloma nastavljeni glede na trenutno vrednost različnih atributov v statusnem registru. Če pogoj ni izpolnjen, se izvede naslednji programski ukaz.

Ukazi za nadzor funkcij omogočajo pisanje - branje vsebine statusnega registra, v katerem so shranjene funkcije, kot tudi spreminjanje vrednosti posameznih funkcij. Na primer, procesorji Pentium izvajajo ukaze LAHF in SAHF , ki naložijo nizki bajt, ki vsebuje znake, iz statusnega registra EFLAG na nizki bajt registra EAX in polnjenje nizkega bajta EFSTAVE iz registra E AX.. Ekipe CLC, STC izvedite nastavitev vrednosti znaka prenosa CF=0, CF=1 in ukaza CMC povzroči, da se vrednost tega atributa obrne. Ker atributi določajo potek izvajanja programa med pogojnimi prehodi, se ukazi za spremembo atributov običajno uporabljajo za nadzor programa.

Ukazi za nadzor procesorja . Ta skupina vključuje ukaze za zaustavitev, ukaze brez delovanja in številne ukaze, ki določajo način delovanja procesorja ali njegovih posameznih blokov. EkipaHLT ustavi izvajanje programa in postavi procesor v stanje zaustavitve, ki se izstopi, ko je prejet signal prekinitve ali ponovnega zagona ( Ponastaviti ). Ekipa NOP (»empty«ukaz), ki ne povzroči izvajanja nobenih operacij, se uporablja za izvajanje programskih zakasnitev ali zapolnjevanje vrzeli, ki nastanejo v programu.

Posebne ekipe CLI, STI prepovedati in omogočiti servisiranje prekinitvenih zahtev. V procesorjih Pentium za to se uporablja kontrolni bit (zastavica).ČE v registru EFSTAVE.

Številni sodobni mikroprocesorji izdajo identifikacijski ukaz, ki uporabniku ali drugim napravam omogoča pridobitev informacij o vrsti procesorja, uporabljenega v danem sistemu. V procesorjih Pentuim ukaz za to je CPUID , med katerim se potrebni podatki o procesorju vnesejo v registre EAXEBXECXEDX nato pa jih lahko prebere uporabnik ali operacijski sistem.

Glede na načine delovanja, ki jih izvaja procesor, in določene vrste podatkov, ki se obdelujejo, je mogoče nabor izvedenih ukazov znatno razširiti.

Nekateri procesorji izvajajo aritmetične operacije z dvojiško-decimalnimi števili ali izvajajo posebna navodila za popravek rezultata pri obdelavi takih števil. Številni visoko zmogljivi procesorji vključujejo FPU - enota za obdelavo številk c "plavajočo vejico".

Številni sodobni procesorji izvajajo skupinsko obdelavo več celih števil ali števil c “plavajočo vejico” z uporabo enega ukaza po principu SIMD (»eno navodilo – več podatkov«) «) - »En ukaz – veliko podatkov.« Hkratno izvajanje operacij na več operandih bistveno izboljša zmogljivost procesorja pri delu z video in avdio podatki. Takšne operacije se pogosto uporabljajo za obdelavo slik, zvočnih signalov in drugih aplikacij. Za izvajanje teh operacij so bili v procesorje uvedeni posebni bloki, ki izvajajo ustrezne nize ukazov, ki v različnih tipih procesorjev ( Pentium, Athlon) dobil imeMMX (“ Milti- Medijska razširitev ”) – Multimedijska razširitev,SSE(»Streaming SIMD Extension«) – Pretakanje SIMD - razširitev, “3 DRazširitev– Tridimenzionalna razširitev.

Značilna lastnost procesorjev podjetja Intel , začenši z modelom 80286, je prednostni nadzor pri dostopu do pomnilnika, ki je zagotovljen, ko procesor deluje v načinu zaščitenih navideznih naslovov - “ Zaščiten način ” (zaščiten način). Za izvedbo tega načina se uporabljajo posebne skupine ukazov, ki služijo za organizacijo zaščite pomnilnika v skladu s sprejetim algoritmom prednostnega dostopa.

Struktura ukazov v zbirnem jeziku Programiranje na ravni strojnih ukazov je minimalna raven, na kateri je možno računalniško programiranje. Sistem ukazov stroja mora zadostovati za izvajanje zahtevanih dejanj z izdajanjem navodil opremi stroja. Vsak strojni ukaz je sestavljen iz dveh delov: operativnega, ki določa, kaj narediti, in operanda, ki določa procesne objekte, to je, kaj narediti. Strojno navodilo mikroprocesorja, napisano v zbirnem jeziku, je ena sama vrstica, ki ima naslednjo obliko: operand(i) ukaza/navodila oznake; komentarji Oznaka, ukaz/naredba in operand so ločeni z vsaj enim presledkom ali tabulatorjem. Operandi ukaza so ločeni z vejicami.

Struktura ukazov zbirnega jezika Ukaz asemblerja pove prevajalcu, 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 podatka (v podatkovnem segmentu) ali elemente, na katerih se izvede ukazna akcija (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 znak povratne poševnice: "" . Privzeto asembler pri pisanju ukazov in direktiv ne razlikuje med velikimi in malimi črkami. 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 ima 255 znakov, vendar prevajalec sprejme prvih 32 in ignorira ostale. 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 vrstici. 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 vrstici. 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 ukazov nejasen. Komentarji se začnejo v kateri koli vrstici izvornega modula s podpičjem (;). Vsi znaki desno od "; « do konca vrstice je komentar. 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, napisan 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 uporabo ustreznih direktiv.

Pomnilniški modeli Preden deklarirate segmente, morate z direktivo določiti pomnilniški model. MODEL modifikator memory_model, calling_convention, OS_type, stack_parameter Osnovni pomnilniški modeli zbirnega jezika: pomnilniški model Naslavljanje kode Naslavljanje podatkov Operacijski sistem Koda in prepletanje podatkov DRAJBNO BLIZU MS-DOS Sprejemljivo MAJHNO BLIZU MS-DOS, Windows Ne SREDNJE DALEČ BLIZU MS-DOS, Windows Ne KOMPAKTNO BLIZU DALJ MS-DOS, Windows Ne VELIK DALEČ MS-DOS, Windows Ne OGROMNO DALEČ MS-DOS, Windows Ne BLIZU Windows 2000, Windows XP, Windows Sprejemljivo PLOŠČE BLIZU NT,

Modeli pomnilnika Majhen model deluje samo v 16-bitnih aplikacijah MS-DOS. V tem modelu se vsi podatki in koda nahajajo na enem fizičnem segmentu. Velikost programske datoteke v tem primeru ne presega 64 KB. Majhen model podpira en segment kode in en segment podatkov. Pri uporabi tega modela so podatki in koda naslovljeni kot blizu. Srednji model podpira več segmentov kode in en podatkovni segment, pri čemer se vse reference v segmentih kode privzeto štejejo za oddaljene, reference v podatkovnem segmentu pa za blizu. Kompaktni model podpira več podatkovnih segmentov, ki uporabljajo oddaljeno naslavljanje podatkov (daleč), in en segment kode, ki uporablja bližnje naslavljanje (bližnje). Velik model podpira več segmentov kode in več segmentov podatkov. Privzeto se vse reference na kodo in 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 se podatki in koda nahajajo v enem segmentu, vendar je 32-bitni. 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 navodil, ki so na voljo pri pisanju programov. Črka p za direktivo o izbiri procesorja pomeni zaščiten način delovanja. Naslavljanje podatkov in kode je blizu, pri čemer so vsi naslovi in ​​kazalci 32-bitni.

Modeli spomina. 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čitev metode posredovanja parametrov 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.

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

Primer programa, ki ne naredi ničesar. 686 P. MODEL STANOVANJA, STDCALL. PODATKI. CODE START: RET END START RET - mikroprocesorski ukaz. Zagotavlja, da se program pravilno zaključi. Preostali del programa se nanaša na delovanje prevajalnika. . 686 P - dovoljeni so ukazi zaščitenega načina Pentium 6 (Pentium II). Ta direktiva izbere podprt nabor ukazov asemblerja, ki označuje model procesorja. . MODEL FLAT, stdcall - ploščati pomnilniški model. Ta spominski model se uporablja v operacijski sobi sistem Windows. stdcall - uporabljena konvencija o klicanju procedure.

Primer programa, ki ne naredi ničesar. 686 P. MODEL STANOVANJA, STDCALL. PODATKI. KODA START: RET END START. DATA je segment programa, ki vsebuje podatke. Ta program ne uporablja sklada, torej segment. STACK manjka. . CODE je segment programa, ki vsebuje kodo. START - oznaka. END START - konec programa in sporočilo prevajalniku, da naj se izvajanje programa začne z oznako START. Vsak program mora vsebovati direktivo END, ki označuje konec izvorna koda programi. Vse vrstice, ki sledijo direktivi END, so prezrte.Oznaka, navedena za direktivo END, pove prevajalcu 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 ali tehnično orodje, ki pretvori program, predstavljen v enem od programskih jezikov, v program v ciljnem jeziku, imenovan objektna koda. Poleg podpore mnemotehniki strojnih navodil ima vsak prevajalnik svoj nabor direktiv in makro orodij, ki so pogosto nezdružljiva s čim drugim. Glavne vrste prevajalnikov zbirnih jezikov: 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) - brezplačen sestavljalnik za arhitekturo Intel x 86, ki ga je ustvaril Simon Tatham z Julianom Hallom, trenutno pa ga razvija majhna skupina razvijalcev 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 File->New- >Meni projekta 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 drevesu projekta (Pogled->Raziskovalec rešitev) dodati"> Трансляция программы в Microsoft Visual Studio 2005 2) В дереве проекта (View->Solution Explorer) добавить файл, в котором будет содержаться текст программы: Source. Files->Add->New. Item.!}

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

Prevajanje programa v Microsoft Visual Studio 2005 5) Nastavite parametre prevajalnika. Z desno miškino tipko kliknite meni Pravila gradnje po meri v datoteki projekta ...

Prevedite program 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 projektno drevo menija Lastnosti in namestite 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 operacijskem sistemu Windows Programiranje v operacijskem sistemu Windows temelji na uporabi API funkcij (Application Program Interface, t.j. programski aplikacijski vmesnik). Njihovo število doseže 2000. Program Windows je v veliki meri sestavljen iz takih klicev. Vse interakcije z zunanje naprave in viri operacijskega sistema se praviloma pojavljajo prek takih funkcij. Operacijski sistem Windows uporablja model ploščatega pomnilnika. Naslov katere koli pomnilniške celice bo določen z vsebino enega 32-bitnega registra. Obstajajo 3 vrste struktur programov za Windows: dialog (glavno okno je dialog), konzola ali struktura brez oken, klasična struktura (okenska, okvirna).

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 vrstnem redu, kot so prikazani, 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 (ali gumbi) za izhod. Pomen parametrov: h. Wnd je deskriptor okna, v katerem se prikaže okno s sporočili, 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 na niz, UINT je 32-bitno celo število. Pripona "A" je pogosto dodana imenu funkcije za prehod na novejše različice funkcije.

Klicanje funkcij Windows API int Message. Polje (HWND h. Wnd, LPCTSTR lp. Besedilo, LPCTSTR lp. Napis, UINT u. Vrsta); Ko uporabljate MASM, morate na konec 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, pomnoženo s 4 (bajti v vsakem argumentu): N=4*n. Če želite poklicati funkcijo, uporabite navodilo CALL za asembler. V tem primeru se ji vsi argumenti funkcije posredujejo prek sklada (ukaz PUSH). Smer podajanja argumentov: OD LEVE PROTI DESNI - OD SPODAJ GOR. Argument u bo najprej potisnjen na sklad. Vrsta. Klic navedene funkcije bo videti takole: CALL Sporočilo. Škatla. A@16

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 predstavlja "odmik v segmentu" ali, prevedeno v visokonivojske jezikovne termine, "kazalec" na začetek vrstice. Direktiva EQU, podobno kot #define v SI, definira konstanto. Direktiva EXTERN pove prevajalcu, da je funkcija ali identifikator zunaj tega 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. A@16: BLIZU. CODE START: PUSH MB_OK PUSH OFFSET STR 1 PUSH OFFSET STR 2 PUSH HW CALL Sporočilo. Škatla. A@16 RET KONEC ZAČETEK

Direktiva INVOKE Jezikovni prevajalnik MASM omogoča tudi poenostavitev klicev funkcij z uporabo makro orodja - direktive INVOKE: funkcija INVOKE, parameter1, parameter2, ... Klicu funkcije ni treba dodajati @16; parametri so zapisani natančno v vrstnem redu, v katerem so podani v opisu funkcije. Z makro sredstvi prevajalnika se parametri postavijo na sklad. Za uporabo direktive INVOKE morate imeti opis prototipa funkcije z uporabo direktive PROTO v obliki: Sporočilo. Škatla. A PROTO: DWORD, : DWORD Če program uporablja veliko funkcij API Win 32, je priporočljivo uporabiti direktivo include C: masm 32includeuser 32. inc

Strukture v zbirnem jeziku

Nizi, ki smo jih obravnavali zgoraj, so zbirka elementov iste vrste. Toda pogosto je v aplikacijah treba upoštevati določen nabor podatkov različni tipi kot neka ena vrsta.

To je na primer zelo pomembno za programe za baze podatkov, kjer je treba z enim objektom povezati zbirko podatkov različnih vrst.

Prej smo si na primer ogledali seznam 4, v katerem smo delali z nizom tribajtnih elementov. Vsak element je bil sestavljen iz dveh elementov različnih tipov: enobajtnega polja števca in dvobajtnega polja, ki je lahko nosilo nekatere druge informacije, potrebne za shranjevanje in obdelavo. Če bralec pozna enega od jezikov na visoki ravni, potem ve, da je takšen objekt običajno opisan s posebnim podatkovnim tipom - strukture.

Da bi izboljšali uporabnost zbirnega jezika, smo vanj uvedli tudi ta podatkovni tip.

A-prednost struktura je podatkovni tip, sestavljen iz določenega števila elementov različnih tipov.

Če želite uporabiti strukture v programu, morate izvesti tri korake:

    Set strukturna predloga .

    V bistvu to pomeni definiranje novega podatkovnega tipa, ki ga lahko kasneje uporabimo za definiranje spremenljivk tega tipa.

    Določite primer strukture .

    Ta stopnja vključuje inicializacijo specifične spremenljivke z vnaprej določeno strukturo (z uporabo predloge).

    Organizirajte dostop do strukturnih elementov .

Zelo pomembno je, da že od samega začetka razumete, kakšna je razlika med opis strukture v programu in njegove definicija.

Opišite struktura v programu preprosto pomeni nakazovanje njegovega obrisa ali vzorca; pomnilnik ni dodeljen.

Ta predloga se lahko obravnava le kot informacija za prevajalca o lokaciji polj in njihovi privzeti vrednosti.

Določite struktura pomeni navodilo prevajalcu, naj dodeli pomnilnik in temu pomnilniškemu področju dodeli simbolično ime.

Strukturo lahko v programu opišemo samo enkrat, definiramo pa poljubno število krat.

Opis predloge strukture

Opis predloge strukture ima naslednjo sintakso:

ime_strukture STRUC

ime_strukture KONČA

Tukaj je zaporedje direktiv za opis podatkov db, dw, dd, dq in dt.

Njihovi operandi določajo velikost polj in po potrebi začetne vrednosti. Te vrednosti bodo verjetno inicializirale ustrezna polja pri definiranju strukture.

Kot smo že omenili pri opisu predloge, pomnilnik ni dodeljen, saj je to le informacija za prevajalca.

Lokacija Predloga v programu je lahko poljubna, vendar se mora po logiki enoprehodnega prevajalnika nahajati pred mestom, kjer je definirana spremenljivka s tipom dane strukture. To pomeni, da mora biti pri opisu spremenljivke s tipom določene strukture v podatkovnem segmentu njena predloga postavljena na začetek podatkovnega segmenta ali pred njim.

Razmislimo o delu s strukturami na primeru modeliranja baze podatkov o zaposlenih v določenem oddelku.

Zaradi poenostavitve in v izogib težavam s pretvarjanjem informacij pri vnosu se strinjamo, da so vsa polja znakovna.

Določimo strukturo zapisa te zbirke podatkov z naslednjo predlogo:

Definiranje podatkov s tipom strukture

Če želite v programu uporabiti strukturo, opisano s predlogo, morate definirati spremenljivko s tipom te strukture. Za to se uporablja naslednja sintaktična konstrukcija:

[ime spremenljivke] ime_strukture

    ime spremenljivke- identifikator spremenljivke tega tipa strukture.

    Določanje imena spremenljivke ni obvezno. Če tega ne določite, je pomnilniško območje velikosti, ki je enako vsoti dolžin vseh elementi strukture.

    seznam vrednosti- seznam začetnih vrednosti strukturnih elementov v oglatih oklepajih, ločenih z vejicami.

    Tudi njegova naloga ni obvezna.

    Če seznam ni v celoti določen, se vsa polja strukture za to spremenljivko inicializirajo z vrednostmi iz predloge, če so določene.

    Možno je inicializirati posamezna polja, vendar morajo biti v tem primeru manjkajoča polja ločena z vejicami. Izpuščena polja bodo inicializirana z vrednostmi iz predloge strukture. Če se pri definiranju nove spremenljivke s tipom dane strukture strinjamo z vsemi vrednostmi polja v njeni predlogi (torej tistimi, ki so privzeto določene), potem moramo samo napisati oklepaje.

    Npr. zmagovalec delavec.

Na primer, definirajmo več spremenljivk z zgoraj opisano vrsto strukture.

Metode za delo s strukturo

Zamisel o uvedbi strukturiranega tipa v kateri koli programski jezik je združiti spremenljivke različnih tipov v en objekt.

Jezik mora imeti sredstva za dostop do teh spremenljivk v določenem primerku strukture. Za sklicevanje na polje neke strukture v ukazu se uporablja poseben operator - simbol ". « (pika). Uporablja se v naslednji sintaksi:

    naslov_izraz- identifikator spremenljivke nekega strukturnega tipa ali izraza v oklepajih v skladu s skladenjskimi pravili, navedenimi spodaj (slika 1);

    ime_polja_strukture- ime polja iz strukturne predloge.

    To je pravzaprav tudi naslov oziroma odmik polja od začetka strukture.

Tako operater " . " (pika) ovrednoti izraz

riž. 5. Sintaksa naslovnega izraza v operatorju za dostop do polja strukture

Pokažimo na primeru strukture, ki smo jo definirali. delavec nekaj tehnik za delo s strukturami.

Na primer, ekstrakt v sekira vrednosti polja s starostjo. Ker je malo verjetno, da bo starost delovno aktivne osebe višja od 99 let, po vnosu vsebine tega znakovnega polja v register sekira Priročno ga bo pretvoriti v binarno predstavitev z ukazom aad.

Bodite previdni, ker zaradi principa shranjevanja podatkov »nizki bajt na nizkem naslovu« vstavljena bo najvišja številka starosti al, in najmlajši - v ah.

Za prilagoditve uporabite ukaz xchg al, ah:

mov ax,word ptr sotr1.age ;in al age sotr1

lahko pa to storite takole:

Nadaljnje delo z nizom struktur poteka na enak način kot z enodimenzionalnim nizom. Tukaj se pojavi več vprašanj:

Kaj storiti z velikostjo in kako organizirati indeksiranje elementov polja?

Podobno kot drugim identifikatorjem, definiranim v programu, prevajalnik imenu strukturnega tipa in imenu spremenljivke s strukturnim tipom dodeli atribut tipa. Vrednost tega atributa je velikost v bajtih, ki jo zasedajo polja te strukture. To vrednost lahko pridobite z uporabo operatorja vrsta.

Ko je velikost primerka strukture znana, organiziranje indeksiranja v nizu struktur ni posebej težavno.

Npr.

Kako kopirati polje iz ene strukture v ustrezno polje druge strukture? Ali kako kopirati celotno strukturo? Kopirajmo polje nam tretji zaposleni na terenu nam peti delavec:

mas_sotr delavec 10 dup()

mov bx,odmik mas_sotr

mov si,(tip delavec)*2 ;si=77*2

mov di,(tip delavec)*4 ;si=77*4

Zdi se mi, da je zaradi poklica programerja človek prej ali slej videti kot dobra gospodinja. Tudi on, tako kot ona, ves čas išče, kje bi kaj prihranil, zmanjšal in iz najmanj sestavin pripravil čudovito večerjo. In če je to uspešno, potem moralno zadovoljstvo, ki ga dobite, ni nič manj in morda celo več kot od čudovite večerje z gospodinjo. Stopnja tega zadovoljstva se mi zdi odvisna od stopnje ljubezni do poklica.

Po drugi strani pa uspehi pri razvoju programske in strojne opreme programerja nekoliko sprostijo in nemalokrat se pojavi situacija, podobna znanemu pregovoru o muhi in slonu - za rešitev neke manjše težave se uporabijo težka orodja, katerih učinkovitost je v splošnem pomembna le pri izvajanju relativno velikih projektov.

Prisotnost naslednjih dveh vrst podatkov v jeziku je verjetno razložena z željo "gospodinje", da čim bolj učinkovito uporabi delovno površino mize (RAM) pri pripravi hrane ali za dajanje izdelkov (programski podatki ).

Ukaze je mogoče razlikovati po namenu (primeri mnemoničnih operacijskih kod ukazov sestavljalnika IBM PC so podani v oklepajih):

l izvajanje aritmetičnih operacij (ADD in ADC - seštevanje in seštevanje s prenosom, SUB in SBB - odštevanje in odštevanje z izposojo, MUL in IMUL - nepredznačeno in predznačeno množenje, DIV in IDIV - nepredznačeno in predznačeno deljenje, CMP - primerjave itd.);

l izvajanje logičnih operacij (ALI, IN, NE, XOR, TEST itd.);

l prenos podatkov (MOV - naprej, XCHG - izmenjava, IN - vnos v mikroprocesor, OUT - izhod iz mikroprocesorja itd.);

l prenos krmiljenja (programske veje: JMP - brezpogojni skok, CALL - klic procedure, RET - vrnitev iz procedure, J* - pogojni skok, LOOP - krmiljenje zanke itd.);

l obdelava nizov znakov (MOVS - prenosi, CMPS - primerjave, LODS - obremenitve, SCAS - skeniranje. Ti ukazi se običajno uporabljajo s predpono (modifikator ponavljanja) ​​REP;

l programske prekinitve (INT - programske prekinitve, INTO - pogojna prekinitev ob prelivu, IRET - povratek iz prekinitve);

l mikroprocesorsko krmiljenje (ST* in CL* - nastavitev in ponastavitev zastavic, HLT - zaustavitev, WAIT - čakanje, NOP - prosti tek itd.).

Z celoten seznam Ukaze za sestavljanje lahko najdete v delu.

Ukazi za prenos podatkov

l MOV dst, src - prenos podatkov (premakni - pošlji iz src v dst).

Prenosi: en bajt (če sta src in dst v formatu bajtov) ali eno besedo (če sta src in dst v formatu besed) med registri ali med registrom in pomnilnikom ter zapiše neposredno vrednost v register ali pomnilnik.

Operanda dst in src morata imeti enako obliko - bajt ali beseda.

Src je lahko naslednjega tipa: r (register) - register, m (pomnilnik) - pomnilnik, i (impedanca) - takojšnja vrednost. Dst je lahko vrste r, m. V enem ukazu ne morete uporabiti naslednjih operandov: rsegm skupaj z i; dva operanda tipa m in dva operanda tipa rsegm). Operand i je lahko tudi preprost izraz:

mov AX, (152 + 101B) / 15

Vrednotenje izraza se izvaja samo med prevodom. Ne spreminja zastav.

l PUSH src - potiskanje besede na sklad (push - potiskati skozi; potisni na sklad iz src). Postavi vsebino src - katerega koli 16-bitnega registra (vključno s segmentnim registrom) ali dveh pomnilniških celic, ki vsebujeta 16-bitno besedo - na vrh sklada. Zastave se ne spreminjajo;

l POP dst - izloči besedo iz sklada (pop - pop; štetje od sklada do dst). Odstrani besedo z vrha sklada in jo postavi v dst - katerikoli 16-bitni register (vključno s segmentnim registrom) ali v dve pomnilniški celici. Zastave se ne spreminjajo.

Programiranje na ravni strojnih ukazov je najnižja raven, na kateri je mogoče pisati programe. Sistem strojnih navodil mora zadostovati za izvajanje zahtevanih dejanj z izdajanjem navodil strojni opremi računalnika.

Vsak strojni ukaz je sestavljen iz dveh delov:

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

Ukaz mikroprocesorskega stroja, napisan v zbirnem jeziku, je ena vrstica z naslednjo sintaktično obliko:

oznaka ukaza/navodila 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 pri pisanju ukazov ali direktiv ne razlikuje med velikimi in malimi črkami.

Primer vrstic kode:

Štej db 1 ;Ime, direktiva, en operand
mov eax,0 ;Ukaz, dva operanda
cbw ; Ekipa

Oznake

Oznaka v zbirnem jeziku lahko vsebuje naslednje simbole:

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

Piko lahko uporabite kot prvi znak oznake, vendar nekateri prevajalniki ne priporočajo uporabe tega znaka. Rezerviranih imen Assemblerja (direktiv, operaterjev, imen ukazov) ni mogoče uporabiti kot oznake.

Prvi znak v oznaki mora biti črka ali poseben znak (vendar ne številka). Največja dolžina oznake je 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 ukaz določa dejanje, kot je premikanje (mov) ali dodajanje (add).

direktive

Sestavljalnik ima številne operaterje, ki vam omogočajo nadzor nad procesom sestavljanja in seznama. Ti operaterji se imenujejo direktive . Delujejo samo med postopkom sestavljanja programa in za razliko od ukazov ne generirajo strojne kode.

Operandi

Operand – objekt, na katerem se izvede strojni ukaz ali stavek 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 ;Povečaj 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 vrstici. Priporočljivo pa je, da jih zapišete v stolpec, da bo program lažje berljiv.

Operandi so lahko

  • identifikatorji;
  • nizi znakov v enojnih ali dvojnih narekovajih;
  • cela števila v dvojiškem, osmiškem, decimalnem ali šestnajstiškem številskem sistemu.
Identifikatorji

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

Pravila za beleženje identifikatorjev.

  • Identifikator je lahko sestavljen iz enega ali več znakov.
  • Kot simbole lahko uporabite črke latinice, številke in nekatere posebne znake: _, ?, $, @.
  • Identifikator se ne sme začeti s števko.
  • Dolžina identifikatorja je lahko 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 napisano za podpičjem in do konca vrstice. Uporaba komentarjev v programu izboljša njegovo jasnost, zlasti kadar je namen nabora ukazov 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 ima lahko definiranega enega ali več segmentov podatkov, sklada in kode. Vsak popoln program za sestavljanje mora vključevati en glavni ali glavni modul, od katerega se začne njegovo izvajanje. Modul lahko vsebuje segmente kode, segmente podatkov in segmente sklada, deklarirane z uporabo ustreznih direktiv. 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, da se program pravilno zaključi. Na splošno se ta ukaz uporablja za izhod iz postopka.
Preostali del programa se nanaša na delovanje prevajalnika.
.686P - dovoljeni so ukazi zaščitenega načina Pentium 6 (Pentium II). Ta direktiva izbere podprt nabor ukazov asemblerja, ki označuje model procesorja. Črka P, navedena na koncu direktive, obvešča prevajalca, da procesor deluje v zaščitenem načinu.
.MODEL FLAT, stdcall - ploščati pomnilniški model. Ta model pomnilnika se uporablja v operacijski sistem Windows. stdcall
.DATA je segment programa, ki vsebuje podatke.
.CODE je programski blok, ki vsebuje kodo.
START - oznaka. V asemblerju imajo oznake pomembno vlogo, česar pa ne moremo reči za sodobne jezike na visoki ravni.
END START - konec programa in sporočilo prevajalniku, da naj se izvajanje programa začne z oznako START.
Vsak modul mora vsebovati direktivo END, ki označuje konec izvorne kode programa. Vse vrstice, ki sledijo direktivi END, so prezrte. Če izpustite direktivo END, se ustvari napaka.
Oznaka, navedena za direktivo END, pove prevajalcu ime glavnega modula, iz katerega se začne izvajanje programa. Če program vsebuje en modul, lahko oznako za direktivo END izpustite.




Vrh