Assamblee keele juhiste struktuur sisaldab. Kokkuvõte: Plaan: Eessõna. Assamblee keel ja juhiste struktuur. Exe-faili struktuur (semantiline parsimine). Assamblee keele põhitõed

1. Arvuti arhitektuur……………………………………………………………………5

    1.1. Registrid.

    1.1.1 Registrid Üldine otstarve.

1.1.2. segmendiregistrid

1.1.3 Lipuregister

1.2. Mälu korraldus.

1.3. Andmete esitus.

1.3.1 Andmetüübid

1.3.2 Tähemärkide ja stringide esitus

2. Montaažiprogrammi avaldused ………………………………………

    1. Assamblee keele käsud

2.2. Adresseerimisrežiimid ja masinakäskude vormingud

3. Pseudooperaatorid ………………………………………………………….

3.1 Andmete määratlemise direktiivid

3.2 Montaažiprogrammi struktuur

3.2.1 Programmi lõigud. eeldada käskkirja

3.2.3 Lihtsustatud segmenteerimisdirektiiv

4. Programmi kokkupanek ja sidumine …………………………….

5. Andmeedastuskäsud……………………………………………….

    5.1 Üldised käsud

    5.2 Virna käsud

5.3 I/O käsud

5.4 Aadresside edastamise käsud

5.5 Lipu edastamise käsud

6. Aritmeetilised käsud ………………………………………………….

    6.1 Aritmeetilised toimingud kahendtäisarvudega

6.1.1 Liitmine ja lahutamine

6.1.2 Käsud vastuvõtja suurendamiseks ja vähendamiseks ühe võrra

6.2 Korrutamine ja jagamine

6.3 Märgi muutmine

7. Loogilised tehted …………………………………………………….

8. Vahetused ja tsüklilised nihked ……………………………………………

9. Stringitehted ……………………………………………………….

10. Programmide loogika ja korraldus …………………………………………

10.1 Tingimusteta hüpped

10.2 Tingimuslikud hüpped

10.4 Protseduurid montaažikeeles

10.5 Katkestab INT

10.6 Süsteemitarkvara

10.6.1.1 Klaviatuuri lugemine.

10.6.1.2 Tähemärkide kuvamine ekraanil

10.6.1.3 Programmide lõpetamine.

10.6.2.1 Kuvarežiimide valimine

11. Kettamälu ………………………………………………………………..

11.2 Failide eraldamise tabel

11.3 Ketta sisend/väljund

11.3.1 Faili kirjutamine kettale

11.3.1.1 ASCIIZ andmed

11.3.1.2 Faili number

11.3.1.3 Kettafaili loomine

11.3.2 Kettafaili lugemine

Sissejuhatus

Assamblee keel on masinkeele sümboolne esitus. Kõiki personaalarvuti (PC) protsesse kõige madalamal, riistvara tasemel juhivad ainult masinakeele käsud (juhised). Riistvaraga seotud probleeme (või veelgi enam riistvaraga seotud probleeme, näiteks programmi kiiruse parandamist) on võimatu lahendada ilma monteerija teadmisteta.

Assembler on mugav käsuvorm otse arvutikomponentide jaoks ja nõuab teadmisi neid komponente sisaldava integraallülituse, nimelt arvuti mikroprotsessori omadustest ja võimalustest. Seega on montaažikeel otseselt seotud arvuti sisemise korraldusega. Ja pole juhus, et peaaegu kõik kõrgetasemeliste keelte kompilaatorid toetavad juurdepääsu assembleri programmeerimistasemele.

Professionaalse programmeerija ettevalmistuse üks element on tingimata komplekteerija õpe. Selle põhjuseks on asjaolu, et montaažikeele programmeerimine eeldab arvutiarhitektuuri tundmist, mis võimaldab luua tõhusamaid programme teistes keeltes ja kombineerida neid montaažikeelsete programmidega.

Käsiraamat käsitleb Inteli mikroprotsessoritel põhinevate arvutite programmeerimist assemblerkeeles.

See õpetus on adresseeritud kõigile, kes tunnevad huvi protsessori arhitektuuri ja Assembly keeles programmeerimise põhitõdede vastu, ennekõike tarkvaratoote arendajatele.

    PC arhitektuur.

Arvuti arhitektuur on arvuti abstraktne esitus, mis peegeldab selle struktuuri, vooluahelaid ja loogilist ülesehitust.

Kõigil kaasaegsetel arvutitel on mõned ühised ja individuaalsed arhitektuurilised omadused. Üksikud omadused on omased ainult konkreetsele arvutimudelile.

Arvutiarhitektuuri mõiste hõlmab järgmist:

    arvuti plokkskeem;

    arvuti plokkskeemi elementidele juurdepääsu vahendid ja meetodid;

    registrite komplekt ja kättesaadavus;

    adresseerimise korraldus ja meetodid;

    arvutiandmete esitusviis ja vorming;

    arvutimasina juhiste komplekt;

    masinjuhiste vormingud;

    katkestada käsitlemine.

Arvuti riistvara põhielemendid: süsteemiüksus, klaviatuur, kuvaseadmed, kettaseadmed, trükiseadmed (printer) ja erinevad sidevahendid. Süsteemiplokk koosneb emaplaadist, toiteallikast ja lisaplaatide laienduspesadest. Emaplaat sisaldab mikroprotsessorit, kirjutuskaitstud mälu (ROM), RAM(RAM) ja kaasprotsessor.

      Registrid.

Mikroprotsessori sees sisaldub teave 32 registrist (16 kasutajat, 16 süsteemi) koosnevas rühmas, mis on programmeerijale enam-vähem saadaval. Kuna käsiraamat on pühendatud mikroprotsessori 8088-i486 jaoks programmeerimisele, on kõige loogilisem alustada seda teemat kasutajale kättesaadavate mikroprotsessori sisemiste registrite üle.

Programmeerija kasutab kasutajaregistreid programmide kirjutamiseks. Need registrid hõlmavad järgmist:

    kaheksa 32-bitist registrit (üldotstarbelised registrid) EAX/AX/AH/AL, EBX/BX/BH/BL, ECX/CX/CH/CL, EDX/DX/DLH/DL, EBP/BP, ESI/SI, EDI/DI, ESP/SP;

    kuus 16-bitist segmendiregistrit: CS,DS, SS, ES, FS,GS;

    oleku- ja juhtimisregistrid: EFLAGS/FLAGS lipuregister ja EIP/IP käsuosurite register.

Ühe 32-bitise registri osad on näidatud kaldkriipsuga. Eesliide E (Extended) tähistab 32-bitise registri kasutamist. Baitidega töötamiseks kasutatakse registreid eesliidetega L (madal) ja H (kõrge), näiteks AL, CH - mis tähistab registrite 16-bitiste osade madalaid ja kõrgeid baite.

        Üldregistrid.

EAX/AX/AH/AL (akuregister) – aku. Kasutatakse korrutamisel ja jagamisel, I/O operatsioonidel ja mõnes stringioperatsioonis.

EBX/BX/BH/BL – baasregister(baasregister), kasutatakse sageli mälus olevate andmete adresseerimisel.

ECX/CX/CH/CL – loendur(loendusregister), kasutatakse silmuse korduste arvu loendurina.

EDX/DX/DH/DL – andmeregister(andmeregister), kasutatakse vaheandmete säilitamiseks. Mõned käsud nõuavad seda.

Kõik selle grupi registrid võimaldavad juurdepääsu nende "alumistele" osadele. Eneseaddresseerimiseks saab kasutada ainult nende registrite alumisi 16- ja 8-bitisi osi. Nende registrite ülemised 16 bitti pole iseseisvate objektidena saadaval.

Stringitöötluskäskude toetamiseks, mis võimaldavad 32, 16 või 8 biti pikkuste elementide stringide järjestikust töötlemist, kasutatakse järgmist:

ESI/SI (allikaindeksi register) – indeks allikas. Sisaldab praeguse lähteelemendi aadressi.

EDI/DI (kaugusindeksi register) – indeks vastuvõtja(saaja). Sisaldab sihtkoha stringis praegust aadressi.

Mikroprotsessori arhitektuur riist- ja tarkvara tasemel toetab andmestruktuuri – pinu. Virnaga töötamiseks on olemas erimeeskonnad ja eriregistrid. Tuleb märkida, et virn täidetakse väiksemate aadresside suunas.

ESP/SP (virnu osutaja register) – Registreeri osuti virna. Sisaldab kursorit praeguses virnasegmendis virna ülaossa.

EBP/BP (baasosurite register) – pinu baaskursori register. Mõeldud virna sees olevatele andmetele juhusliku juurdepääsu korraldamiseks.

1.1.2. segmendiregistrid

Mikroprotsessori tarkvara mudelil on kuus segmentide registrid: CS, SS, DS, ES, GS, FS. Nende olemasolu on tingitud Inteli mikroprotsessorite RAM-i korralduse ja kasutamise eripäradest. Mikroprotsessori riistvara toetab programmi struktuurset korraldust, mis koosneb segmendid. Saadaolevate segmentide määramiseks Sel hetkel segmendiregistrid. Mikroprotsessor toetab järgmist tüüpi segmente:

    koodi segment. Sisaldab programmikäske Selle segmendi juurde pääsemiseks kasutage CS-registrit (koodisegmendi register) - segmendi koodide register. See sisaldab masina käsusegmendi aadressi, millele mikroprotsessoril on juurdepääs.

    andmesegment. Sisaldab programmi poolt töödeldud andmeid. Sellele segmendile juurdepääsuks kasutatakse DS-registrit (andmesegmendi registrit) - segmendi andmeregister, mis salvestab praeguse programmi andmesegmendi aadressi.

    Virna segment. See segment on mälupiirkond, mida nimetatakse virnaks. Mikroprotsessor korraldab virna vastavalt põhimõttele - esimene "tuli", esimene "lahkus". Virule juurde pääsemiseks kasutatakse SS-registrit (virnasegmendiregistrit) - virna segmendiregister A, mis sisaldab virnasegmendi aadressi.

    Täiendav andmesegment. Töödeldavad andmed võivad olla kolmes täiendavas andmesegmendis. Vaikimisi eeldatakse, et andmed on andmesegmendis. Täiendavate andmesegmentide kasutamisel tuleb nende aadressid selgesõnaliselt määrata, kasutades käsus spetsiaalseid segmendi ümberdefineerimise eesliiteid. Täiendavate andmesegmentide aadressid peavad sisalduma registrites ES, GS, FS (laiendusandmesegmendi registrid).

        Juhtimis- ja olekuregistrid

