Suur nafta ja gaasi entsüklopeedia

6 Programmeerimine mälukoodides

Programmide kirjutamiseks on kõige mugavam kasutada mälukoode, mis koosnevad käsu täisnime lühendist. Sel juhul peegeldab mälukood toimuva toimingu tähenduslikku tähendust..

Näide 1.1. Tsükliloendurite korraldus. Loendamisalgoritm on näidatud joonisel fig. 1.6 ja fragment programmist on näidatud tabelis. 1.3.

Joonis 1.6 - tsükli loendamise algoritmi skeem

Loendur on üks RON-registrist B. Käsuga MVI B, N sisestatakse sinna arv N, mis määrab korduvate tsüklite arvu. Selles programmis N = 16. Täpsuse huvides eeldatakse, et programmi sektsioon, mida tuleb 16 korda korrata, algab XRA A loogilise operatsiooni käsuga "EXCLUSIVE OR", mis asub aadressil 1002, ja lõpeb käsuga, mis viiakse akult registrisse D: MOV D, A, mis asub aadressil 10A1. Pärast programmi iga selle osa täitmist vähendatakse loenduri (register B) sisu ühe käsu DCR B abil (aadress 10A2). Seni, kuni registri B sisu on nullist erinev, on Z-märgil nullväärtus ja programm jätkab käsu aadressi 1002 täitmist, mis sisaldub JNZ-käsu teises ja kolmandas baidis (hüpake nulli puudumisel). Määratud aadress on programmis märgistatud sildiga M1, s.t. M1 silt on aadressi 1002 mnemooniline tähis.

Tabel 1.3 - tsüklite loendamise programm

SiltMnemokoodOperandAadressH - koodKommentaarVt
......................................
MVIB, 16100006Loenduri paigaldamine7
1001kümmeN = 16 (B)
M1:XRAA1002AFKandemärgi nullimine4
......................................
MOVD, A10A157A sisu kandmine registrisse D (D: = A)viis
DCRB10A205Vähendage loenduri sisu 1 võrraviis
JNZM110A3C2Hüppa tingimuse (N) 10 järgi mälurakule aadressiga 1002kümme
10A402
10A5kümme
......................................

Kui ühe järgmise lahutamise tulemusena osutub registri B sisu võrdseks nulliga (Z = 1), jätkab programm JNZ taga asuva käsu täitmist. Programmi tsüklilisest osast väljutakse. Kuna registris B on kaheksa binaarbitit, võimaldab programmi kaalutud struktuur korraldada loendurit vahemikus 1 kuni 255 tsüklit. Kui on vaja hankida suur hulk tsükleid, tuleks loenduri korraldamiseks kasutada registripaare (näiteks B ja C). Sellise paari laadimine toimub käsuga LXI B ja käsu DCR B asemel peate kasutama käsku DCX B (registripaari vähendamine).

Näide 1.2. Arvu mooduli määramine. Signaalide uurimisel tuleb sageli hinnata mõõtmisviga moodulis. Mõelge tingimuslikku haru sisaldava arvu mooduli määramise programmi. Tulenevalt asjaolust, et negatiivsed arvud on esindatud täiendavates koodides, ei saa mooduli määramisel piirduda numbri märgi, mille teave sisaldub kõige olulisemas bitis, viskamisega. Kui arv on positiivne, tuleb see korrutada -1-ga. Märki saab määrata maskeerimisoperatsiooni abil või kõige olulisema biti saatmise edastamise päästikule ja seejärel seda analüüsida. Sellisel juhul on need toimingud ebasoovitavad, kuna nendega kaasnevad muutused aku sisus. Soovitav on kasutada käsku, et aku sisu enda juurde loogiliselt lisada. Sellisel juhul ei muutu aku sisu ja lipud seatakse vastavatele olekutele. Tingimuslik haru tehakse S-märgi päästiku sisule.

Joonisel fig. 1.7 näitab diagrammi E arvu arvu mooduli määramise algoritmi diagrammi. Programm töötab järgmiselt. Registrist E kantud number kantakse akule. Akumulaatori loogilise liitmise toimingu sooritamise tulemusena kirjutatakse märgi päästikule numbri kõige olulisem bitt. Tingimusliku haru käsu abil on programm hargnenud. Kui S = 0 (positiivne arv) ei täideta, siis muudetakse numbri märki ja akumulaatori numbri moodul kantakse registrisse E. Numbri märki muudetakse komplemendioperatsiooni abil, mis seisneb numbri kõigi numbrite (CMA käsu) inverteerimises, millele järgneb ühe lisamine kõige vähem olulisele bitile (INR A käsk). Kui tingimus S = 0 on täidetud (arv on positiivne), siis tingimusliku haru JM M2 poolt möödutakse kolmest viimasest käsust, registri E sisu ei muutu ja programmi täitmine jätkub aadressilt 01F8, mis vastab sildile M2. Masinakoodide programm koos kommentaaridega on toodud tabelis. 1.1.

Joonis 1.7 - arvu mooduli määramise algoritmi skeem

Näide 1.3. Kahe positiivse arvu maksimumi määramine. Signaalide töötlemisel on sageli vaja kindlaks määrata mitme positiivse arvu maksimum. Sellised probleemid tekivad näiteks kasulike signaalide tuvastamisel või antud ajaintervalli maksimaalse signaali väärtuse leidmisel. Mitme numbri maksimumi leidmine taandub kahe numbri maksimumi järjestikusele määramisele.

MP käsusüsteemis on CMP võrdluskäsk, mis ei muuda aku sisu, kuid seab CY (carry) lipu päästiku ühele olekule, kui aku sisu on väiksem kui registri sisu.

Joonis 1.8 - Algoritmi skeem kahest positiivsest numbrist suurema leidmiseks