Mikroprotsessor sisaldab mitmeid registreid, mis sisaldavad teavet nii mikroprotsessori enda kui ka programmi oleku kohta, mille käsud on hetkel konveierisse laaditud. See on:

EIP/IP käsukursori register;

    EFLAGS/FLAGS lipuregister.

Nende registrite abil saate teavet käsu täitmise tulemuste kohta ja mõjutada mikroprotsessori enda olekut.

EIP/IP (juhiste osuti register) – osuti käske. EIP/IP register on 32 või 16 bitti lai ja sisaldab järgmise täidetava käsu nihet CS segmendi registri sisu suhtes praeguses käsusegmendis. See register ei ole otseselt ligipääsetav, kuid seda muudavad hüppejuhised.

LIPUD/LIPUD (lipuregister) – Registreeri lipud. Biti sügavus 32/16 bitti. Selle registri üksikutel bittidel on konkreetne funktsionaalne eesmärk ja neid nimetatakse lippudeks. Lipp on bitt, mille väärtus on 1 (lipp on seatud), kui mõni tingimus on täidetud, ja 0 (lipp on kustutatud) muul juhul. Selle registri alumine osa on täiesti analoogne i8086 jaoks mõeldud FLAGS-registriga.

1.1.3 Lipuregister

Lipuregister on 32-bitine ja kannab nime EFLAGS (joonis 1). Registri üksikutel bittidel on konkreetne funktsionaalne eesmärk ja neid nimetatakse lippudeks. Igale neist on määratud konkreetne nimi (ZF, CF jne). EFLAGS-i alumised 16 bitti esindavad 16-bitist FLAGS-registrit, mida kasutatakse i086 ja i286 mikroprotsessorile kirjutatud programmide täitmisel.

Joon.1 Lippude register

Mõnda lippu nimetatakse tingimuslippudeks; need muutuvad automaatselt käskude täitmisel ja fikseerivad oma tulemuse teatud omadused (näiteks kas see võrdub nulliga). Teisi lippe nimetatakse riigilippudeks; need muutuvad programmist ja mõjutavad protsessori edasist käitumist (näiteks blokeerivad katkestused).

Seisundi lipud:

CF (kanalipp) – lippu kandma. Väärtuse 1 saab, kui täisarvude lisamisel ilmnes kandeühik, mis ei "mahtunud" bitiruudustikusse või kui märgita arvude lahutamisel oli esimene neist väiksem kui teine. Nihutuskäskudes sisestatakse võrgust väljas olev bitt CF-i. CF parandab ka korrutamiskäsu omadused.

OF (ülevoolu lipp) ülevoolu lipp. See määratakse 1-ks, kui märgiga täisarvude liitmisel või lahutamisel saadi tulemus, moodul ületab lubatavat väärtust (mantiss voolas üle ja see "ronis" märgibiti).

ZF (nulllipp) null lipp. Määrake väärtuseks 1, kui käsu tulemus on 0.

SF (märgilipp) – lipp märk. Seadke väärtusele 1, kui märgistatud numbritega tehtav tehing annab negatiivse tulemuse.

PF (paarsuse lipp) – lipp võrdsus. See on võrdne 1-ga, kui järgmise käsu tulemus sisaldab paarisarv kahendarvu. Tavaliselt võetakse seda arvesse ainult sisend-/väljundoperatsioonide ajal.

AF (abikandelipp) – täiendav kandelipp. Parandab kahendkümnendarvuga tehteid tehtavate funktsioonide omadused.

Olekulipud:

DF (suunalipp) suunalipp. Määrab stringikäskudes ridade skaneerimise suuna: DF=0 korral skaneeritakse ridu "edasi" (algusest lõpuni), DF=1 puhul - vastupidises suunas.

IOPL (sisend/väljundõigustase) – I/O privileegi tase. Kasutatakse mikroprotsessori kaitstud režiimis, et juhtida juurdepääsu I / O käskudele, sõltuvalt ülesande privileegist.

NT (pesastatud ülesanne) ülesande pesitsuslipp. Kasutatakse mikroprotsessori kaitstud režiimis, et salvestada fakt, et üks ülesanne on pesastatud teise sisse.

Süsteemi lipp:

IF (katkestuse lipp) – katkestuse lipp. IF=0 korral lõpetab protsessor talle saabuvatele katkestustele reageerimise, IF=1 korral katkestuste blokeerimine eemaldatakse.

TF (lõksu lipp) jälje lipp. TF=1 korral teeb protsessor peale iga käsu täitmist katkestuse (numbriga 1), mida saab kasutada programmi silumisel selle jälgimiseks.

RF (jätkamise lipp) jätkub lipp. Kasutatakse silumisregistrite katkestuste käsitlemisel.

VM (virtuaalne 8086 režiim) – virtuaalne 8086 lipp. 1 - protsessor töötab virtuaalses režiimis 8086. 0 - protsessor töötab reaal- või kaitstud režiimis.

AC (ALijoonduse kontroll) - joonduse juhtlipp. Mõeldud mälule juurdepääsul joonduse juhtimise võimaldamiseks.

      Mälu korraldus.

Füüsilist mälu, millele mikroprotsessoril on juurdepääs, nimetatakse töömälu ( või muutmälu RAM). RAM on baitide ahel, millel on oma kordumatu aadress (selle number), mida nimetatakse füüsiline. Füüsilise aadressi vahemik on 0 kuni 4 GB. Mäluhaldusmehhanism on täielikult riistvarapõhine.

Mikroprotsessor toetab mitut riistvaralise RAM-i kasutamise mudelit:

    segmenteeritud mudel. Selles mudelis on programmimälu jagatud külgnevateks mälupiirkondadeks (segmentideks) ja programm ise pääseb juurde ainult nendes segmentides olevatele andmetele;

    lehe mudel. Sel juhul käsitletakse RAM-i fikseeritud suurusega 4 KB plokkide komplektina. Selle mudeli põhirakendus on seotud virtuaalmälu korraldusega, mis võimaldab programmide jaoks kasutada rohkem mäluruumi kui on füüsiline mälu. Pentiumi mikroprotsessori puhul võib võimaliku virtuaalmälu suurus olla kuni 4 TB.

Nende mudelite kasutamine ja rakendamine sõltub mikroprotsessori töörežiimist:

    Päris aadressirežiim (reaalrežiim). Režiim sarnaneb i8086 protsessori tööga. Vajalik varajaste protsessorimudelite jaoks mõeldud programmide tööks.

    Kaitstud režiim. Kaitstud režiim võimaldab multitegumtööd informatsiooni töötlemine, mälukaitse, kasutades neljatasemelist privileegmehhanismi ja selle otsingut.

    Virtuaalne 8086 režiim. Selles režiimis on i8086 jaoks võimalik käivitada mitu programmi. Sel juhul võivad reaalrežiimi programmid töötada.

Segmenteerimine on adresseerimismehhanism, mis tagab mitme sõltumatu aadressiruumi olemasolu. Segment on sõltumatu riistvaratoega mäluplokk.

Üldjuhul võib iga programm koosneda suvalisest arvust segmentidest, kuid sellel on otsene juurdepääs kolmele peamisele: koodile, andmetele ja virnale – ning ühele kuni kolmele täiendavale andmesegmendile. Operatsioonisüsteem paigutab programmisegmendid RAM-i teatud füüsilistele aadressidele ja asetab seejärel nende aadresside väärtused vastavatesse registritesse. Segmendi sees pääseb programm aadressidele ligi segmendi alguse suhtes lineaarselt, st alustades aadressist 0 ja lõpetades segmendi suurusega võrdse aadressiga. Suhteline aadress või eelarvamus, mida mikroprotsessor kasutab segmendi andmetele juurdepääsuks, nimetatakse tõhus.

Füüsilise aadressi moodustamine reaalrežiimis

Reaalrežiimis on füüsilise aadressi vahemik 0 kuni 1 MB. Segmendi maksimaalne suurus on 64 KB. Kui viidatakse konkreetsele füüsiline aadress RAM määratakse segmendi alguse aadressi ja segmendisisese nihke järgi. Segmendi algusaadress võetakse vastavast segmendiregistrist. Sel juhul sisaldab segmendiregister ainult segmendi alguse füüsilise aadressi ülemist 16 bitti. 20-bitise aadressi puuduvad alumised neli bitti saadakse segmendiregistri väärtuse nihutamisel vasakule 4 biti võrra. Vahetusoperatsioon toimub riistvaras. Saadud 20-bitine väärtus on tegelik füüsiline aadress, mis vastab segmendi algusele. St füüsiline aadress on määratud kui "segment:nihe" paar, kus "segment" on esimesed 16 bitti selle mälusegmendi algusaadressist, kuhu lahter kuulub, ja "nihe" on selle lahtri 16-bitine aadress, mis on arvestatud alates selle mälulõigu algus (väärtus 16*segment +nihe annab lahtri absoluutaadressi). Kui näiteks CS-registris on salvestatud väärtus 1234h, siis aadressipaar 1234h:507h defineerib absoluutaadressi, mis võrdub 16*1234h+507h =12340h+507h = 12847h. Selline paar kirjutatakse topeltsõna kujul ja (nagu numbrite puhul) "ümberpööratud" kujul: esimene sõna sisaldab nihet ja teine ​​- segmenti, kõik need sõnad on omakorda esindatud "ümberpööratud" vorm. Näiteks paar 1234h:5678h kirjutataks järgmiselt:| 78 | 56| 34 | 12|.

See füüsilise aadressi moodustamise mehhanism võimaldab teil muuta tarkvara ümberpaigutatavaks, see tähendab, et see ei sõltu RAM-i konkreetsetest allalaadimisaadressidest.

Üldine teave montaažikeele kohta

Sümboolne montaažikeel võimaldab suures osas kõrvaldada masinkeelse programmeerimise puudused.

Selle peamine eelis on see, et assemblerkeeles on kõik programmi elemendid esindatud sümboolsel kujul. Teisendage sümboolsed käskude nimed nendeks kahendkoodid on määratud eriprogramm- assembler, mis vabastab programmeerija vaevarikkast tööst ja kõrvaldab vältimatud vead.

Assamblee keeles programmeerimisel kasutusele võetud sümboolsed nimed peegeldavad reeglina programmi semantikat ja käskude lühend - nende põhifunktsioon. Näiteks: PARAM - parameeter, TABLE - tabel, MASK - mask, ADD - liitmine, SUB - lahutamine jne. n. Sellised nimed jäävad programmeerijale kergesti meelde.

Assembly keeles programmeerimiseks on vaja keerukamaid tööriistu kui masinkeeles programmeerimiseks: vajate mikroarvutitel põhinevaid arvutisüsteeme või komplektiga personaalarvuteid välisseadmed(tähtnumbriline klaviatuur, tähemärkide ekraan, disketiseade ja printer), samuti resident- või ristprogrammeerimissüsteemid vajalike mikroprotsessorite tüüpide jaoks. Assembly keel võimaldab tõhusalt kirjutada ja siluda palju keerukamaid programme kui masinkeel (kuni 1–4 KB).

Koostekeeled on masinapõhised, st sõltuvad vastava mikroprotsessori masinakeelest ja struktuurist, kuna nad omistavad igale mikroprotsessori käsule kindla sümboolse nime.

Assamblee keeled suurendavad oluliselt programmeerijate tootlikkust võrreldes masinkeeltega ja säilitavad samal ajal võimaluse kasutada kõiki mikroprotsessori tarkvarale ligipääsetavaid riistvararessursse. See võimaldab kogenud programmeerijatel kirjutada programme, mis töötavad lühema ajaga ja võtavad vähem mälu kui kõrgetasemelises keeles kirjutatud programmid.

Sellega seoses on peaaegu kõik sisend-/väljundseadmete juhtimisprogrammid (draiverid) kirjutatud montaažikeeles, hoolimata üsna suure hulga kõrgetasemeliste keelte olemasolust.

Assamblee keelt kasutades saab programmeerija määrata järgmised parameetrid:

mikroprotsessori masinakeele iga käsu mnemoonika (sümboliline nimi);

standardformaat assembleris kirjeldatud programmi ridadele;

vormingu täpsustamiseks erinevaid viise adresseerimise ja käsu valikud;

vorming märgikonstantide ja konstantide määramiseks täisarvu tüüp erinevates numbrisüsteemides;

pseudokäsud, mis juhivad programmi kokkupanemise (tõlke) protsessi.

Assembly keeles kirjutatakse programm ridade kaupa, st iga käsu jaoks eraldatakse üks rida.

Enimlevinud mikroprotsessorite baasil ehitatud mikroarvutite puhul võib montaažikeele variante olla mitu, kuid praktiline jaotus on enamasti üks – see on nn standardne assemblerkeel.

Programmeerimine masinakäskude tasemel on minimaalne tase, mille juures programmeerimine on võimalik. Masina juhiste süsteem peab olema piisav vajalike toimingute teostamiseks arvuti riistvarale juhiseid väljastades.

Iga masinajuhend koosneb kahest osast:

tegutsemine - "mida teha" määramine;

· operand - töötlemisobjektide määratlemine, "mida teha".

Mikroprotsessori masinakäsklus, mis on kirjutatud montaažikeeles, on üks rida, millel on järgmine süntaktiline vorm:

sildi käsk/direktiiv operandi(d) ;kommentaarid

Sel juhul on rea kohustuslik väli käsk või käsk.

Silt, käsk/käsk ja operandid (kui neid on) eraldatakse vähemalt ühe tühiku või tabeldusmärgiga.

Kui käsku või käskkirja on vaja jätkata kl järgmine rida, siis kasutatakse kaldkriipsu: \.

Vaikimisi ei tee montaažikeel käskudes ega direktiivides vahet suur- ja väiketähtedel.

Otsene adresseerimine: efektiivne aadress määratakse otse masinakäsu nihkeväljaga, mille suurus võib olla 8, 16 või 32 bitti.

mov eax, summa ; eax = summa

Assembler asendab summa summa vastava andmesegmendis salvestatud aadressiga (vaikimisi adresseerib register ds) ja paneb aadressi summale salvestatud väärtuse registrisse eax.

kaudne adresseerimine on omakorda järgmist tüüpi:

Kaudne põhi- (registri-) adresseerimine;

Kaudne põhi- (registri-) adresseerimine nihkega;

· kaudne indeksaadress;

· kaudne baasindeksi adresseerimine.

Kaudne põhi- (registri-) adresseerimine. Selle adresseerimise korral võib operandi efektiivne aadress olla mis tahes üldotstarbelises registris, välja arvatud sp / esp ja bp / ebp (need on spetsiifilised registrid virnasegmendiga töötamiseks). Käskes süntaktiliselt väljendatakse seda adresseerimisrežiimi registri nime lisamisega nurksulgudesse.

mov eax, ; eax = *esi; *esi väärtus aadressil esi

Eesmärgi järgi saab käske eristada (sulgudes on näited arvutikoostaja, näiteks IBM PC, käskude mnemooniliste opkoodide kohta):

l hukkamine aritmeetilised tehted(ADD ja ADC - liitmised ja liitmised kandega, SUB ja SBB - lahutamine ja lahutamine laenuga, MUL ja IMUL - märgita ja märgiga korrutised, DIV ja IDIV - märgita ja märgiga jagamised, CMP - võrdlused jne. . . .);

l hukkamine loogilisi tehteid(VÕI, JA, EI, XOR, TEST jne);

l andmeedastus (MOV - saada, XCHG - vahetada, IN - mikroprotsessorisse siseneda, OUT - mikroprotsessorist välja võtta jne);

l juhtimise ülekandmine (programmi hargnemine: JMP - ilma tingimuslik hüpe, CALL - protseduuri kutsumine, RET - protseduurist naasmine, J* - tingimuslik hüpe, LOOP - tsükli juhtimine jne);

l märgistringide töötlemine (MOVS - ülekanded, CMPS - võrdlused, LODS - allalaadimised, SCAS - skannid. Neid käske kasutatakse tavaliselt koos eesliitega (kordusmuutja) ​​REP;

l programmi katkestused (INT - tarkvara katkestab, INTO - tingimuslikud katkestused ülevoolul, IRET - katkestusest naasmine);

l mikroprotsessori juhtimine (ST* ja CL* - lippude seadmine ja kustutamine, HLT - stopp, WAIT - ooterežiim, NOP - jõudeoleku jne).

Koos täielik nimekiri Assembleri käsud leiate töödest.

Andmeedastuskäsud

l MOV dst, src - andmeedastus (move - teisalda src-st dst-le).

Ülekanded: üks bait (kui src ja dst on baidivormingus) või üks sõna (kui src ja dst on sõnavormingus) registrite vahel või registri ja mälu vahel ning kirjutab kohese väärtuse registrisse või mällu.

Operandid dst ja src peavad olema sama vorminguga – bait või sõna.

Src võib olla tüüpi: r (register) - register, m (mälu) - mälu, i (impedants) - vahetu väärtus. Dst võib olla r, m tüüpi. Operande ei saa kasutada ühes käsus: rsegm koos i-ga; kaks operandi tüüpi m ja kaks operandi tüüpi rsegm). Operandi i võib olla ka lihtne väljend:

mov AX, (152 + 101B) / 15

Väljendi hindamine toimub ainult tõlkimise ajal. Lipud ei muutu.

l PUSH src - sõna asetamine virna (push - läbi suruma; lükka src-st virna). Tõukab src sisu virna ülaossa – mis tahes 16-bitise registri (kaasa arvatud segmendi) või kahe 16-bitise sõna sisaldava mälukoha peale. Lipud ei muutu;

l POP dst - sõna eraldamine virust (pop - pop; loendage virust dst-s). Eemaldab sõna virna ülaosast ja asetab selle dst-sse – mis tahes 16-bitisesse registrisse (kaasa arvatud segment) või kahte mälukohta. Lipud ei muutu.

Assamblee keele käsud (loeng)

LOENGU KAVA

1. Peamised operatsioonide rühmad.

Pentium.

1. Peamised operatsioonide rühmad

Mikroprotsessorid täidavad käskude komplekti, mis rakendavad järgmisi peamisi toimingute rühmi:

ekspedeerimistoimingud,

aritmeetilised tehted,

loogilised operatsioonid,

vahetusoperatsioonid,

võrdlus- ja katsetoimingud,

bitioperatsioonid,

Programmihaldustoimingud;

Protsessori juhtimistoimingud.

2. Protsessori käskude mnemokoodid Pentium