Tabel 1.4 - Programm numbri mooduli määramiseks

SiltMnemokoodOperandAadressH-koodKommentaarVt
MOVA, E01F07BÜlekanne akusseviis
ORAA01F1B7Arvu märgi määramine4
JPM201F2F2Tingimuslik hüpe positiivsele väärtuselekümme
01F3F8
01F4kümme
CMAA01F52FMuutke numbri märki4
INRA01F63Cviis
MOVE, A01F75FÜlekanne registrisse Eviis
M2:10F8

Täpsuse huvides eeldame, et üks numbritest on akumulaatoris ja teine ​​registris B. Registrisse B on nõutav suurem arv ja akumulaatorisse väiksem arv. Algoritmiskeem on näidatud joonisel fig. 1.8 ja masinakoodidega programm on näidatud tabelis. 1.5.

Joonis 1.9 - ajaviivituse moodustamise algoritmi skeem

Tabel 1.5 - Programm kahest positiivsest numbrist suurema leidmiseks

Mis on mälukood

Assamblee keelekäsud vastavad üks-ühele protsessori juhistega, tegelikult esindavad need käskude ja nende argumentide inimsõbralikumat sümboolset tähistust (mälukood).

Lisaks näeb montaažikeel ette mäluaadresside asemel sümboolsete siltide kasutamist, mis asendatakse kokkupaneku ajal automaatselt arvutatud absoluut- või suhteaadressidega, samuti nn direktiividega (juhised, mida ei tõlgita protsessori käskudeks, vaid täidab monteerija ise).

Assembleri direktiivid võimaldavad eelkõige kaasata andmeplokke, määrata programmi fragmendi komplekteerimise tingimuste järgi, määrata siltide väärtusi, kasutada parameetritega makrosid.

Igal protsessorite mudelil (või perekonnal) on oma juhiste komplekt ja vastav monteerimiskeel.

On arvuteid, mis rakendavad kõrgetasemelist programmeerimiskeelt masinakeelena (Forth, Lisp, El-76), tegelikult on neis tegemist "monteerijaga".

Eelised ja puudused

Assamblee keele voorused

  • Osav programmeerija suudab tavaliselt kirjutada tõhusama koostekeeleprogrammi kui need, mille on loonud tõlkijad kõrgetasemelistest programmeerimiskeeltest, see tähendab, et montaažikeele programmid kasutavad tavaliselt vähem juhiseid ja mälupääsusid, mis suurendab kiirust ja vähendab programmi mahtu.
  • Konkreetse platvormi spetsiifiliste võimaluste maksimaalne kasutamine, mis võimaldab teil luua ka vähem ressurssidega tõhusamaid programme.
  • Assamblee keeles programmeerimisel on otsene juurdepääs riistvarale, sealhulgas sisend- / väljundportidele, protsessorite registritele jne..

Assamblee keele puudused

  • Oma masinaorientatsiooni ("madala" taseme) tõttu on inimesel võrreldes kõrgtasemel programmeerimiskeeledega raskem programmi lugeda ja sellest aru saada, see koosneb liiga "väikestest" elementidest - masinjuhised, vastavalt programmeerimine ja silumine muutuvad keerukamaks, töömahukus suureneb, vigade sissetoomise tõenäosus on suur... Koostöö arendamise keerukus suureneb dramaatiliselt.
  • Võrreldes tänapäevaste tööstuslike programmeerimiskeeledega on saadaval üldiselt vähem teeke.
  • Erineva arhitektuuri ja käsusüsteemiga arvutis pole programmide kaasaskantavust (välja arvatud binaarselt ühilduvad).

Rakendus

Ajalooliselt võib assemblerit pidada arvutiprogrammeerimiskeelte teise põlvkonnaks (kui esimeseks peetakse masinakoodi). Assembleri puudused, sellel suurte tarkvarasüsteemide väljatöötamise keerukus viisid kolmanda põlvkonna keelte - kõrgetasemeliste programmeerimiskeelte (Fortran, Lisp, Cobol, Pascal, C jne) tekkimiseni. Infotehnoloogia tööstuses kasutatakse tänapäeval peamiselt kõrgetasemelisi programmeerimiskeeli ja nende pärijaid. Kuid montaažikeeled säilitavad oma niši tänu oma ainulaadsetele eelistele tõhususe ja võime osas täielikult kasutada konkreetse platvormi eripära..

Assemblerit kasutatakse programmide või programmifragmentide kirjutamiseks, mille jaoks on kriitiline järgmine:

  • jõudlus (draiverid, mängud);
  • kasutatud mälumaht (alglaadimissektorid, manustatud tarkvara, mikrokontrollerite ja piiratud ressurssidega protsessorid, viirused, tarkvarakaitse).

Koostekeelse programmeerimise abil saadakse järgmine:

  • Kiiruskriitiliste programmiosade optimeerimine kõrgetasemelises keeles, näiteks C ++. See kehtib eriti videokonsoolide kohta, millel on kindel jõudlus, ja multimeediakoodekite puhul, mis muudavad need vähem ressursimahukaks ja populaarsemaks..
  • Operatsioonisüsteemide (OS) loomine. OSed on sageli kirjutatud C-s, mis on spetsiaalselt loodud Unixi ühe varasema versiooni kirjutamiseks. Riistvarast sõltuvad kooditükid, näiteks operatsioonisüsteemi laadur, abstraktsioonikiht riistvarast - KolibriOS, on kirjutatud täielikult assembleris. Samal ajal paigutatakse KolibriOS disketile ja sisaldab graafilist mitme akna liidest.
  • Mikrokontrollerite (MC) ja muude sisseehitatud protsessorite programmeerimine. Professor Tannenbaumi sõnul kordab ontogeenia fülogeneesi, kordades MC arengut tänapäevaste arvutite ajaloolist arengut. [1] Tänapäeval kasutatakse MK-i programmeerimiseks sageli assemblerit. MCU-s peate liikuma üksikud baidid ja bitid erinevate mälurakkude vahel. MK-programmeerimine on väga oluline, kuna Tannenbaumi sõnul on tänapäevase tsiviliseeritud inimese autos ja korteris keskmiselt 50 mikrokontrollerit. [2]
  • Juhi loomine. Mõned riistvaraga suhtlevate draiverite osad on programmeeritud koostekeeles. Kuigi üldiselt üritavad autojuhid praegu usaldusväärsuse suurenenud nõuete tõttu kirjutada kõrgetasemelistes keeltes. Draiverite töökindlus on eriti oluline, kuna draiverid töötavad Windows NT ja Linuxi puhul tuumarežiimis. Üks viga võib süsteemi kokku kukkuda.
  • Antiviiruste ja muude kaitseprogrammide loomine.
  • Programmeerimiskeelte tõlkijate kirjutamine.