Käskude kirjeldamisel kasutatakse tavaliselt nende mnemoonilisi tähiseid (mnemoonilised koodid), mis on mõeldud käsu täpsustamiseks Assembly keeles programmeerimisel. Assembleri erinevate versioonide puhul võivad mõnede käskude mnemokoodid erineda. Näiteks alamprogrammi kutsumise käsu jaoks kasutatakse mnemokoodiHELISTAMA või JSR ("Hüppa alamprogramm”). Enamiku mikroprotsessorite põhitüüpide käskude mnemoonilised koodid on siiski samad või erinevad veidi, kuna need on vastavate ingliskeelsete sõnade lühendid, mis määratlevad sooritatava toimingu. Mõelge protsessorite jaoks kasutusele võetud käsumnemoonikale Pentium.

Käsklused edasi. Selle rühma peamine käsk on käskMOV , mis tagab andmeedastuse kahe registri või registri ja mäluelemendi vahel. Mõned mikroprotsessorid teostavad ülekande kahe mäluelemendi vahel, samuti mitme registri sisu grupiülekannet mälust. Näiteks 68 perekonna mikroprotsessorid Motorola xxx täitma käskuLIIKUMINE , mis tagab ülekande ühest mäluelemendist teise, ja käskuLIIKUMINE , mis kirjutab mällu või laeb mälust etteantud registrite komplekti (kuni 16 registrit) sisu. MeeskondXCHG teostab kahe protsessoriregistri või registri ja mäluelemendi sisu vastastikust vahetust.

Sisestuskäsud IN ja väljund VÄLJAS rakendama andmete edastamist töötleja registrist välisseadmesse või andmete vastuvõtmist välisseadmest registrisse. Need käsud määravad liideseseadme numbri (I/O port), mille kaudu andmeid edastatakse. Pange tähele, et paljudel mikroprotsessoritel pole juurdepääsuks spetsiaalseid juhiseid välisseadmed. Sel juhul toimub andmete sisestamine ja väljund süsteemis käsu abilMOV , mis määrab vajaliku liideseseadme aadressi. Seega adresseeritakse välisseade mäluelemendina ning aadressiruumis eraldatakse konkreetne sektsioon, milles asuvad süsteemiga ühendatud liideseseadmete (portide) aadressid.

Aritmeetiliste tehete käsud. Selle rühma peamised käsud on liitmine, lahutamine, korrutamine ja jagamine, millel on mitmeid võimalusi. Lisamise käsud LISAMA ja lahutamine SUB tehke vastavaid toiminguidcomades kahte registrit, registrit ja mälukohta, või kasutades vahetut operandit. Meeskonnad AD C , SB B sooritama liitmist ja lahutamist, võttes arvesse atribuudi väärtustC, seatud ülekande moodustamisel eelmise toimingu sooritamise protsessis. Nende käskude abil realiseeritakse operandide järjestikune liitmine, mille numbrite arv ületab protsessori võimsuse. Meeskond NEG muudab operandi märki, teisendades selle kahe täiendiks.

Korrutamise ja jagamise operatsioone saab teha märgiga arvudega (käsudma MUL, ma DIV ) või allkirjastamata (käsud MUL, DIV ). Operatsiooni tulemus asub registris. Korrutamisel (käsudMUL , IMUL ) annab kahekohalise tulemuse, mis kasutab mahutamiseks kahte registrit. Jagamisel (käsudDIV , IDIV ) dividendina kasutatakse kahekohalist operandit, mis paigutatakse kahte registrisse ning selle tulemusena kirjutatakse jagatis ja jääk kahte registrisse.

Loogikakäsud . Peaaegu kõik mikroprotsessorid sooritavad loogilisi operatsioone JA, VÕI, Exclusive VÕI, mis sooritatakse käskude abil samanimeliste operandibittidega JA, VÕI, X VÕI . Toiminguid tehakse kahe registri, registri ja mälukoha sisuga või vahetu operandi abil. Meeskond MITTE Inverteerib operandi iga biti väärtuse.

Shift käsud. Mikroprotsessorid teostavad adresseeritud operandide aritmeetilisi, loogilisi ja tsüklilisi nihkeid ühe või mitme biti võrra. Nihutatav operand võib olla registris või mälukohas ning nihkebittide arv määratakse käsus sisalduva vahetu operandi abil või määratakse kindlaks määratud registri sisuga. Ülekandemärk on tavaliselt kaasatud vahetuse elluviimisseColekuregistris (SR või LIPUD), mis sisaldab registrist või mälukohast välja tõmmatud operandi viimast bitti.

Võrdlus- ja testimiskäsud . Operandide võrdlemine toimub tavaliselt juhendigaCMP , mis teostab operandide lahutamist tunnuste väärtuste määramisega N, Z, V, C olekuregistris vastavalt tulemusele. Sel juhul lahutamise tulemust ei salvestata ja operandide väärtused ei muutu. Saadud tunnusväärtuste hilisem analüüs võimaldab meil kindlaks teha suhteline väärtus (>, <, =) операндов со знаком или без знака. Использование различных способов адресации позволяет производит сравнение содержимого двух регистров, регистра и ячейки памяти, непосредственно заданного операнда с содержимым регистра или ячейки памяти.

Mõned mikroprotsessorid täidavad testkäsku TST , mis on võrdluskäsu ühe operandi variant. Selle käsu täitmisel märgid seatakse N, Z vastavalt adresseeritud operandi märgile ja väärtusele (võrdne või nullist erinev).

Biti kasutamise juhised . Need käsud määravad atribuudi väärtuseColekuregistris vastavalt testitava biti väärtuselemiljardit adresseeritud operandis. Mõnes mikroprotsessoris seatakse vastavalt natuke testimise tulemusele märkZ. Testbiti numbernmääratakse kas käsus määratud registri sisu või vahetu operandiga.

Selle rühma käsud rakendavad testitava biti muutmiseks erinevaid võimalusi.. Käsk BT hoiab selle biti väärtuse muutumatuna.Käsk B T S pärast testimist määrab väärtuse miljardit=1 ja käsk B T C - tähendus miljardit=0. Käsk B T C inverteerib biti bn väärtuse pärast selle testimist.

Programmi haldamise toimingud. Programmi juhtimiseks kasutatakse suurt hulka käske, sealhulgas:

- tingimusteta juhtimisülekande käsud;

- tingimuslikud hüppekäsklused;

- käsud programmitsüklite korraldamiseks;

- katkestamise käsud;

- funktsioonide muutmise käsud.

Juhtimise tingimusteta üleandmine toimub käsugaJMP , mis laaditakse programmiloendurissePCuus sisu, mis on järgmise käivitatava käsu aadress. See aadress on kas otse käsus määratudJMP (otsene aadress) või arvutatakse praeguse sisu summanaPCja käsus määratud nihe, milleks on märgistatud arv (suhteline adresseerimine). NaguPCsisaldab järgmise programmikäsu aadressi, siis viimane meetod määrab hüppeaadressi, nihke järgmise aadressi suhtes etteantud arvu baitide võrra. Kui nihe on positiivne, siis minnakse üle programmi järgmistele käskudele, kui nihe on negatiivne, siis eelmistele.

Alamprogrammi kutsutakse välja ka juhtimise tingimusteta üleandmisel käsu abilHELISTAMA (või JSR ). Kuid sel juhul enne laadimistPC uus sisu, mis määrab alamprogrammi esimese käsu aadressi, on vaja salvestada selle praegune väärtus (järgmise käsu aadress), et tagada pärast alamprogrammi täitmist tagasipöördumine põhiprogrammi (või eelmine alamprogramm alamprogrammide pesastamisel). Tingimuslikud hüppejuhised (programmi harud) laaditakse sissePCuus sisu, kui on täidetud teatud tingimused, mis tavaliselt seatakse erinevate atribuutide hetkeväärtuse järgi olekuregistris. Kui tingimus ei ole täidetud, siis käivitatakse järgmine programmikäsk.

Tunnuste haldamise käsud võimaldavad kirjutamist - tunnuseid salvestava olekuregistri sisu lugemist, samuti üksikute tunnuste väärtuste muutmist. Näiteks Pentiumi protsessorid rakendavad käske LAHF ja SAHF , mis laadivad olekuregistrist madala baidi, mis sisaldab märke EFLAG registri madalale baidile EAX ja polsterdus madal bait LIPUD registrist E AX.. Käsud CLC, STC määrake edastuslipu CF=0, CF=1 ja käsu väärtused CMC põhjustab selle funktsiooni väärtuse ümberpööramise. Kuna tunnused määravad programmi täitmise voo tingimuslike hüpete ajal, kasutatakse programmi juhtimiseks tavaliselt tunnuste muutmise juhiseid.

Protsessori juhtimiskäsud . Sellesse rühma kuuluvad seiskamiskäsud, toimingu puudumine ja hulk käske, mis määravad protsessori või selle üksikute plokkide töörežiimi. MeeskondHLT lõpetab programmi täitmise ja paneb protsessori seiskamisolekusse, millest väljumine toimub katkestus- või taaskäivitussignaalide saamisel ( lähtestada). Meeskond NOP Programmi viivituste rakendamiseks või programmis tekkinud lünkade täitmiseks kasutatakse käsku (“tühi”), mis ei põhjusta mingeid toiminguid.

Spetsiaalsed meeskonnad CLI, STI keelata ja lubada katkestustaotluste teenus. Protsessorites Pentium selleks kasutatakse juhtbitti (lippu).KUI registris LIPUD.

Paljud kaasaegsed mikroprotsessorid annavad välja identifitseerimiskäskluse, mis võimaldab kasutajal või muudel seadmetel saada teavet antud süsteemis kasutatava protsessori tüübi kohta. Protsessorites Pentuim selleks käsk on mõeldud CPUID , mille käigus sisenevad registritesse vajalikud andmed töötleja kohta EAX,ebx,ECX,EDX ja seejärel saab kasutaja või operatsioonisüsteem seda lugeda.

Sõltuvalt protsessori rakendatavatest töörežiimidest ja töödeldud andmete määratletud tüüpidest saab käivitatavate käskude komplekti oluliselt laiendada.

Mõned protsessorid teostavad aritmeetilisi tehteid BCD numbritega või täidavad selliste arvude töötlemisel spetsiaalseid tulemuste parandamise juhiseid. Paljud suure jõudlusega protsessorid hõlmavad FPU - numbritöötlusplokk c "ujukopp".

Paljudes kaasaegsetes protsessorites on rakendatud mitme täisarvu või arvu rühmatöötlust. c “ujukoma” ühe käsuga vastavalt põhimõttele SIMD (“Single Instruction – Multiple Data ”) - "Üks käsk – palju andmeid". Toimingute samaaegne täitmine mitmel operandil suurendab oluliselt protsessori jõudlust video- ja heliandmetega töötamisel. Selliseid toiminguid kasutatakse laialdaselt pilditöötluses, helisignaali töötlemises ja muudes rakendustes. Nende toimingute tegemiseks sisestatakse protsessoritesse spetsiaalsed plokid, mis rakendavad vastavaid käskude komplekte, mis erinevat tüüpi protsessorites ( Pentium, Athlon) sai nimeMMX (“ Milti-Meedia laiendus ”) – multimeediumilaiend,SSE(“ SIMD voogesituse laiendus ”) – SIMD voogesitus - laiendus, “3 DLaiendus- 3D-laiendus.

Ettevõtte protsessorite iseloomulik tunnus Intel , alustades mudelist 80286, on prioriteedi juhtimine mälule juurdepääsul, mis antakse siis, kui protsessor töötab kaitstud virtuaalse aadressi režiimis - " Kaitstud režiim ” (kaitstud režiim). Selle režiimi rakendamiseks kasutatakse spetsiaalseid käskude rühmi, mille eesmärk on korraldada mälukaitset vastavalt aktsepteeritud prioriteetse juurdepääsu algoritmile.

UZBEKISTANI RAHVUSÜLIKOOL, NIMI MIRZO ULUGBEKI JÄRGI

ARVUTITEHNOLOOGIATEADUSKOND

Teemal: EXE-faili semantiline parsimine.

Lõpetatud:

Taškent 2003.

Eessõna.

Assamblee keel ja juhiste struktuur.

EXE-faili struktuur (semantiline parsimine).

COM-faili struktuur.

Kuidas viirus töötab ja levib.

Demonteerija.

Programmid.

Eessõna

Programmeerija elukutse on hämmastav ja ainulaadne. Meie ajal ei saa teadust ja elu ette kujutada ilma uusima tehnoloogiata. Kõik, mis on seotud inimtegevusega, pole täielik ilma arvutitehnoloogiata. Ja see aitab kaasa selle kõrgele arengule ja täiuslikkusele. Isegi kui personaalarvutite arendamine algas mitte nii kaua aega tagasi, siis selle aja jooksul astuti tarkvaratoodetes kolossaalseid samme ja neid tooteid kasutatakse pikka aega laialdaselt. Arvutialaste teadmiste valdkond on plahvatuslikult kasvanud, nagu ka sellega seotud tehnoloogia. Kui mitte arvestada ärilist külge, siis võib öelda, et selles kutsetegevuse valdkonnas pole võõraid. Paljud tegelevad programmide väljatöötamisega mitte kasumi või sissetuleku saamiseks, vaid omal vabal tahtel, kirest. Loomulikult ei tohiks see programmi kvaliteeti mõjutada ja nii-öelda selles äris on konkurents ja nõudlus kvaliteetse soorituse, stabiilse töö ja kõikidele meie aja nõuetele vastamise järele. Siinkohal väärib märkimist ka mikroprotsessorite ilmumine 60ndatel, mis asendasid suure hulga lambikomplekte. On mõningaid mikroprotsessoreid, mis on üksteisest väga erinevad. Need mikroprotsessorid erinevad üksteisest bitimahu ja sisseehitatud süsteemikäskude poolest. Levinumad on: Intel, IBM, Celeron, AMD jne. Kõik need protsessorid on seotud Inteli protsessorite täiustatud arhitektuuriga. Mikroarvutite levik on põhjustanud suhtumise ümbermõtestamise assemblerkeelde peamiselt kahel põhjusel. Esiteks nõuavad assemblerkeeles kirjutatud programmid oluliselt vähem mälu ja käitusaega. Teiseks annab assemblerkeele ja sellest tuleneva masinkoodi tundmine arusaamise masina arhitektuurist, mida kõrgkeeles töötades vaevalt ette tuleb. Kui enamik tarkvaraspetsialiste töötab välja kõrgetasemelistes keeltes, nagu Pascal, C või Delphi, millele on lihtsam programme kirjutada, siis kõige võimsam ja tõhusam tarkvara on kirjutatud täielikult või osaliselt montaažikeeles. Kõrgetasemelised keeled on loodud selleks, et vältida konkreetsete arvutite tehnilisi omadusi. Ja montaažikeel on omakorda mõeldud protsessori spetsiifilistele eripäradele. Seetõttu tuleb konkreetsele arvutile montaažikeelse programmi kirjutamiseks tunda selle arhitektuuri. Tänapäeval on peamise tarkvaratoote tüüp EXE-fail. Arvestades selle positiivseid külgi, võib programmi autor olla kindel selle puutumatuses. Kuid sageli pole see kaugeltki nii. Olemas ka demonteerija. Disassembleri abil saate teada katkestused ja programmikoodid. Assembleeris hästi tundval inimesel pole keeruline kogu programmi oma maitse järgi ümber teha. Võib-olla siit tulebki kõige lahustumatum probleem – viirus. Miks inimesed kirjutavad viiruseid? Mõni esitab selle küsimuse üllatunult, mõni vihaga, kuid sellegipoolest leidub inimesi, keda see ülesanne huvitab mitte mingi kahju tekitamise, vaid huvina süsteemi programmeerimise vastu. Viirusi kirjutatakse erinevatel põhjustel. Mõnele meeldivad süsteemikutsed, teised täiustavad oma teadmisi assembleris. Püüan seda kõike oma kursusetöös selgitada. Samuti ei räägi see mitte ainult EXE-faili struktuurist, vaid ka montaažikeelest.

^ Assamblee keel.

Alates esimeste arvutite ilmumisest ja lõpetades tänapäevaga on huvitav jälgida programmeerijate assamblee keele ideede muutumist.

Kunagi oli assembler keel, mille teadmata oli võimatu arvutit midagi kasulikku tegema panna. Tasapisi olukord muutus. Ilmusid mugavamad sidevahendid arvutiga. Kuid erinevalt teistest keeltest ei surnud assembler, pealegi ei saanud ta seda põhimõtteliselt teha. Miks? Vastuse otsimisel püüame mõista, mis on assemblerkeel üldiselt.

Lühidalt öeldes on komplekteerimiskeel masinkeele sümboolne esitus. Kõiki protsesse masinas kõige madalamal, riistvara tasemel juhivad ainult masinakeele käsud (juhised). Sellest on selge, et hoolimata üldnimetusest on iga arvutitüübi montaažikeel erinev. See kehtib ka assembleris kirjutatud programmide välimuse ja ideede kohta, mida see keel peegeldab.

Riistvaraga seotud probleeme (või veelgi enam riistvaraga seotud probleeme, näiteks programmi kiiruse parandamist) on võimatu lahendada ilma monteerija teadmisteta.

Programmeerija või mõni muu kasutaja võib kasutada mis tahes kõrgetasemelisi tööriistu, kuni virtuaalmaailmade loomise programmideni, ja võib-olla isegi mitte kahtlustada, et arvuti ei täida tegelikult mitte selle keele käske, milles ta programm on kirjutatud, vaid nende käske. teisendatud esitus täiesti erineva keele - masinakeele - igavate ja tuimade käskude jadade kujul. Nüüd kujutame ette, et sellisel kasutajal on ebastandardne probleem või lihtsalt läks midagi valesti. Näiteks peab tema programm töötama mõne ebatavalise seadmega või tegema muid toiminguid, mis nõuavad arvutiriistvara põhimõtete tundmist. Ükskõik kui tark programmeerija ka poleks, ükskõik kui heas keeles ta oma imelise programmi kirjutas, ei saa ta hakkama ilma assembleri tundmiseta. Ja pole juhus, et peaaegu kõik kõrgetasemeliste keelte kompilaatorid sisaldavad vahendeid oma moodulite ühendamiseks moodulitega assembleris või toetavad juurdepääsu assembleri programmeerimistasemele.

Arvutivagunite aeg on muidugi juba möödas. Nagu öeldakse, ei saa te mõõtmatust omaks võtta. Kuid on midagi ühist, omamoodi vundament, millele igasugune tõsine arvutiõpe on üles ehitatud. See on teadmine arvuti tööpõhimõtetest, selle arhitektuurist ja montaažikeelest kui nende teadmiste peegeldus ja kehastus.

Tüüpiline kaasaegne arvuti (i486 või Pentiumi baasil) koosneb järgmistest komponentidest (joonis 1).

Riis. 1. Arvuti ja välisseadmed

Riis. 2. Personaalarvuti plokkskeem

Jooniselt (joonis 1) on näha, et arvuti koosneb mitmest füüsilisest seadmest, millest igaüks on ühendatud ühe seadmega, mida nimetatakse süsteemiüksuseks. Loogiliselt võttes on selge, et see täidab mingi koordineeriva seadme rolli. Vaatame süsteemiploki sisse (pole vaja proovida monitori sisse pääseda - seal pole midagi huvitavat, pealegi ohtlik): avage korpus ja vaadake mõnda tahvlit, plokki, ühendusjuhtmeid. Nende funktsionaalse eesmärgi mõistmiseks vaatleme tüüpilise arvuti plokkskeemi (joonis 2). See ei pretendeeri absoluutsele täpsusele ja selle eesmärk on ainult näidata kaasaegse personaalarvuti elementide eesmärki, suhet ja tüüpilist koostist.

Arutleme joonisel fig. 2 mõnevõrra ebatavalises stiilis.
Inimloomusele on omane millegi uuega kohtudes otsida assotsiatsioone, mis aitavad tundmatut tundma õppida. Milliseid assotsiatsioone arvuti tekitab? Minu jaoks seostub näiteks arvuti sageli inimese endaga. Miks?

Kusagil enda sügavusel arvutit loov inimene arvas, et loob midagi iseendale sarnast. Arvutil on välismaailma teabe tajumise organid - see on klaviatuur, hiir, magnetilised kettaseadmed. Joonisel fig. 2 need organid asuvad süsteemisiinidest paremal. Arvutil on organid, mis "seedivad" saadud teavet - see on keskprotsessor ja RAM. Ja lõpuks on arvutil kõneorganid, mis annavad välja töötlemise tulemused. Need on ka mõned paremal pool olevad seadmed.

Kaasaegsed arvutid on muidugi inimesest kaugel. Neid võib võrrelda olenditega, kes suhtlevad välismaailmaga suure, kuid piiratud tingimusteta reflekside komplekti tasemel.
See reflekside komplekt moodustab masinajuhiste süsteemi. Ükskõik kui kõrgel tasemel sa arvutiga suhtled, taandub kõik lõpuks igavale ja monotoonsele masinajuhiste jadale.
Iga masina käsk on omamoodi stiimul selle või selle tingimusteta refleksi ergutamiseks. Reaktsioon sellele stiimulile on alati ühemõtteline ja on mikrokäskude plokis mikroprogrammi kujul "juhtmega ühendatud". See mikroprogramm rakendab toimingud masina käsu rakendamiseks, kuid juba teatud arvuti loogikaahelatele rakendatud signaalide tasemel, kontrollides seeläbi erinevaid arvuti alamsüsteeme. See on nn mikroprogrammi juhtimise põhimõte.

Jätkates analoogiat inimesega, märgime, et selleks, et arvuti korralikult sööks, on leiutatud palju operatsioonisüsteeme, kompilaatoreid sadade programmeerimiskeelte jaoks jne. Kuid kõik need on tegelikult vaid roog, millel peal on toit (programmid) tarnitakse teatud reeglite järgi kõht (arvuti). Ainult arvuti kõht armastab dieetilist monotoonset toitu - andke talle struktureeritud teavet, rangelt organiseeritud nullide ja ühtede jadade kujul, mille kombinatsioonid moodustavad masinakeele.

Seega, olles väliselt polüglott, saab arvuti aru ainult ühest keelest – masinajuhiste keelest. Muidugi ei ole arvutiga suhtlemiseks ja töötamiseks vaja seda keelt osata, kuid peaaegu iga professionaalne programmeerija seisab varem või hiljem silmitsi vajadusega see selgeks õppida. Õnneks ei pea programmeerija püüdma aru saada erinevate kahendarvude kombinatsioonide tähendusest, sest juba 50ndatel hakkasid programmeerijad programmeerimiseks kasutama masinkeele sümboolset analoogi, mida nimetati assemblerkeeleks. See keel peegeldab täpselt kõiki masinkeele omadusi. Seetõttu on erinevalt kõrgetasemelistest keeltest komplekteerimiskeel iga arvutitüübi puhul erinev.

Eelneva põhjal võime järeldada, et kuna arvuti montaažikeel on “native”, saab kõige tõhusama programmi kirjutada ainult selles (eeldusel, et selle on kirjutanud kvalifitseeritud programmeerija). Siin on üks väike "aga": see on väga töömahukas protsess, mis nõuab palju tähelepanu ja praktilisi kogemusi. Seetõttu kirjutab assembler tegelikkuses peamiselt programme, mis peaksid tagama tõhusa töö riistvaraga. Mõnikord on programmi kriitilised osad täitmisaja või mälutarbimise osas kirjutatud assembleris. Seejärel tehakse need alamprogrammide kujul ja kombineeritakse kõrgetasemelises keeles oleva koodiga.

Iga arvuti assemblerkeele õppimist on mõttekas alustada alles pärast seda, kui on teada, milline osa arvutist on selles keeles nähtavaks ja programmeerimiseks kättesaadavaks jäetud. See on nn arvutiprogrammi mudel, mille üheks osaks on mikroprotsessori programmimudel, mis sisaldab 32 registrit, mis on programmeerijale enam-vähem kasutamiseks kättesaadavad.

Need registrid võib jagada kahte suurde rühma:

^16 kohandatud registrit;

16 süsteemiregistrit.

Assamblee keele programmid kasutavad väga palju registreid. Enamikul registritel on konkreetne funktsionaalne eesmärk.

Nagu nimigi ütleb, kutsutakse kasutajaregistreid seetõttu, et programmeerija saab neid oma programme kirjutades kasutada. Need registrid hõlmavad (joonis 3):

Kaheksa 32-bitist registrit, mida programmeerijad saavad kasutada andmete ja aadresside salvestamiseks (nimetatakse ka üldotstarbelisteks registriteks (RON)):

kuus segmendiregistrit: cs, ds, ss, es, fs, gs;

oleku- ja kontrolliregistrid:

Lipud registreerivad lipud/lipud;

eip/ip käsuosuti register.

Riis. 3. Mikroprotsessorite i486 ja Pentium kasutajate registrid

Miks näidatakse paljusid neist registritest kaldkriipsuga? Ei, need ei ole erinevad registrid – need on ühe suure 32-bitise registri osad. Neid saab programmis kasutada eraldi objektidena. Seda tehti selleks, et tagada Inteli noorematele 16-bitise mikroprotsessori mudelitele, alates i8086-st, kirjutatud programmide töövõime. Mikroprotsessoritel i486 ja Pentium on enamasti 32-bitised registrid. Nende arv, välja arvatud segmendiregistrid, on sama, mis i8086-l, kuid mõõtmed on suuremad, mis kajastub nende tähistuses - neil on
eesliide e (Laiendatud).

^ Üldotstarbelised registrid
Kõik selle grupi registrid võimaldavad juurdepääsu nende "alumistele" osadele (vt joonis 3). Seda joonist vaadates pange tähele, et eneseaadresseerimiseks saab kasutada ainult nende registrite alumisi 16- ja 8-bitisi osi. Nende registrite ülemised 16 bitti pole iseseisvate objektidena saadaval. Seda tehakse, nagu eespool märkisime, ühilduvuse tagamiseks Inteli nooremate 16-bitiste mikroprotsessorimudelitega.

Loetleme üldotstarbeliste registrite rühma kuuluvad registrid. Kuna need registrid asuvad füüsiliselt mikroprotsessoris aritmeetilise loogikaüksuse (ALU) sees, nimetatakse neid ka ALU registriteks:

eax/ax/ah/al (Akuregister) - akumulaator.
Kasutatakse vaheandmete salvestamiseks. Mõnes käsus on selle registri kasutamine nõutav;

ebx/bx/bh/bl (Baasregister) - baasregister.
Kasutatakse mõne objekti baasaadressi salvestamiseks mällu;

ecx/cx/ch/cl (Count register) - loenduri register.
Seda kasutatakse käskudes, mis sooritavad mõningaid korduvaid toiminguid. Selle kasutamine on sageli kaudne ja peidetud vastava käsu algoritmis.
Näiteks silmuse korraldamise käsk lisaks kontrolli üleandmisele kindlal aadressil asuvale käsule analüüsib ja vähendab registri ecx/cx väärtust ühe võrra;

edx/dx/dh/dl (Andmeregister) - andmeregister.
Nii nagu eax/ax/ah/al register, salvestab see vaheandmeid. Mõned käsud nõuavad selle kasutamist; mõne käsu puhul juhtub see kaudselt.

Järgmisi kahte registrit kasutatakse nn aheloperatsioonide toetamiseks, see tähendab toiminguid, mis töötlevad järjestikku elementide ahelaid, millest igaüks võib olla 32, 16 või 8 bitti pikk:

esi/si (Source Index register) - lähteindeks.
See aheloperatsioonide register sisaldab lähteahela elemendi praegust aadressi;

edi/di (Destination Index register) - vastuvõtja (vastuvõtja) register.
See aheloperatsioonide register sisaldab praegust aadressi sihtahelas.

Mikroprotsessori arhitektuuris riist- ja tarkvara tasemel toetatakse sellist andmestruktuuri nagu pinu. Mikroprotsessori käsusüsteemis virnaga töötamiseks on spetsiaalsed käsud ja mikroprotsessori tarkvaramudelis on selleks spetsiaalsed registrid:

esp/sp (Stack Pointer register) - virna pointeri register.
Sisaldab kursorit praeguses virnasegmendis virna ülaossa.

ebp/bp (Base Pointer register) – virnaraami baasosuteri register.
Mõeldud virna sees olevatele andmetele juhusliku juurdepääsu korraldamiseks.

Virn on programmiala suvaliste andmete ajutiseks salvestamiseks. Andmesegmendis saab loomulikult salvestada ka andmeid, kuid sellisel juhul tuleb iga ajutiselt salvestatud andmete jaoks luua eraldi nimeline mälulahter, mis suurendab programmi suurust ja kasutatavate nimede arvu. Pinu mugavus seisneb selles, et selle ala kasutatakse uuesti ning pinu andmete salvestamine ja sealt toomine toimub tõhusate push- ja pop-käskude abil ilma nimesid määramata.
Pinu kasutatakse traditsiooniliselt näiteks selleks, et salvestada programmi poolt kasutatavate registrite sisu enne alamprogrammi kutsumist, mis omakorda kasutab protsessori registreid "oma eesmärkidel". Registrite algne sisu lekib pinust alamprogrammist naastes. Teine levinud meetod on vajalike parameetrite edastamine alamprogrammile pinu kaudu. Alamprogramm, teades, millises järjekorras parameetrid virna paigutatakse, saab need sealt võtta ja oma täitmisel kasutada. Virna eripäraks on selles sisalduvate andmete valimi võtmise omapärane järjekord: igal ajal on virnal saadaval ainult ülemine element, s.t. viimane virnasse laaditud element. Ülemise elemendi virnast hüppamine teeb järgmise elemendi kättesaadavaks. Viru elemendid asuvad virna jaoks eraldatud mälualal, alustades virna põhjast (st selle maksimaalsest aadressist) kuni järjest kahanevate aadressideni. Ülemise ligipääsetava elemendi aadress salvestatakse pinu osutiregistrisse SP. Nagu iga muu programmimälu ala, peab virn olema kaasatud mõnda segmenti või moodustama eraldi segmendi. Mõlemal juhul paigutatakse selle segmendi segmendi aadress segmendipinu registrisse SS. Seega kirjeldab registripaar SS:SP saadaoleva pinu lahtri aadressi: SS salvestab virna segmendi aadressi ja SP salvestab pinu viimaste salvestatud andmete nihke (joonis 4, a). Pöörame tähelepanu asjaolule, et algolekus osutab virna osuti SP lahtrile, mis asub virna põhja all ja ei kuulu sellesse.

Joonis 4. Virna korraldus: a - algolek, b - pärast ühe elemendi laadimist (selles näites AX-i registri sisu), c - pärast teise elemendi laadimist (DS-registri sisu), d - pärast ühe elemendi laadimist element, e - pärast kahe elemendi mahalaadimist ja naasmist algsesse olekusse.

Virna laadimine toimub spetsiaalse virnatõukekäsuga. See käsk vähendab kõigepealt pinukursori sisu 2 võrra ja asetab seejärel operandi SP-s olevale aadressile. Kui soovime näiteks AX-i registri sisu ajutiselt virna salvestada, peaksime täitma käsu

Virn läheb üle joonisel fig. 1.10, b. Näha on, et pinukursorit nihutatakse kahe baidi võrra ülespoole (madalamate aadresside suunas) ja sellele aadressile kirjutatakse tõukekäskluses määratud operand. Järgmine käsk virna laadimiseks, näiteks

liigutab virna joonisel fig. 1.10, c. Virn sisaldab nüüd kahte elementi, millest pääseb juurde ainult ülemisele, millele osutab virna osuti SP. Kui mõne aja pärast peame taastama virna salvestatud registrite algse sisu, peame täitma virnast pop-käsud (pop):

pop DS
pop AX

Kui suur peaks virn olema? See sõltub sellest, kui intensiivselt seda programmis kasutatakse. Kui plaanite näiteks virna salvestada 10 000-baidise massiivi, siis peab virn olema vähemalt selle suurusega. Tuleb meeles pidada, et mõnel juhul kasutab süsteem pinu automaatselt, eriti katkestamiskäsu int 21h täitmisel. Selle käsuga surub protsessor pinu esmalt tagastusaadressi ja seejärel DOS sinna registrite sisu ja muu katkenud programmiga seotud info. Seega, isegi kui programm pinu üldse ei kasuta, peab see siiski programmis olemas olema ja selle suurus peab olema vähemalt mitukümmend sõna. Esimeses näites panime virna 128 sõna, millest kindlasti piisab.

^ Montaažiprogrammi struktuur

Assemblee keele programm on mäluplokkide kogum, mida nimetatakse mälusegmentideks. Programm võib koosneda ühest või mitmest sellisest plokisegmendist. Iga segment sisaldab keelelausete kogumit, millest igaüks võtab enda alla eraldi programmikoodi rea.

Montaažiavaldusi on nelja tüüpi:

käsud või juhised, mis on masinajuhiste sümboolsed vasted. Tõlkeprotsessi käigus teisendatakse montaažijuhised mikroprotsessori käsukomplekti vastavateks käskudeks;

makrokäsud - programmi teksti laused, mis on kujundatud teatud viisil ja asendatakse tõlkimise käigus teiste lausetega;

direktiivid, mis käsivad assembleri kompilaatoril mingi toimingu sooritada. Masinesituses ei ole direktiividel vasteid;

kommentaariread, mis sisaldavad mis tahes märke, sealhulgas vene tähestiku tähti. Tõlkija ignoreerib kommentaare.

^ Assamblee keele süntaks

Programmi moodustavad laused võivad olla süntaktiline konstruktsioon, mis vastab käsule, makrole, direktiivile või kommentaarile. Et assembler-tõlkija need ära tunneks, tuleb need moodustada kindlate süntaktiliste reeglite järgi. Selleks on kõige parem kasutada keele süntaksi formaalset kirjeldust, nagu grammatikareegleid. Levinuimad viisid programmeerimiskeele sel viisil kirjeldamiseks on süntaksiskeemid ja laiendatud Backus-Nauri vormid. Praktiliseks kasutamiseks on süntaksidiagrammid mugavamad. Näiteks koostekeele lausete süntaksit saab kirjeldada järgmistel joonistel näidatud süntaksidiagrammide abil.

Riis. 5. Assembler lausevorming

Riis. 6. Vorminda käskkirjad

Riis. 7. Käskude ja makrode vorming

Nendel joonistel:

sildi nimi - identifikaator, mille väärtus on sellega tähistatava programmi lähtekoodilause esimese baidi aadress;

nimi – identifikaator, mis eristab seda direktiivi teistest samanimelistest direktiividest. Teatud käskkirja koostaja poolt töötlemise tulemusena saab sellele nimele omistada teatud tunnuseid;

operatsioonikood (COP) ja käskkiri on vastava masinkäsu, makrokäsu või tõlkija käskkirja mnemoonilised tähised;

operandid - osad käsu-, makro- või assemblerdirektiividest, mis tähistavad objekte, millega toiminguid tehakse. Assembleri operandid kirjeldatakse numbri- ja tekstikonstantidega avaldiste, muutujate siltide ja identifikaatoritega, kasutades operaatorimärke ja mõningaid reserveeritud sõnu.

^ Kuidas kasutada süntaksiskeeme? See on väga lihtne: kõik, mida pead tegema, on leida ja seejärel järgida teed diagrammi sisendist (vasakul) selle väljundini (paremal). Kui selline tee on olemas, siis on lause või konstruktsioon süntaktiliselt õige. Kui sellist teed pole, siis kompilaator seda konstruktsiooni ei aktsepteeri. Süntaksiskeemidega töötades pöörake tähelepanu nooltega näidatud läbimise suunale, kuna teede hulgas võib olla neid, mida saab jälgida paremalt vasakule. Tegelikult peegeldavad süntaktilised diagrammid tõlkija loogikat programmi sisendlausete parsimisel.

Lubatud märgid programmide teksti kirjutamisel on:

Kõik ladina tähed: A-Z, a-z. Sel juhul loetakse suur- ja väiketähti samaväärseks;

Numbrid 0 kuni 9;

Märgid?, @, $, _, &;

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

Assemblerlaused moodustatakse lekseemidest, mis on süntaktiliselt lahutamatud kehtivate keelesümbolite jadad, mis on tõlkija jaoks mõistlikud.

Märgid on:

Identifikaatorid on kehtivate märkide jadad, mida kasutatakse programmiobjektide (nt opkoodide, muutujate nimede ja siltide nimede) tähistamiseks. Identifikaatorite kirjutamise reegel on järgmine: identifikaator võib koosneda ühest või mitmest märgist. Märkidena saate kasutada ladina tähestiku tähti, numbreid ja mõningaid erimärke - _, ?, $, @. Identifikaator ei saa alata numbrimärgiga. Identifikaatori pikkus võib olla kuni 255 tähemärki, kuigi tõlkija aktsepteerib ainult 32 esimest tähemärki ja ignoreerib ülejäänud. Suvandi abil saate reguleerida võimalike identifikaatorite pikkust käsurida mv. Lisaks on võimalik käskida tõlkijal teha vahet suur- ja väiketähtedel või ignoreerida nende erinevust (mida vaikimisi tehakse).

^ Assamblee keele käsud.

Assembleri käsud näitavad võimet oma nõudeid arvutisse üle kanda, mehhanismi programmi juhtimise ülekandmiseks (tsüklid ja hüpped) loogiliste võrdluste ja programmide korraldamise jaoks. Programmeerimisülesanded on aga harva nii lihtsad. Enamik programme sisaldab tsüklite seeriat, milles mitut käsku korratakse, kuni teatud nõue on saavutatud, ja erinevaid kontrolle, et määrata, millist mitmest toimingust teha. Mõned käsud võivad juhtimise üle anda, muutes tavalist sammude jada, muutes otse käsukursori nihke väärtust. Nagu varem mainitud, on erinevate protsessorite jaoks erinevad käsud, kuid me käsitleme mitmeid protsessorite 80186, 80286 ja 80386 käske.

Lippude oleku kirjeldamiseks pärast teatud käsu täitmist kasutame tabelist valikut, mis kajastab lippude lipuregistri struktuuri:

Selle tabeli alumine rida loetleb lippude väärtused pärast käsu täitmist. Sel juhul kasutatakse järgmisi tähiseid:

1 - pärast käsu täitmist seatakse lipp (võrdne 1-ga);

0 - pärast käsu täitmist lipp lähtestatakse (võrdne 0-ga);

r - lipu väärtus sõltub käsu tulemusest;

Pärast käsu täitmist on lipp määramata;

tühik - pärast käsu täitmist lipp ei muutu;

Operandide esitamiseks süntaksidiagrammides kasutatakse järgmist tähistust:

r8, r16, r32 - operand ühes suuruse baidi, sõna või topeltsõna registris;

m8, m16, m32, m48 - operand mälus baitide, sõna, topeltsõna või 48 biti suuruses;

i8, i16, i32 - suuruse baidi, sõna või topeltsõna vahetu operand;

a8, a16, a32 - suhteline aadress (nihe) koodisegmendis.

Käsud (tähestiku järjekorras):

*Neid käske kirjeldatakse üksikasjalikult.

LISAMA
(LISA)

Lisand

^ Käsu ülevaade:

lisa sihtkoht, allikas

Eesmärk: kahe baidi-, sõna- või topeltsõna mõõtmetega lähte- ja sihtoperandi lisamine.

Töö algoritm:

lisada lähte- ja sihtoperandid;

kirjuta lisamise tulemus vastuvõtjasse;

seada lipud.

Lippude olek pärast käsu täitmist:

Rakendus:
Lisamise käsku kasutatakse kahe täisarvulise operandi lisamiseks. Liitmise tulemus asetatakse esimese operandi aadressile. Kui liitmise tulemus väljub sihtoperandi piiridest (tekib ületäitumine), siis tuleks seda olukorda arvesse võtta cf-lipu analüüsimisel ja seejärel võimalusel adc-käsu abil. Näiteks lisame väärtused registri ax ja mäluala ch. Lisamisel tuleks arvestada ülevoolu võimalusega.

Registreerumine pluss register või mälu:

|000000dw|modregr/rm|

Registreeri AX (AL) pluss vahetu väärtus:

|0000010w|--andmed--|andmed, kui w=1|

Registr või mälu pluss vahetu väärtus:

|100000sw|mod000r/m|--andmed--|andmed, kui BW=01|

HELISTAMA
(HELISTAMA)

Protseduuri või ülesande kutsumine

^ Käsu ülevaade:

Eesmärk:

juhtimise üleviimine sulgemis- või kaugeprotseduurile koos tagasistuspunkti aadressi salvestamisega virna;

ülesannete vahetamine.

Töö algoritm:
määratakse operandi tüübi järgi:

Silt on lähedal - eip / ip käsu osuti sisu lükatakse virna ja samasse registrisse laetakse uus sildile vastav aadressiväärtus;

Kauge silt – eip/ip ja cs käsuosuti sisu lükatakse virna. Seejärel laaditakse samadesse registritesse uued aadressi väärtused, mis vastavad kaugele märgile;

R16, 32 või m16, 32 - määratlege register või mälulahter, mis sisaldab nihkeid jooksvas käsusegmendis, kuhu juhtimine üle antakse. Juhtimise ülekandmisel lükatakse eip/ip käsukursori sisu pinu;

Mälukursor – määrab mälukoha, mis sisaldab 4- või 6-baidist osutit kutsutavale protseduurile. Sellise osuti struktuur on 2+2 või 2+4 baiti. Sellise osuti tõlgendamine sõltub mikroprotsessori töörežiimist:

^ Lippude olek pärast käsu täitmist (välja arvatud tegumilüliti):

käsu täitmine ei mõjuta lippe

Ülesande vahetamisel muudetakse lippude väärtusi vastavalt lülituva ülesande TSS-i oleku segmendis olevate lippude registri teabele.
Rakendus:
Kutsumiskäsk võimaldab korraldada paindliku ja mitme muutujaga juhtimise ülekandmise alamprogrammile, säilitades samal ajal tagastuspunkti aadressi.

Objekti kood (neli vormingut):

Otsene adresseerimine segmendis:

|11101000|disp-low|diep-high|

Kaudne adresseerimine segmendis:

|11111111|mod010r/m|

Kaudne adresseerimine segmentide vahel:

|11111111|mod011r/m|

Otsene adresseerimine segmentide vahel:

|10011010|nihe-madal|nihe-kõrge|seg-madal|seg-kõrge|

CMP
(võrdle operande)

Operandi võrdlus

^ Käsu ülevaade:

cmp operand1, operand2

Eesmärk: kahe operandi võrdlemine.

Töö algoritm:

teostada lahutamist (operand1-operand2);

olenevalt tulemusest seadke lipud, ärge muutke operandi1 ja operandi2 (st ärge salvestage tulemust).

Rakendus:
Seda juhist kasutatakse kahe operandi võrdlemiseks lahutamise teel, samas kui operande ei muudeta. Lipud seatakse käsu täitmise tulemusena. Käsku cmp kasutatakse tingimuslike hüppekäskude ja seatud bait-väärtuse käsuga setcc.

Objekti kood (kolm vormingut):

Registreeritud või registreeritud mälu:

|001110dw|modreg/m|

Vahetu väärtus registriga AX (AL):

|0011110w|--andmed--|andmed, kui w=1|

Vahetu väärtus registri või mäluga:

|100000sw|mod111r/m|--data--|andmed, kui sw=0|

DEC
(vähenda operandi 1 võrra)

Operandi vähendamine ühe võrra

^ Käsu ülevaade:

dets. operand

Eesmärk: vähendada operandi väärtust mälus või registris 1 võrra.

Töö algoritm:
käsk lahutab operandist 1. Lippude olek pärast käsu täitmist:

Rakendus:
Dec-käsku kasutatakse mälus või registris oleva baidi, sõna, topeltsõna väärtuse vähendamiseks ühe võrra. Pange tähele, et käsk ei mõjuta cf-lippu.

Registreeri: |01001reg|

^ Register või mälu: |1111111w|mod001r/m|

DIV
(jaga allkirjastamata)

Jaoskond allkirjastamata

Käsuskeem:

div jagaja

Eesmärk: teha jagamisoperatsioon kahe kahendmärgita väärtusega.

^ Tööalgoritm:
Käsk nõuab kahte operandi – dividendi ja jagajat. Dividend määratakse kaudselt ja selle suurus sõltub jagaja suurusest, mis on määratud käsus:

kui jagaja on baitides, siis dividend peab asuma registrikirves. Pärast operatsiooni asetatakse jagatis al-sse ja jääk ah-sse;

kui jagaja on sõna, siis dividend peab asuma registripaaris dx:ax, kusjuures dividendi madal osa on ax. Pärast operatsiooni asetatakse jagatis axe ja jääk dx;

kui jagaja on topeltsõna, siis dividend peab asuma registripaaris edx:eax, kusjuures dividendi madalam osa on eax. Pärast operatsiooni asetatakse jagatis eax-i ja jääk edx-i.

^ Lippude olek pärast käsu täitmist:

Rakendus:
Käsk teostab operandide täisarvude jagamise, tagastades jagamise tulemuse jagatisena ja jagamise ülejäänud osa. Jagamisoperatsiooni sooritamisel võib tekkida erand: 0 - jagamisviga. See olukord tekib ühel kahest juhul: jagaja on 0 või jagatis on liiga suur, et mahtuda registrisse eax/ax/al.

Objekti kood:

|1111011w|mod110r/m|

INT
(Vahele segama)

Katkestusteenuse rutiini helistamine

^ Käsu ülevaade:

int katkestuse_number

Eesmärk: kutsuda välja katkestusteenuse rutiin käsuoperandiga määratud katkestuse numbriga.

^ Tööalgoritm:

lükake lippude/lippude register ja tagastusaadress virna. Tagastusaadressi kirjutamisel kirjutatakse esmalt cs segmendi registri sisu, seejärel käsukursori eip/ip sisu;

lähtesta if ja tf lipud nulli;

edasta juhtimine määratud numbriga katkestuste käitlejale. Juhtimise ülekandemehhanism sõltub mikroprotsessori töörežiimist.

^ Lippude olek pärast käsu täitmist:

Rakendus:
Nagu süntaksist näha, on sellel käsul kaks vormi:

int 3 - sellel on oma individuaalne opkood 0cch ja see võtab enda alla ühe baidi. See asjaolu muudab väga mugavaks kasutamise erinevates tarkvarasilurites katkestuspunktide määramiseks, asendades mis tahes käsu esimese baidi. Kui mikroprotsessor kohtab käskude jadas opkoodiga 0cch käsku, helistab katkestuste töötleja vektoriga number 3, mis aitab suhelda tarkvara siluriga.

Käsu teine ​​vorm on kahe baiti pikkune, selle opkood on 0cdh ja see võimaldab teil algatada kõne katkestusteenuse rutiinile, mille vektornumber on vahemikus 0–255. Juhtimise ülekandmise omadused, nagu märgitud, sõltuvad mikroprotsessori töörežiimist.

Objekti kood (kaks vormingut):

Registreeru: |01000reg|

^ Register või mälu: |1111111w|mod000r/m|

JCC
JCXZ/JECXZ
(Hüppa, kui tingimus)

(Hüppa, kui CX = null/ Hüppa, kui ECX = null)

Hüppa, kui tingimus on täidetud

Hüppa, kui CX/ECX on null

^ Käsu ülevaade:

jcc silt
jcxz silt
jecxz silt

Eesmärk: üleminek praeguses käskude segmendis, olenevalt mõnest olukorrast.

^ Käsualgoritm (välja arvatud jcxz/jecxz):
Lippude oleku kontrollimine sõltuvalt opkoodist (see peegeldab kontrollitavat seisundit):

kui testitav tingimus on tõene, siis minge operandi näidatud lahtrisse;

kui kontrollitav tingimus on vale, siis andke juhtimine üle järgmisele käsule.

jcxz/jecxz käsualgoritm:
Tingimuse kontrollimine, et ecx/cx registri sisu on võrdne nulliga:

kui seisukord on kontrollitud