Ebaseaduslik tegevus

Assamblee keele programmeerimine on tüüpiline ka ebaseaduslike tegevusalade jaoks IT-s, eriti assembleri abil:

  • Häkkimisprogrammid. "Originaaltarkvara", mille koopiaid müüakse ebaseaduslikult, kui see kasutas tehnilist autoriõiguste kaitset, tõenäoliselt häkkiti siluri abil ja oskuskeelega. See võimaldab siluri või demonteerija abil leida programmi koodist funktsiooni, mis vastutab aktiveerimiskoodi sisestamise või programmi demoversiooni lõpetamise eest. Ründaja saab spetsiaalse redaktori (1) abil muuta programmi lähtekoodi või luua võtmegeneraatori (2). Esimene meetod on lõppkasutaja jaoks lihtsam. Teine on vähem karistatav (Vene Föderatsiooni kriminaalkoodeks, artikkel 272: kuni 2 aastat). [3]
  • Viiruste ja muude pahatahtlike programmide loomine (Vene Föderatsiooni kriminaalkoodeks, artikkel 273: kuni 3 aastat, tõsiste tagajärgedega kuni 7 aastat).

Assamblee keeleprogrammide linkimine teiste keeltega

Kuna assamblee keeles on sageli välja töötatud ainult fragmendid programmidest, tuleb need linkida ülejäänud muus keeles kirjutatud tarkvarasüsteemiga..

See saavutatakse kahel peamisel viisil:

  • Koostamise etapis sisestatakse inline assembleri fragmendid programmi spetsiaalsete keeledirektiivide abil (eriti seda meetodit toetab C-programmeerimiskeel), sealhulgas koostamisprotseduure monteerimiskeeles. Meetod on mugav andmete lihtsate teisenduste jaoks, kuid täieõiguslikku koostekoodi koos andmete ja alamprogrammidega, sealhulgas paljude sisendite ja väljunditega alamprogramme, mida kõrgetasemelised keeled ei toeta, ei saa sellega teha..
  • Lingi staadiumis või eraldi kompileerimisel. Lingitud moodulite koostoimimiseks piisab, kui ühendamisfunktsioonid (mõnes moodulis määratletud ja teistes kasutatavad) toetavad nõutavaid helistamiskonventsioone ja andmetüüpe. Üksikuid mooduleid saab kirjutada mis tahes keeltes, sealhulgas assembler..

Süntaks

Assamblee keele süntaks määratakse konkreetse protsessori käsuhulgaga.

Käsukomplekt

Tüüpilised assamblee keele käsud on (enamik näiteid on mov, lea jne)

  • Aritmeetilised käsud (add, sub, imul jne)
  • Loogilised ja bitipõhised toimingud (või, ja, xor, shr jne)
  • Käsud programmi täitmise juhtimiseks (jmp, loop, ret jne)
  • Tarkvara katkestuste helistamise käsud (neid mõnikord nimetatakse ka juhtkäsklusteks): int, into
  • Pordi I / O käsud (sisse, välja)
  • Mikrokontrollerite ja mikroarvutite jaoks on iseloomulikud ka käsud, mis teostavad verifitseerimist ja tingimuste kaupa üleminekut, näiteks:
    • cbne - hüpata kui mitte võrdne
    • dbnz - vähenemine ja kui tulemus pole null, siis minge
    • cfsneq - võrrelge ja kui see pole võrdne, jätke järgmine käsk vahele

    Juhised

    Tüüpiline käskude salvestamise vorming:

    kus opcode (opcode) on käsu otsene mälu protsessorile. Sellele saab lisada eesliiteid (kordused, adresseerimistüübi muutused jne).

    Operandid võivad olla konstandid, registriaadressid, RAM-is olevad aadressid jne. Inteli ja AT&T standardite erinevused on seotud peamiselt operandide loendamise järjekorraga ja nende süntaksiga erinevate aadressimismeetodite korral.

    Kasutatavad mnemotehnika on tavaliselt sama arhitektuuri või arhitektuuriperekonna kõigi protsessorite jaoks ühesugused (laialt tuntud neist on Motorola, ARMi, x86 protsessorite ja kontrollerite mnemotehnika). Neid kirjeldatakse protsessori spetsifikatsioonis. Võimalikud erandid:

    • Kui monteerija kasutab platvormidevahelist AT&T süntaksit (originaalsed mnemotehnika valatakse AT&T süntaksisse)
    • Kui algselt oli mnemotehnika kirjutamiseks kaks standardit (käsusüsteem päriti teise tootja protsessorilt).

    Näiteks pärandas Zilog Z80 protsessor Inteli i8080 käskude komplekti, laiendas seda ja muutis omal moel mnemotehnikat (ja registrimärke). Motorola Fireballi protsessorid said Z80 käsustiku päranduseks, kärpides selle veidi alla. Samal ajal on Motorola ametlikult naasnud Inteli mnemotehnika juurde. Ja praegu töötavad pooled Fireballi monteerijatest Inteli ja pooled Zilogi mäluvõtetega.

    Direktiivid

    Koosteprogramm võib sisaldada direktiive: juhiseid, mis ei tõlgita otse masinajuhisteks, kuid kontrollivad kompilaatori tööd. Nende kogum ja süntaks erinevad märkimisväärselt ja sõltuvad mitte riistvaraplatvormist, vaid kasutatavast tõlkijast (mis annab alguse sama arhitektuuriperekonna keelte murretele). "Härrasmeeste komplektina" võib eristada järgmist:

    • andmete määratlus (konstandid ja muutujad)
    • programmi korralduse haldamine mälus ja väljundfailide parameetrites
    • kompilaatori režiimi seadistamine
    • igasugused abstraktsioonid (see tähendab kõrgetasemeliste keelte elemendid) - protseduuride ja funktsioonide kavandamisest (protseduurilise programmeerimisparadigma rakendamise lihtsustamiseks) tingimuslike konstruktsioonide ja tsükliteni (struktureeritud programmeerimisparadigma jaoks)
    • makrod

    Näidisprogramm

    Programminäited Tere, maailm! erinevate platvormide ja erinevate murrete jaoks:

    Mis on mälukood

    Katkestab

    Igal protsessoril on vähemalt üks katkestussisend. Kui katkestussignaal saabub, antakse katkestuse lubamise korral juhtimine spetsiaalsele katkestusrutiinile. Teenuse katkestamise rutiin lõpeb katkestamise rutiinse väljumise käsuga. Selle käsuga naaseb protsessor põhiprogrammi kohta, kus katkestus tekkis. Katkestusprotseduuri kasutamise tulemusena saavutatakse mõlema protsessi sõltumatuse mõju. Mikroprotsessori masina aeg jaotatakse peamise programmi täitmisprotsessi ja katkestuste käitlemise protsesside vahel. On sisemisi ja väliseid katkestusi, mis on põhjustatud mikroprotsessori ühest sisesõlmest või välisseadmest tulevast signaalist. Katkestusvektor - aadress programmi mälus, kust algab katkestuste käitlemise protseduur.

    Mikroprotsessorsüsteemides kasutatakse montaažikeele programmeerimist. Assemblerit mõistetakse käsukommunikatsioonikoodide programmeerimiskeelena ja tõlkeprogrammina, mis tõlgib mälukoodid masinakoodideks. Masinkoodidesse tõlkimise (tõlkimise) protsessi nimetatakse kokkupanekuks.

    Assamblee keeleväljend on:

    Lokkisulgudes on avaldise elemente, mida mõnes käsus ei pruugi olla. Sildid, mälu- ja operandid on eraldatud tühikute või vahelehtedega.

    Näide:

    SiltMnemokoodOperandidKommentaarid
    MOVAX, 00; käsk, kaks operandit
    M1:LISAMAAX, BX; silt, käsk, kaks operandi
    VIIVITUS:MOVCX, 13; silt, käsk, kaks operandi

    Silt on käsu sümboolne aadress. Sildid tähistavad ainult neid käske, millele peate alamprogrammi kõne peale minema. Märgise järele pannakse koolon. Soovitav on kasutada semantilisi silte. Kõik programmi sildid peavad olema unikaalsed, st. programmis ei saa olla mitu samade siltidega käsku. Sildi nimi peab koosnema ühest sõnast, mis sisaldab ainult ladina tähti ja numbreid, samuti alakriipsut. Silt peab algama tähe või alakriipsuga. Sildidena ei saa kasutada assamblee reserveeritud sõnu - käsukoode, direktiive, registrinimesid. Hüppejuhistes või alamprogrammi väljakutsetes kasutatakse operandina silditähiseid - sümboolne hüppeaadress, näiteks:

    SiltMnemokoodOperandidKommentaarid
    JMPM1; minge M1 sildiga käsule
    M1:HELISTAMAVIIVITUS; alamprogrammi kutsumine sildiga; VIIVITUS

    Mnemokood identifitseerib monteerija käsu. Mnemotähiste koodide jaoks kasutatakse lühendatud või täielikke ingliskeelseid sõnu, mis edastavad peamise käsufunktsiooni väärtused: ADD - liita, SUB (SUBtract) - lahuta, XCHG (eXCHanGe) - muuta.

    Operandid eraldatakse komadega. Kui antakse kaks operandit, siis esimene neist on vastuvõtja ja teine ​​on teabeallikas. Käsk võib sisaldada erinevat arvu erinevat tüüpi operandi, näiteks:

    SiltMnemokoodOperandidKommentaarid
    INCCX; suurendada CX-i (üks operand)
    LISAMAAH, 12H; lisage AX sisule 12H
    ; (kaks operandit)

    Saates eiratakse kommentaare ja neid kasutatakse programmi sisu dokumenteerimiseks ja mõistmiseks. Kommentaar algab alati tähega ";" ja võib sisaldada mis tahes märke. Kommentaar võib hõlmata tervet rida või asuda pärast käsku ühel real, näiteks:

    SiltMnemokoodOperandidKommentaarid
    ; see rida on kommentaar.
    LISAMAAX, BX; käsk ja kommentaar ühel real.

    Sest kommentaare ei tõlgita masinakoodideks, siis ei mõjuta nende arv programmi täitmise mahtu ja tõhusust.

    Assamblee keeleprogrammi nimetatakse algprogrammiks või esialgseks programmiüksuseks. Esialgse programmi kokkupanek või tõlkimine masinakoodideks teostatakse tõlkeprogrammi abil.

    Käsumoodul sisaldab absoluutsete aadressidega käskude masinakoode ja selle täidab mikroprotsessor. Programm peab lõppema käsu end või ret abil [2]..

    Objektimoodul sisaldab suhteliste aadressidega käskude masinkoode. Objektimooduli täidab MT pärast suhteliste aadresside asendamist absoluutsetega linkerprogrammi abil, näiteks LINK.EXE, mis genereerib exe laiendiga mooduli (EXE-fail või EXE-programm); Erinevalt käsumoodulist võib EXE-fail ületada ühe segmendi mahtu (64 K). Kuid sel juhul on hädavajalik segmendid määratleda monteerimisdirektiivide abil. EXE-fail lõpeb MS-DOS-is õige väljumise standardprotseduuriga.

    Linkerprogrammil on veel üks eesmärk - see ühendab objektimooduli raamatukogu moodulitega või mitu eraldi objektimoodulit üheks EXE-failiks. Raamatukoguüksused on objektifailid, mis sisaldavad kõige tavalisemat rutiini. Raamatukogu moodulid asuvad spetsiaalses süsteemifailis - teek (LIBRARY).

    Kokkupanduna genereerib tõlk programmi jaoks loendi ja loendifaili. Loetlemine - kuvatakse ekraanil või paberil algse programmimooduli, programmimooduli (som või obj) tekstid ja teated, mis viitavad avaldiste kirjutamise reeglite rikkumisega seotud programmeerimisvigadele (näiteks operandi puudumine või vale käsu mälukood).

    Mnemokood - abi numbrite meeldejätmisel

    Kaasaegset inimest ümbritseb arvuliste järjestuste meri, millest paljusid tuleb suure nõudluse tõttu mälus hoida - erinevad telefoninumbrid, PIN-koodid, digitaalsed paroolid.

    Olemasolev teadus mälust - mnemotehnika pakub üsna elegantset meeldejätmismeetodit: mitmele kümnendkohale määratakse kaashäälikute väärtused; numbri meelde jätmiseks piisab sõna (või fraasi) meelde jätmisest, milles konsonantide järjestus vastab numbrite järjekorrale numbris.

    Annan numbri 0 kuni 9 meelde jätmiseks numbri: NOL - üks - kaks - kolm - neli - viis - kuus - seitse - kaheksa - palju.

    Numbrite meelde jätmine dig.by abil

    Meetodi näiline lihtsus komistab asjaolule, et suure hulga - 10 - kodeerimiseks kasutatakse väikest arvu elemente ja need lähevad peas segadusse, tekitades korralikult järjestatud numbrijada asemel "segaduse"..

    Väljapääsu kasutatakse kahekohaliste arvude piltide meelde jätmiseks - suurusjärgu võrra suurenenud keerukuse tasub ära suurte arvude hea meelde jätmine.

    Viis aastat tagasi kasutasin seda meetodit oma palga plastkaardi PIN-koodi meelde jätmiseks. Kaart on juba ammu aegunud ja asendati uuega, kuid PIN-kood on endiselt peas.

    Piltide jõud on piisavalt tugev: reisiv tank T-34, mille miin õhkinud on - seega ladus minu kood kood 3495. Miks 34 mäletati kui tanki - see on kindlasti mõistetav kõigile meestele, kes on üles kasvanud Nõukogude sõjafilmidest. Number 95 on seotud Windows 95 mälestuste ja loosungiga "Windows Must Die", mis vilkus siis, kui mu tudengiaastatel arvuti käivitati..

    Nii seostati Nõukogude tankihoone uhkuse enneaegset surma tohutult armastatud Windowsi kasutajatega ja seda mäletatakse siiani seoses kõigi nähtud Visa kaartidega.

    Tavainimeste suurim probleem on see, et neil pole aega ja energiat, et meelde jätta vähemalt 100 kahekohalise numbri pilti, mis on vajalik meetodi viljakaks kasutamiseks.

    Selleks, et aidata neid, kes soovivad numbrit usaldusväärselt meelde jätta ja ei viitsi kahekohaliste arvude piltide tabeli koostamisega, käivitasin hiljuti projekti Mnemocode - abi numbrite meelde jätmisel veebisaidil dig.by.

    Projekt on kahekohaliste numbrite veebipõhine mnemokoodide raamat. Külastaja saab valida soovitud numbri - sünnipäev, PIN-kood, telefoninumber - meeldejätmiseks pilte. Praegu on olemas tähestikuline kooditabel, mis on ehitatud Oleg Stepanovi muudetud tabeli põhjal. 15% kahekohalistest numbritest on pilt, mis illustreerib mälukoodi.

    Projekt on just hakanud arenema ja saate Mnemocode'i saatust suuresti mõjutada.

    Mnemokood

    Assamblee keelKeeletundprogrammeerimiskeelIlmunud aastal1949Faililaiend.asm või.s [1]Meediumifailid Wikimedia Commonsis

    Assamblee keel on madala masinale suunatud programmeerimiskeel. Selle käsud vastavad otseselt üksikutele masinakäskudele või nende järjestustele ning võivad pakkuda programmeerimise hõlbustamiseks ka lisafunktsioone, näiteks makrod, avaldised, vahendid programmi modulaarsuse tagamiseks. Seda võib pidada autokoodiks (vt allpool), mida on laiendatud kõrgetasemeliste programmeerimiskeelte [2] [3] konstruktsioonidega. See sõltub oluliselt platvormist. Assamblee keeled pole erinevate riistvaraplatvormide jaoks ühilduvad, kuigi need võivad olla üldjoontes sarnased.

    Vene keeles võib seda nimetada lihtsalt "assembleriks" (tüüpilised väljendid nagu "kirjutage programm assemblerisse"), mis on rangelt öeldes vale, kuna assembler viitab utiliidile programmi tõlkimiseks assamblee keelest arvuti masinakoodiks.

    Autokood on programmeerimiskeel, mille laused oma ülesehituselt sarnanevad põhimõtteliselt konkreetse masinakeele käskude ja töödeldud andmetega [3].

    Sisu

    • 1 Üldine määratlus
    • 2 Keele sisu
    • 3 funktsioonid
    • 4 Piirangud
    • 5 Rakendus
      • 5.1 Programmide linkimine erinevates keeltes
    • 6 Süntaks
      • 6.1 Käsukomplekt
      • 6.2 Juhised
      • 6.3 Tüüpiline käsusalvestuse formaat
      • 6.4 Direktiivid
      • 6.5 Programmi näide
    • 7 Ajalugu ja terminoloogia
    • 8 Märkused
    • 9 Kirjandus
    • 10 Viited

    Üldine määratlus

    Assamblee keel on tähistussüsteem, mida kasutatakse hõlpsasti loetavas vormis masinkoodiga kirjutatud programmide esitamiseks. Assamblee keel võimaldab programmeerijal kasutada tähestikulisi mnemoonilisi opkoode, omistada oma äranägemise järgi arvutiregistritele ja mälule sümboolseid nimesid ning täpsustada ka enda jaoks mugavaid adresseerimisskeeme (näiteks indeks või kaudne). Lisaks võimaldab see kasutada arvkonstandide tähistamiseks erinevaid arvusüsteeme (näiteks kümnend- või kuueteistkümnendkohti) ning võimaldab märkida programmiridu sümbolnimedega siltidega, nii et neile oleks võimalik teistelt juurde pääseda (nime, mitte aadressi järgi) programmi osad (näiteks juhtimise edastamiseks) [4].

    Assamblee keeleprogrammi tõlkimine käivitatavaks masinkoodiks (avaldiste arvutamine, makrode laiendamine, mnemotehnika asendamine masinkoodide õigete ja sümboolsete aadressidega absoluut- või suhteaadresside jaoks) teostab assembler - tõlkeprogramm, mis andis assamblee keelele nime.

    Keele sisu

    Montaažikeele juhised vastavad üks-ühele protsessori juhistele. Tegelikult esindavad need käskude ja nende argumentide inimsõbralikumat märgistamise vormi - mälukoode. Sellisel juhul võivad ühele koostekeele käsule vastata mitu protsessori juhiste versiooni [5].

    Lisaks võimaldab assamblee keel kasutada mälurakkude aadresside asemel sümboolseid silte, mis kokkupaneku ajal asendatakse monteerija või linkeri arvutatud absoluutsete või suhteliste aadressidega, samuti nn direktiividega (montaažijuhised, mida ei tõlgita protsessori masinjuhisteks, vaid täidab monteerija ise).

    Assembleri direktiivid võimaldavad eelkõige kaasata andmeplokke, määrata programmi fragmendi komplekteerimise tingimuste järgi, määrata siltide väärtusi, kasutada parameetritega makrosid.

    Igal protsessorite mudelil (või perekonnal) on oma komplekt - süsteem - juhised ja vastav monteerimiskeel. Kõige populaarsemad assamblee keele süntaksid on Inteli süntaks ja AT&T süntaks.

    On arvuteid, mis rakendavad kõrgetasemelist masinprogrammeerimiskeelt (Fort, Lisp, El-76). Tegelikult toimivad nad sellistes arvutites assamblee keeltena..

    Võimed

    Assamblee keele kasutamine annab programmeerijale hulga funktsioone, mis tavaliselt pole kõrgetasemelistes keeltes programmeerimisel saadaval. Enamik neist on seotud keele lähedusega riistvaraplatvormile..

    • Võimalus riistvaraplatvormi kõiki funktsioone maksimaalselt ära kasutada võimaldab teoreetiliselt kirjutada antud protsessori jaoks võimalikult kiire ja kompaktseima koodi. Osav programmeerija suudab reeglina programmi optimeerida kõrgel tasemel keelest koosneva tõlkijaga ühes või mitmes parameetris ning luua Pareto optimaalsele lähedase koodi (reeglina saavutatakse programmi jõudlus koodi pikendades ja vastupidi):
      • tänu protsessori ressursside ratsionaalsemale kasutamisele, näiteks kõigi lähteandmete kõige tõhusamale paigutamisele registritesse, on võimalik välistada tarbetud kõned RAM-ile;
      • arvutuste käsitsi optimeerimise, sealhulgas vahetulemuste efektiivsema kasutamise tõttu saab koodi mahtu vähendada ja programmi kiirust suurendada.
    • Võimalus otse riistvarale juurde pääseda, eriti sisend- / väljundportidele, konkreetsetele mäluaadressidele, protsessorite registritele (seda võimalust piirab aga oluliselt asjaolu, et paljudes operatsioonisüsteemides on töökindluse tõttu blokeeritud otsene juurdepääs rakendusprogrammidest välisseadmete registritesse kirjutamiseks süsteemi töö).

    Koostaja kasutamisel pole loomisel praktiliselt ühtegi alternatiivi:

    • riistvaradraiverid ja operatsioonisüsteemi tuum (vähemalt OS-i tuuma masinast sõltuvad alamsüsteemid), kui on oluline ajutiselt kooskõlastada perifeerseadmete töö keskprotsessoriga;
    • programmid, mis peavad olema piiratud ROM-is ja / või töötama piiratud jõudlusega seadmetes (püsivaraarvutid ja mitmesugused elektroonilised seadmed)
    • kõrgetasemeliste keelte kompilaatorite ja tõlkide platvormist sõltuvad komponendid, süsteemiteegid ja kood, mis rakendab platvormi ühilduvust.

    Eraldi võib märkida, et demonteerimisprogrammi abil on võimalik kompileeritud programm teisendada montaažikeele programmiks. Enamasti on see ainus (ehkki äärmiselt aeganõudev) viis programmi algoritmide ümbertöötamiseks, kui selle lähtekood kõrgel tasemel keeles pole saadaval..

    Piirangud

    • Montaažikeele masinaorientatsiooni ("madala taseme") tõttu on inimesel selles sisalduvat programmi keerulisem lugeda kui kõrgetasemelisi programmeerimiskeeli. See raskendab tõsiselt assamblee keeles kirjutatud programmide hooldamist..
    • Assamblee keeleprogramm koosneb väga "väikestest" elementidest - vastavalt masinjuhistele, vastavalt juhistele on programmi maht proportsionaalselt suurem. Kuna programmeerija saab, nagu teate, kirjutada ja siluda ajaühikus ligikaudu sama palju operaatoreid, olenemata keelest, milles ta kirjutab, osutub suurte programmide väljatöötamine assembleris palju aeglasemaks.
    • Programmeerimine ja silumine muutuvad keerukamaks, töömahukus ja vigade sissetoomise tõenäosus kasvavad.
    • Kvaliteedikoodi saamiseks on vaja programmeerija kõrgemat kvalifikatsiooni: keskmine programmeerija koostekeeles kirjutatud kood pole tavaliselt parem ega isegi halvem kui kood, mille optimeeriv kompilaator genereerib kõrgetasemelises keeles kirjutatud võrreldavate programmide jaoks [6]. Pealegi, mida suurem on programmi maht, seda väiksem on kasum montaažikeele kasutamisest..
    • Kõrgetasemelise programmi saab uue sihtplatvormi iseärasuste jaoks automaatselt optimeerida [7], samal ajal kui uue platvormi assamblee keeles olev programm võib kaotada oma kiiruseeelise ilma koodi käsitsi ümber kirjutamata [8] [9].
    • Võrreldes tänapäevaste tööstuslike programmeerimiskeeledega on saadaval üldiselt vähem teeke.
    • Programme ei saa teisaldada arvutisse, millel on erinev arhitektuur ja käskude komplekt.

    Rakendus

    Ajalooliselt, kui masinakoode peetakse programmeerimiskeelte esimeseks põlvkonnaks, siis võib assamblee keelt pidada programmeerimiskeelte teiseks põlvkonnaks. Assamblee keele puudused, sellel suurte tarkvarasüsteemide väljatöötamise keerukus viisid kolmanda põlvkonna keelte - kõrgetasemeliste programmeerimiskeelte (näiteks Fortran, Lisp, Cobol, Pascal, C jne) tekkimiseni. Infotehnoloogia tööstuses kasutatakse tänapäeval peamiselt kõrgetasemelisi programmeerimiskeeli ja nende pärijaid. Kuid montaažikeeled säilitavad oma niši tänu oma ainulaadsetele eelistele tõhususe ja võime kohta konkreetse platvormi eripära täielikult kasutada..

    Programmid või nende fragmendid kirjutatakse assamblee keeles, kui need on kriitiliselt olulised:

    • jõudlus (draiverid, mängud);
    • kasutatud mälu maht (alglaadimissektorid, manustatud tarkvara, mikrokontrollerite ja piiratud ressurssidega protsessorid, viirused, tarkvarakaitsed).

    Koostekeelse programmeerimise abil saadakse järgmine:

    • Kiiruskriitiliste programmiosade optimeerimine programmides kõrgetasemelistes keeltes, näiteks C ++ või Pascal. See kehtib eriti fikseeritud jõudlusega mängukonsoolide ja multimeediakoodekite kohta, mis muudavad need vähem ressursimahukaks ja kiiremaks..
    • Operatsioonisüsteemide (OS) või nende komponentide loomine. Praegu on valdav osa operatsioonisüsteemidest kirjutatud kõrgema taseme keeltes (peamiselt C-keeles - kõrgetasemeline keel, mis loodi spetsiaalselt ühe esimese UNIX-i versiooni kirjutamiseks). Riistvarast sõltuvad kooditükid, näiteks operatsioonisüsteemi laadur, riistvara abstraktsioonikiht ja kernel, kirjutatakse sageli koostekeeles. Tegelikult on Windowsi või Linuxi tuumades koostekoode väga vähe, kuna autorid püüdlevad portatiivsuse ja usaldusväärsuse poole, kuid on siiski olemas. Mõned harrastajate operatsioonisüsteemid, näiteks MenuetOS ja KolibriOS, on kirjutatud täielikult assamblee keeles. Samal ajal paigutatakse MenuetOS ja KolibriOS disketile ning sisaldavad graafilist mitme akna liidest.
    • Mikrokontrollerite (MC) ja muude sisseehitatud protsessorite programmeerimine. Professor Tanenbaumi sõnul kordab MC areng tänapäevaste arvutite ajaloolist arengut [10]. Nüüd (2013) kasutatakse MK-programmeerimisel väga sageli assamblee keelt (ehkki sellised keeled nagu C on ka selles valdkonnas laialt levinud). MCU-s peate liikuma üksikud baidid ja bitid erinevate mälurakkude vahel. MK-programmeerimine on väga oluline, kuna Tanenbaumi sõnul on tänapäevase tsiviliseeritud inimese autos ja korteris keskmiselt 50 mikrokontrollerit [11]..
    • Juhi loomine. Draiverid (või mõned nende tarkvaramoodulid) on programmeeritud koostekeeles. Ehkki praegu kipuvad autojuhid kirjutama ka kõrgetasemelistes keeltes (usaldusväärse draiveri kirjutamine kõrgel tasemel on palju lihtsam), tulenevad tänapäevaste protsessorite kõrgendatud usaldusväärsuse ja piisava jõudluse nõuded (kiire jõudlus tagab seadme ja protsessori protsesside ajalise kooskõlastamise) ning kompilaatorite piisava täiuslikkuse koos kõrgetasemelised keeled (loodud koodis pole asjatut andmeedastust), valdav enamus tänapäevastest draiveritest on kirjutatud assamblee keeles. Draiverite töökindlus on eriti oluline, kuna Windows NT ja UNIX-is (sh Linux) töötavad draiverid süsteemi kerneli režiimis. Üks peen viga draiveris võib kogu süsteemi kokku kukkuda.
    • Antiviiruste ja muude kaitseprogrammide loomine.
    • Programmeerimiskeelte tõlkijate madala taseme raamatukogude koodi kirjutamine.

    Programmide linkimine erinevates keeltes

    Kuna pikka aega on assamblee keeles kodeeritud ainult programmide fragmendid, tuleb need linkida ülejäänud tarkvarasüsteemiga, mis on kirjutatud teistes programmeerimiskeeltes. Seda tehakse kahel peamisel viisil:

    • Koostamise etapis - inline assembleri fragmentide sisestamine programmi lähtekoodi kõrgetasemelises keeles spetsiaalsete keeledirektiivide abil. Meetod on mugav andmete lihtsate teisenduste jaoks, kuid täieõiguslikku koostekoodi koos andmete ja alamprogrammidega, sealhulgas paljude sisendite ja väljunditega alamprogramme, mida kõrgetasemeline keel ei toeta, ei saa sellega teha..
    • Lingi etapis eraldi koostamisel. Komponeeritavate moodulite interaktsiooniks piisab, kui imporditud funktsioonid (mõnes moodulis määratletud ja teistes kasutatavad) toetavad teatud helistamiskonventsioone. Üksikuid mooduleid saab kirjutada mis tahes keeltes, sealhulgas montaažikeeles..

    Süntaks

    Assamblee keele süntaks määratakse konkreetse protsessori käsuhulgaga.

    Käsukomplekt

    Tüüpilised koostekeele käsud on (enamik näiteid on toodud Inteli x86 arhitektuurisüntaksis):

    • Andmeedastuskäsklused (mov jne)
    • Aritmeetilised käsud (add, sub, imul jne)
    • Loogilised ja bitipõhised toimingud (või, ja, xor, shr jne)
    • Käsud programmi täitmise juhtimiseks (jmp, loop, ret jne)
    • Käskude katkestamise katkestamine (mõnikord nimetatud ka juhtimiskäskudeks): int
    • I / O käsud pordidele (sisse, välja)
    • Mikrokontrollerite ja mikroarvutite jaoks on iseloomulikud ka käsud, mis teostavad kontrolli ja üleminekut tingimuste järgi, näiteks:
    • cjne - hüppa kui mitte võrdne
    • djnz - kahanemine ja kui tulemus pole null, siis mine
    • cfsneq - võrrelge ja kui see pole võrdne, jätke järgmine käsk vahele

    Juhised

    Tüüpiline käskude salvestamise formaat

    kus mnemoonika on protsessorile antud käsu tegelik mnemoonika. Sellele saab lisada eesliiteid (kordused, adresseerimistüübi muutused jne).

    Operandid võivad olla konstandid, registriaadressid, RAM-is olevad aadressid jne. Inteli ja AT&T süntakside erinevused on seotud peamiselt operandide loendamise järjekorraga ja erinevate aadressimismeetodite täpsustamisega.

    Kasutatavad mnemotehnika on tavaliselt sama arhitektuuri või arhitektuuriperekonna kõigi protsessorite jaoks ühesugune (laialt tuntud protsessorite ja kontrollerite mnemotehnika x86, ARM, SPARC, PowerPC, M68k). Neid kirjeldatakse protsessori spetsifikatsioonis. Võimalikud erandid:

    • kui monteerija kasutab platvormidevahelist AT & T süntaksit (algsed mnemotehnika muudetakse AT&T süntaksiks);
    • kui algselt oli mnemotehnika kirjutamiseks kaks standardit (käsusüsteem päriti teise tootja protsessorilt).

    Näiteks pärandas Zilog Z80 protsessor Inteli 8080 käskude komplekti, laiendas seda ja muutis omal moel mnemotehnikat (ja registrimärke). Motorola Fireballi protsessorid said Z80 käsustiku päranduseks, kärpides selle veidi alla. Samal ajal naasis Motorola ametlikult Inteli mnemotehnika juurde ja hetkel töötavad pooled Fireballi monteerijatest Inteli ja pooled Zilogi mäluvõtetega..

    Direktiivid

    Assamblee keeleprogramm võib sisaldada direktiive: juhiseid, mis ei tõlgita otse masinakäskudeks, kuid kontrollivad kompilaatori tööd. Nende kogum ja süntaks erinevad märkimisväärselt ja sõltuvad mitte riistvaraplatvormist, vaid kasutatavast tõlkijast (mis annab alguse sama arhitektuuriperekonna keelte murretele). "Härrasmeeste komplektina" võib eristada järgmist:

    • andmete määratlus (konstandid ja muutujad),
    • programmi korralduse haldamine mälus ja väljundfailide parameetrites,
    • kompilaatori režiimi seadistamine,
    • igasugused abstraktsioonid (see tähendab kõrgetasemeliste keelte elemendid) - protseduuride ja funktsioonide kavandamisest (protseduurilise programmeerimisparadigma rakendamise lihtsustamiseks) tingimuslike konstruktsioonide ja tsükliteni (struktureeritud programmeerimisparadigma jaoks),
    • makrod.

    Näidisprogramm

    Programminäited Tere, maailm! erinevate platvormide ja erinevate murrete jaoks:

    Lisateavet Migreeni