Harjutused. Toitumine. Dieedid. Treening. Sport

Mis on käsu tingimusteta täitmise nimi. MP seadmete programmeerimise alused (Loeng). CMP ja TEST käsud

Mikroprotsessori käsusüsteemis on koos aritmeetiliste arvutuste vahenditega ka vahendid andmete loogiliseks teisendamiseks. Loogiliste vahenditega sellised andmete teisendused, mis põhinevad formaalse loogika reeglid.

Formaalne loogika toimib tõeste ja valede väidete tasemel. Mikroprotsessori puhul tähendab see tavaliselt vastavalt 1 ja 0. Arvuti jaoks on nullide ja ühtede keel emakeel, kuid minimaalne andmeühik, millega masinakäsud töötavad, on bait. Süsteemi tasemel on aga sageli vaja, et oleks võimalik töötada madalaimal võimalikul tasemel, bititasemel.

Riis. 29. Loogilise andmetöötluse vahendid


Loogiliste andmete teisendamise vahendid hõlmavad loogilisi käske ja loogilisi operatsioone. Assembleri käsu operandiks võib üldjuhul olla avaldis, mis omakorda on operaatorite ja operandide kombinatsioon. Nende operaatorite hulgas võib olla operaatoreid, mis rakendavad avaldisobjektidel loogilisi operatsioone.

Enne nende tööriistade üksikasjalikku kaalumist mõelgem, millised on loogilised andmed ise ja milliseid toiminguid nendega tehakse.

Boole'i ​​andmed

Loogilise andmetöötluse teoreetiline alus on formaalne loogika. Loogikasüsteeme on mitu. Üks kuulsamaid on lausearvutus. Propositsioon on mis tahes väide, mida saab öelda kummalegi tõsi, või vale.

Propositsiooniarvutus on reeglite kogum, mida kasutatakse mõne lausekombinatsiooni tõesuse või vääruse määramiseks.

Lausearvutus on väga harmooniliselt ühendatud arvuti põhimõtete ja selle programmeerimise põhimeetoditega. Kõik arvuti riistvarakomponendid on üles ehitatud loogikakiipidele. Süsteem teabe esitamiseks arvutis kõige madalamal tasemel põhineb biti kontseptsioonil. Bitt, millel on ainult kaks olekut (0 (väär) ja 1 (tõene)), sobib lausearvutusse loomulikult.

Teooria kohaselt saab lausetega (bittidel) sooritada järgmisi loogilisi operatsioone.


1. Eitus (loogiline MITTE) - loogiline tehe ühe operandiga, mille tulemuseks on algse operandi väärtuse pöördväärtus.

Seda toimingut iseloomustab unikaalselt järgmine tõesuse tabel (tabel 12).

Tabel 12. Loogilise eituse tõesuse tabel

2. Loogiline lisamine (loogiline kaasa arvatud VÕI) - loogiline tehe kahe operandiga, mille tulemuseks on tõene (1), kui üks või mõlemad operandid on tõesed (1) ja väär (0), kui mõlemad operandid on väärad (0).

Seda toimingut kirjeldatakse järgmise tõesuse tabeli (tabel 13) abil.

Tabel 13. Loogilise kaasava VÕI tõesuse tabel

3. Loogiline korrutamine (loogiline JA) - loogiline tehe kahe operandiga, mis hindab tõeseks (1) ainult siis, kui mõlemad operandid hindavad tõeseks (1). Kõigil muudel juhtudel on toimingu väärtus "false" (0).

Seda toimingut kirjeldatakse järgmise tõesuse tabeli (tabel 14) abil.

Tabel 14. Loogika- JA tõetabel

4. Loogiline välistav lisamine (loogiline välistamine VÕI) - loogiline tehe kahe operandiga, mille tulemuseks on tõene (1), kui ainult üks kahest operandist on tõene (1), ja väär (0), kui mõlemad operandid on väärad (0) või "tõde" (1). Seda toimingut kirjeldatakse järgmise tõesuse tabeli (tabel 15) abil.

Tabel 15. Loogilise XOR tõesuse tabel

Mikroprotsessori käsukomplekt sisaldab viit käsku, mis neid toiminguid toetavad. Need käsud sooritavad loogilisi operatsioone operandide bittidega. Operandide mõõtmed peavad loomulikult olema samad. Näiteks kui operandide dimensioon on võrdne sõnaga (16 bitti), siis sooritatakse loogiline operatsioon esmalt operandide nullbiti peal ja selle tulemus kirjutatakse tulemuse biti 0 asemele. Järgmisena kordab käsk neid toiminguid järjestikku kõigil bittidel alates esimesest kuni viieteistkümnendani.

Loogilised käsud

Mikroprotsessori käsusüsteemil on järgmised käsud, mis toetavad loogiliste andmetega töötamist:

1) ja operand_1, operand_2 on loogiline korrutustehe. Käsk sooritab bitipõhise loogilise JA-operatsiooni (konjunktsiooni) operandi operandi_1 ja operand_2 bittidele. Tulemus kirjutatakse operandi_1 asemele;

2) og operand_1, operand_2 - loogilise liitmise tehe. Käsk sooritab bitipõhise loogilise VÕI-operatsiooni (disjunktsiooni) operandi operandi_1 ja operandi_2 bittidele. Tulemus kirjutatakse operandi_1 asemele;

3) xor operand_1, operand_2 - loogilise välistava liitmise operatsioon. Käsk teostab bittide kaupa loogilise XOR-operatsiooni operandi operandi_1 ja operandi_2 bittidele. Tulemus kirjutatakse operandi asemele;

4) test operand_1, operand_2 - tehe "kontroll" (loogilise korrutamise meetodil). Käsk teostab bitipõhise loogilise JA-operandi operandi operand_1 ja operand_2 bittidel. Operandide olek jääb samaks, muudetakse vaid lippe zf, sf ja pf, mis võimaldab analüüsida operandi üksikute bittide olekut ilma nende olekut muutmata;

5) not operaand on loogiline eitustehe. Käsk teostab operandi iga biti bitipõhise inversiooni (asendades väärtuse vastupidisega). Tulemus kirjutatakse operandi asemele.

Loogiliste käskude rolli mõistmiseks mikroprotsessori käsukomplektis on väga oluline mõista nende rakendusvaldkondi ja tüüpilisi meetodeid nende programmeerimisel kasutamiseks.

Loogiliste käskude abil on see võimalik valiküksikud bitid operandis konkreetse väärtuse seadistamine, lähtestamine, inverteerimine või lihtsalt kontrollimine.

Sellise bittidega töö korraldamiseks täidab operand_2 tavaliselt maski rolli. Selle maski bitis 1 seatud bittide abil määratakse konkreetse operatsiooni jaoks vajalikud operandi_1 bitid. Näitame, milliseid loogilisi käske saab sel eesmärgil kasutada:

1) teatud numbrite (bittide) määramiseks 1-ks kasutatakse käsku og operand_1, operand_2.

Selles juhises peab maskina toimiv operand_2 sisaldama 1 bitti nende bittide asemel, mis tuleks operandis 1 määrata 1;

2) teatud numbrite (bittide) nullimiseks kasutatakse käsku ja operandi_1, operandi_2.

Selles juhises peab maskina toimiv operand_2 sisaldama nullbitti nende bittide asemel, mis peavad olema määratud 0-ks operandis_1;

3) rakendatakse käsku xor operand_1, operandi_2:

a) välja selgitada, millised bitid operandis_1 ja operandis erinevad;

b) inverteerida operandi_1 määratud bittide olek.

Käsu xorg täitmisel meid huvitavad maskibitid (operand_2) peavad olema üksikud, ülejäänud peavad olema nullid;

Määratud bittide oleku kontrollimiseks kasutatakse käsku test operand_1, operand_2 (kontrolli operand_1).

Operandi_1 kontrollitud bitid maskis (operand_2) peavad olema seatud ühele. Testkäsu algoritm on sarnane käsu ja algoritmiga, kuid see ei muuda operandi_1 väärtust. Käsu tulemuseks on nulllipu zf väärtuse määramine:

1) kui zf = 0, siis loogilise korrutamise tulemusena saadakse nulltulemus ehk maski üks ühikbitt, mis ei ühtinud operandi vastava ühikbitiga;

2) kui zf = 1, siis loogilise korrutamise tulemusena saadakse nullist erinev tulemus, s.t. vähemalt üks maski 1 bitt sobis operandi_1 vastava 1 bitiga.

Testkäsu tulemusele reageerimiseks on soovitav kasutada hüppekäsku jnz silt (Jump if Not Zero) – hüppa, kui nulli lipp zf on nullist erinev või vastupidise toiminguga käsku – jz silt (Jump kui null) - hüppa, kui nulli lipp zf = 0.

Järgmised kaks käsku otsivad esimest operandibitti, mille väärtus on 1. Otsingut saab teha nii operandi algusest kui ka lõpust:

1) bsf operand_1, operand_2 (Bit Scanning Forward) – bittide skaneerimine edasi. Käsk otsib (skaneerib) operandi_2 bitte kõige vähem olulisest kuni kõige olulisemani (bitist 0 kuni kõige olulisemani), otsides esimest bitti, mille väärtus on 1. Kui see leitakse, täidetakse operandi_1 bittide arv see bitt täisarvuna. Kui operandi_2 kõik bitid on 0, siis seatakse nulllipu zf väärtuseks 1, vastasel juhul lähtestatakse lipu zf väärtuseks 0;

2) bsr operand_1, operand_2 (Bit Scaning Reset) – skannib bitte vastupidises järjekorras. Käsk otsib (skaneerib) operandi_2 bitte alates kõige olulisemast kuni kõige vähem oluliseni (kõige olulisemast bitist kuni bitini 0), otsides esimest bitti, mille väärtus on 1. Kui see leitakse, täidetakse operand_1 see bitt täisarvuna. Oluline on, et esimese vasakpoolse ühikubiti asukohta loetaks ikkagi biti 0 suhtes. Kui operandi_2 kõik bitid on 0, siis nulli lipu zf väärtuseks määratakse 1, vastasel juhul lähtestatakse zf lipp 0-le.

Inteli mikroprotsessorite viimastes mudelites on loogiliste käskude rühma ilmunud veel mõned juhised, mis võimaldavad juurdepääsu ühele konkreetsele operandi bitile. Operand võib olla kas mälus või üldregistris. Biti asukoht määratakse biti nihkega operandi vähima tähtsusega biti suhtes. Nihkeväärtuse saab määrata otsese väärtusena või sisalduda üldotstarbelises registris. Nihkeväärtusena saate kasutada käskude bsr ja bsf tulemusi. Kõik juhised määravad valitud biti väärtuse CE lipule.

1) bt operaand, bit_offset (Bit Test) - biti test. Käsk kannab biti väärtuse cf lipule;

2) bts operaand, bit_offset (Bit Test and Set) - biti kontrollimine ja seadistamine. Käsk kannab biti väärtuse CF-lipule ja seab seejärel kontrollitava biti väärtuseks 1;

3) btr operaand, bit_offset (Bit Test and Reset) – biti kontrollimine ja lähtestamine. Käsk kannab biti väärtuse CF lipule ja seab selle biti väärtuseks 0;

4) btc operand, bit_shift (Bit Test and Convert) - biti kontrollimine ja inverteerimine. Käsk mähib biti väärtuse cf-lipu sisse ja pöörab seejärel selle biti väärtuse ümber.

Shift käsud

Selle rühma juhised pakuvad ka operandide üksikute bittide manipuleerimist, kuid erineval viisil kui ülalpool käsitletud loogilised juhised.

Kõik nihkekäsud liigutavad operandivälja bitte vasakule või paremale, olenevalt opkoodist. Kõik nihkekäsud on ühesuguse ülesehitusega – kopeeri operandi, shift_counter.

Nihutatud numbrite arv - vahetuste_arv - asub teise operandi kohas ja seda saab määrata kahel viisil:

1) staatiliselt, mis hõlmab fikseeritud väärtuse määramist vahetu operandiga;

2) dünaamiline, mis tähendab nihkeloenduri väärtuse sisestamist cl-registrisse enne nihkekäsu täitmist.

cl-registri dimensiooni põhjal on selge, et nihkeloenduri väärtus võib olla vahemikus 0 kuni 255. Kuid tegelikult pole see täiesti tõsi. Optimeerimise eesmärgil aktsepteerib mikroprotsessor ainult väärtust viis vähima tähtsusega bitti loendur, st väärtus on vahemikus 0 kuni 31.

Kõik käiguvahetuse juhised seavad ülekandelipu, vt.

Kui bitid nihkuvad operandist välja, tabavad nad esmalt kandelippu, määrates selle võrdseks järgmise biti väärtusega väljaspool operandi. Kuhu see bitt edasi läheb, sõltub nihkekäsu tüübist ja programmi algoritmist.

Tõstukäsklused võib vastavalt tööpõhimõttele jagada kahte tüüpi:

1) lineaarse nihke käsud;

2) tsüklilised nihkekäsud.

Lineaarse nihke käsud

Seda tüüpi käsud hõlmavad käske, mis nihkuvad vastavalt järgmisele algoritmile:

1) järgmine “projitseeritud” bitt seab CF lipu;

2) teisest otsast operandi sisestatud biti väärtus on 0;

3) järgmise biti nihutamisel läheb see CF-lippu, samas kui eelmise nihutatud biti väärtus läheb kaotsi! Lineaarse nihke käsud on jagatud kahte alamtüüpi:

1) loogilised lineaarsed nihkekäsud;

2) aritmeetilised lineaarsed nihkejuhised.

Loogilised lineaarsed nihkekäsud hõlmavad järgmist:

1) shl operand, shift_counter (Shift Logical Left) – loogiline nihe vasakule. Operandi sisu nihutatakse vasakule bittide arvu võrra, mis on määratud nihke_arvuga. Paremal (kõige vähemtähtsa biti positsioonil) sisestatakse nullid;

2) shr operand, shift_count (Shift Logical Right) – loogiline nihe paremale. Operandi sisu nihutatakse paremale bittide arvu võrra, mis on määratud nihke_arvuga. Vasakul (kõige olulisema märgibiti positsioonis) sisestatakse nullid.

Joonis 30 näitab, kuidas need käsud töötavad.

Riis. 30. Lineaarse loogilise nihke käskude töö skeem


Aritmeetilised lineaarsed nihkekäsud erinevad loogilistest nihkekäskudest selle poolest, et need toimivad operandi märgibitil erilisel viisil.

1) sal operand, nihke_loendur (Shift Aithmetic Left) – aritmeetiline nihe vasakule. Operandi sisu nihutatakse vasakule bittide arvu võrra, mis on määratud nihke_arvuga. Paremal (kõige vähemtähtsa biti positsioonil) sisestatakse nullid. Sal käsk ei säilita märki, vaid seab lipu märgivahetusega/juhul järgmine natuke, mida edasi arendada. Vastasel juhul on sal käsk täpselt sama, mis käsk shl;

2) sar operand, shift_counter (Shift Arithmetic Right) – aritmeetiline nihe paremale. Operandi sisu nihutatakse väärtusega määratud bittide arvu võrra paremale vahetuste_arv. Vasakpoolsesse operandi sisestatakse nullid. Käsk sar säilitab märgi, taastades selle pärast iga bitivahetust.

Joonis 31 näitab, kuidas lineaarsed aritmeetilised nihkejuhised töötavad.


Riis. 31. Lineaararitmeetiliste nihkekäskude tööskeem

Käskude pööramine

Tsüklilise nihke juhised sisaldavad juhiseid, mis salvestavad nihutatud bittide väärtused. Tsüklilise nihke juhiseid on kahte tüüpi:

1) lihtsad tsüklilised nihkekäsud;

2) tsüklilised nihkekäsud kandelipu kaudu, vt.

Meeskondadele lihtne tsükliline lõikamine sisaldab:

1) rulloperand, nihkeloendur (Rotate Left) – tsükliline nihe vasakule. Operandi sisu nihutatakse vasakule operandi määratud bittide arvu võrra. vahetuste_arv. Vasakule nihutatud bitid kirjutatakse samale operandile paremalt;

2) gog-operand, counter_shifts (Pööra paremale) - tsükliline nihe paremale. Operandi sisu nihutatakse paremale operandi määratud bittide arvu võrra. vahetuste_arv. Paremale nihutatud bitid kirjutatakse samale vasakpoolsele operandile.

Riis. 32. Lihtsa tsüklilise nihke käskude tööskeem


Nagu on näha jooniselt 32, sooritavad lihtsa tsüklilise nihke juhised oma töö käigus ühe kasuliku toimingu, nimelt: tsükliliselt nihutatud bitt mitte ainult ei suruta teisest otsast operandi, vaid samal ajal ka selle. väärtus muutub CE lipu väärtuseks.

Käskude pööramine kandelipu CF kaudu erinevad lihtsatest tsüklilistest nihkekäskudest selle poolest, et nihutatud bitt ei sisene kohe operandi teisest otsast, vaid kirjutatakse esmalt kandelippu CE Ainult selle nihkekäsu järgmine täitmine (eeldusel, et see täidetakse tsüklis) viib operandi teisest otsast eelnevalt edasiarendatud biti paigutamiseni(joonis 33).

Tsüklilistele nihkekäskudele kandelipu kaudu järgmised on seotud:

1) rcl operand, shift_count (Rotate through Carry Left) – tsükliline vasakule nihe kandmise kaudu.

Operandi sisu nihutatakse vasakule operandi määratud bittide arvu võrra. vahetuste_arv. Nihutatud bitid muutuvad omakorda ülekandelipu väärtuseks, vt.

2) rsg operand, shift_counter (Rotate through Carry Right) – tsükliline paremale nihe läbi kande.

Operandi sisu nihutatakse paremale operandi määratud bittide arvu võrra. vahetuste_arv. Nihutatud bitid muutuvad omakorda ülekandelipu CF väärtuseks.

Riis. 33. Pöörake juhiseid Carry Flag CF kaudu


Joonisel 33 on näha, et kandelipu kaudu nihutamisel ilmub vaheelement, mille abil on võimalik eelkõige asendada tsükliliselt nihutatud bitte, eelkõige kokkusobimatu bitijadad.

Edaspidi tähendab bitijada ebakõla toimingut, mis võimaldab mingil viisil lokaliseerida ja eraldada selle jada vajalikud lõigud ja kirjutada need teise kohta.

Täiendavad nihkekäsud

Inteli mikroprotsessorite uusimate mudelite juhiste komplekt, alates i80386-st, sisaldab täiendavaid nihutamisjuhiseid, mis laiendavad varem käsitletud võimalusi. Need on vahetuskäsud topelttäpsus: 1) shld operand_1, operaand_2, nihke_loendus – kahekordne täpsus vasak nihe. Käsk shld teostab asendust, nihutades operandi_1 bitte vasakule, täites selle parempoolsed bitid nende bittide väärtustega, mida operandist_2 välja tõrjutakse vastavalt joonisel fig. 34. Nihutatud bittide arv määratakse väärtusega shift_count, operand_2 ei muutu.


Riis. 34. Shld käsu skeem


2) shrd operaand_1, operaand_2, nihke_loendus - topelttäpsus paremale nihke. Käsk teostab asendust, nihutades operandi operandi_1 bitte paremale, täites selle vasakpoolsed bitid operandist_2 nihutatud bittide väärtustega vastavalt joonisel 35 olevale skeemile. Nihutatud bittide arvu määrab väärtus shift_count, mis võib olla vahemikus 0...31. Selle väärtuse võib anda vahetu operandi või sisalduda registris cl. Tähendus operand_2 ei muutu.

Riis. 35. Käsu shrd skeem


Nagu märkisime, nihutavad käsud shld ja shrd kuni 32 bitti, kuid operandide määramise ja toimimisalgoritmi iseärasuste tõttu saab neid käske kasutada kuni 64 biti pikkuste väljadega töötamiseks.

2. Juhtimise ülekandekäsud

Saime tuttavaks mõne moodustunud võistkonnaga lineaarne programmi osad. Igaüks neist teostab üldjuhul mingi andmekonversiooni või -edastuse, mille järel annab mikroprotsessor juhtimise üle järgmisele käsule. Kuid väga vähesed programmid töötavad nii järjekindlalt. Tavaliselt on programmis punktid, kus tuleb otsustada, milline käsk järgmisena täidetakse. See lahendus võiks olla:

1) tingimusteta - siinkohal on vaja juhtimine üle anda mitte järgmisele käsule, vaid teisele, mis on praegusest käsust teatud kaugusel;

2) tingimuslik - otsus, milline käsk järgmisena täidetakse, tehakse mõne tingimuste või andmete analüüsi põhjal.

Programm on käskude ja andmete jada, mis hõivavad teatud hulga RAM-i ruumi. See mäluruum võib olla külgnev või koosneda mitmest fragmendist.

Millist programmi käsku järgmisena täita, õpib mikroprotsessor registripaari sisust cs:(e)ip:

1) cs – koodilõigu register, mis sisaldab kehtiva koodilõigu füüsilist (baas)aadressi;

2) eip/ip - käskude osutiregister, mis sisaldab väärtust, mis tähistab järgmise täidetava käsu nihet mälus jooksva koodilõigu alguse suhtes.

Millist konkreetset registrit kasutatakse, sõltub määratud adresseerimisrežiimist use16 või use32. Kui on määratud use 16, siis kasutatakse ip-d, kui use32, siis eip.

Seega muudavad juhtülekande käsud cs ja eip / ip registrite sisu, mille tulemusena valib mikroprotsessor täitmiseks mitte järgmise programmikäsu järjekorras, vaid käsu mõnes teises programmi jaotises. Mikroprotsessori sees olev torujuhe lähtestatakse.

Vastavalt tööpõhimõttele võib programmis üleminekuid korraldavad mikroprotsessori käsud jagada kolme rühma:

1. Juhtkäskude tingimusteta üleandmine:

1) tingimusteta harukäsk;

2) protseduuri kutsumise ja protseduurilt naasmise käsk;

3) käsk tarkvarakatkestuste väljakutsumiseks ja tarkvarakatkestustelt naasmiseks.

2. Käsud juhtimise tingimuslikuks üleandmiseks:

1) hüppekäsklused võrdluskäsu p tulemuse järgi;

2) üleminekukäsklused vastavalt teatud lipu olekule;

3) juhised esx/cx registri sisust läbi hüppamiseks.

3. Tsükli juhtimise käsud:

1) käsk tsükli korraldamiseks loenduriga ехх/сх;

2) käsk tsükli korraldamiseks loenduriga ех/сх koos lisatingimusega tsüklist varajase väljumise võimalusega.

Tingimusteta hüpped

Eelmine arutelu on paljastanud mõningaid üleminekumehhanismi üksikasju. Hüppekäsud muudavad eip/ip käsuosutiregistrit ja võib-olla ka cs-koodi segmendi registrit. Mida täpselt tuleb muuta, sõltub:

1) operandi tüübi kohta tingimusteta harukäskes (lähedal või kaugel);

2) hüppeaadressi eelsest näidust (hüppejuhises) modifikaator; sel juhul võib hüppeaadress ise asuda kas otse käsus (otsene hüpe) või registris või mälulahtris (kaudne hüpe).

Modifikaator võib võtta järgmisi väärtusi:

1) near ptr – otsene üleminek praeguse koodisegmendi sees olevale sildile. Ainult eip/ip registrit muudetakse (olenevalt määratud kasutus16 või kasutus32 koodisegmendi tüübist) käsus määratud aadressi (sildi) või väärtuse eraldamise sümbolit kasutava avaldise alusel - $;

2) far ptr - otsene üleminek sildile teises koodisegmendis. Hüppeaadress on määratud vahetu operandi või aadressina (märgisena) ja koosneb 16-bitisest selektorist ja 16/32-bitisest nihkest, mis laetakse vastavalt cs ja ip/eip registritesse;

3) sõna ptr - kaudne üleminek praeguse koodilõigu sees olevale sildile. Muudetakse ainult eip/ip (nihke väärtusega mälust käsus määratud aadressil või registrist). Nihke suurus 16 või 32 bitti;

4) dword ptr - kaudne üleminek sildile teises koodisegmendis. Mõlemat registrit muudetakse (väärtusega mälust - ja ainult mälust, registrist) - cs ja eip / ip. Selle aadressi esimene sõna/dword tähistab nihet ja laaditakse ip/eip-i; teine/kolmas sõna laetakse cs-sse. jmp tingimusteta hüppejuhis

Tingimusteta hüppe käsusüntaks on jmp [modifier] hüppe_aadress – tingimusteta hüpe ilma tagasipöördumispunkti teavet salvestamata.

Hüppe_aadress on aadress sildi kujul või selle mäluala aadress, kus hüppekursor asub.

Kokku on mikroprotsessori käsusüsteemis tingimusteta hüppe jmp jaoks mitu masinkäskude koodi.

Nende erinevused on määratud üleminekukauguse ja sihtaadressi täpsustamise viisiga. Vahemikülemineku määrab operandi asukoht hüppe_aadress. See aadress võib olla praeguses koodisegmendis või mõnes muus segmendis. Esimesel juhul nimetatakse üleminekut segmendisisene, või Sulge, teises - intersegment, või kauge. Segmendisisene hüpe eeldab, et muudetakse ainult eip/ip registri sisu.

Käsu jmp segmendisiseseks kasutamiseks on kolm võimalust:

1) sirge lühike;

2) sirge;

3) kaudne.


Protseduurid

Assembly keeles on mitu tööriista, mis lahendavad koodiosade dubleerimise probleemi. Need sisaldavad:

1) protseduuride mehhanism;

2) makrokoostaja;

3) katkestusmehhanism.

Protseduur, mida sageli nimetatakse alamprogramm, see on mõne ülesande lagunemise (jagades mitmeks osaks) põhifunktsionaalne üksus. Protseduur on käskude rühm konkreetse alamülesande lahendamiseks ja sellel on vahendid kontrolli saamiseks punktist, kus ülesanne kutsutakse kõrgemale tasemele, ja tagastada juhtimine sellele punktile.

Kõige lihtsamal juhul võib programm koosneda ühest protseduurist. Teisisõnu, protseduuri saab defineerida kui hästi moodustatud käskude kogumit, mida ühekordselt kirjeldatuna saab vajaduse korral programmis kõikjal välja kutsuda.

Käskude jada kirjeldamiseks protseduurina assemblerkeeles kasutatakse kahte direktiivi: PROC ja ENDP.

Protseduuri kirjelduse süntaks on järgmine (joonis 36).


Riis. 36. Protseduuri kirjelduse süntaks programmis


Jooniselt 36 on näha, et protseduuri päises (PROC direktiiv) on kohustuslik ainult protseduuri nimi. PROC direktiivi suure hulga operandide hulgast tuleks esile tõsta [kaugust]. See atribuut võib võtta väärtused lähedal või kaugel ja iseloomustab võimalust kutsuda protseduur mõnest teisest koodisegmendist. Vaikimisi on atribuut [kaugus] seatud lähedale.

Protseduuri saab paigutada suvalisse kohta programmi, kuid nii, et see ei saaks juhuslikult kontrolli. Kui protseduur sisestatakse lihtsalt üldisesse käsuvoogu, tajub mikroprotsessor protseduuri juhiseid selle voo osana ja täidab vastavalt protseduuri juhiseid.

Tingimuslikud hüpped

Mikroprotsessoril on 18 tingimuslikku hüppekäsku. Need käsud võimaldavad teil kontrollida:

1) märgiga operandide seos (“rohkem - vähem”);

2) ilma märgita operandide seos ("kõrgem - madalam");

3) aritmeetiliste lippude ZF, SF, CF, OF, PF (kuid mitte AF) olekud.

Tingimuslikel hüppekäsklustel on sama süntaks:

jcc jump_label

Nagu näete, algab kõigi käskude mnemokood "j"-ga - sõnast hüpata(põrge), tema - määrab käsuga sõelutava konkreetse tingimuse.

Seoses operandiga jump_label, siis saab see silt olla ainult praeguses koodisegmendis, segmentidevaheline juhtimise ülekandmine tingimushüpetes ei ole lubatud. Sellega seoses pole küsimust modifikaatorist, mis esines tingimusteta hüppekäskude süntaksis. Varasemates mikroprotsessori mudelites (i8086, i80186 ja i80286) said tingimuslikud harukäsud teha ainult lühikesi hüppeid - tingimuslikule harujuhisele järgnevast käsust -128 kuni +127 baiti. Alates mikroprotsessori mudelist 80386 on see piirang eemaldatud, kuid nagu näete, ainult praeguse koodisegmendi piires.

Otsuse langetamiseks, kuhu suunatakse juhtimine üle tingimuslikule hüppekäsule, tuleb esmalt moodustada tingimus, mille alusel tehakse otsus juhtimise üleandmise kohta.

Sellise seisundi allikad võivad olla:

1) mis tahes käsk, mis muudab aritmeetiliste lippude olekut;

2) võrdluskäsk p, mis võrdleb kahe operandi väärtusi;

3) esx/cx registri olek.


cmp võrdluskäsk

Lehekülje võrdlemise käsul on huvitav tööviis. See on täpselt sama, mis lahutamiskäsu puhul – alamoperand, operand_2.

P-käsk, nagu alamkäsk, lahutab operandid ja seab lipud. Ainus, mida ta ei tee, on lahutamise tulemuse kirjutamine esimese operandi asemele.

Käsu str süntaks - str operand_1, operaand_2 (võrdle) - võrdleb kahte operandi ja seab võrdluse tulemuste põhjal lipud.

P käsuga seatud lippe saab analüüsida spetsiaalsete tingimuslike harukäskude abil. Enne kui neid vaatame, pöörame pisut tähelepanu nende tingimuslike hüppejuhiste mnemoonikale (tabel 16). Märgistuste mõistmine tingimuslike hüppekäskude nime moodustamisel (element jcc käsu nimes, me määrasime selle) hõlbustab nende meeldejätmist ja edasist praktilist kasutamist.

Tabel 16. Lühendite tähendus jcc käsunimes
Tabel 17. Käsu str operand_1, operand_2 tingimuslike harukäskude loend

Ärge imestage, et samadele lipuväärtustele vastavad mitu erinevat tingimuslike harukäskude mnemoonilist koodi (tabelis 17 eraldatakse need üksteisest kaldkriipsuga). Nimeerinevus tuleneb mikroprotsessorite arendajate soovist lihtsustada tingimuslike hüppekäskude kasutamist kombineerituna teatud käsurühmadega. Seetõttu peegeldavad erinevad nimetused pigem erinevat funktsionaalset orientatsiooni. Kuid asjaolu, et need käsud vastavad samadele lippudele, muudab need programmis absoluutselt samaväärseks ja võrdseks. Seetõttu on tabelis 17 need rühmitatud mitte nime, vaid nende lippude (tingimuste) väärtuste järgi, millele nad vastavad.


Tingimuslikud harujuhised ja lipud

Mõne tingimusliku hüppejuhise mnemooniline tähistus peegeldab lipu nime, millega need töötavad, ja sellel on järgmine struktuur: tähemärk "j" on esimene (Hüppa,üleminek), teine ​​on kas lipu tähis või eitussümbol "n", millele järgneb lipu nimi. See meeskonna struktuur peegeldab selle eesmärki. Kui n-märki pole, siis kontrollitakse lipu olekut, kui see on võrdne 1-ga, tehakse üleminek hüppesildile. Kui sümbol "n" on olemas, siis kontrollitakse lipu olekut 0-ga ja kui see õnnestub, tehakse hüpe hüppesildile.

Käskude märguanded, lippude nimed ja hüppetingimused on näidatud tabelis 18. Neid käske saab kasutada pärast kõiki käske, mis muudavad määratud lippe.

Tabel 18. Tingimuslikud hüppejuhised ja lipud

Kui vaatate tabeleid 17 ja 18 tähelepanelikult, näete, et paljud neis olevad tingimuslikud hüppejuhised on samaväärsed, kuna mõlemad põhinevad samade lippude analüüsil.


Tingimuslikud hüppejuhised ja esx/cx register

Mikroprotsessori arhitektuur hõlmab paljude registrite spetsiifilist kasutamist. Näiteks kasutatakse akumulaatorina registrit EAX / AX / AL ja virnaga töötamiseks registreid BP, SP. ECX / CX registril on ka teatud funktsionaalne eesmärk: see täidab rolli loendur tsükli juhtkäskudes ja märgistringidega töötamisel. Võimalik, et funktsionaalselt oleks esx/cx registriga seotud tingimuslik harukäsk õigemini sellele käskude rühmale omistatud.

Selle tingimusliku harukäsu süntaks on:

1) jcxz jump_label (Hüppa, kui ex on null) – hüppa, kui сх on null;

2) jecxz jump_label (Jump Equal ех Zero) – hüppa, kui ех on null.

Need käsud on väga kasulikud silmuse loomisel ja märgistringidega töötamisel.

Tuleb märkida, et käsule jcxz/jecxz on omane piirang. Erinevalt teistest tingimuslikest edastuskäskudest saab jcxz/jecxz käsk käsitleda ainult lühikesi hüppeid -128 baiti või +127 baiti sellele järgnevast käsust.

Tsüklite organiseerimine

Tsükkel, nagu teate, on oluline algoritmiline struktuur, ilma milleta ilmselt ükski programm hakkama ei saa. Saate korraldada teatud programmiosa tsüklilist täitmist, kasutades näiteks juhtkäskude tingimuslikku ülekandmist või tingimusteta hüppekäsku jmp. Sellise tsüklikorralduse korral tehakse kõik selle organisatsiooni toimingud käsitsi. Kuid arvestades sellise algoritmilise elemendi kui tsükli tähtsust, lisasid mikroprotsessori arendajad käsusüsteemi kolmest käsust koosneva rühma, mis hõlbustab tsüklite programmeerimist. Need käsud kasutavad ka esx/cx registrit as tsükliloendur.

Kirjeldame lühidalt neid käske: 1) loop jump_label (Loop) – korrake tsüklit. Käsk võimaldab teil korraldada silmuseid, mis on sarnased kõrgetasemeliste keelte silmustele, silmusloenduri automaatse vähendamisega. Meeskonna ülesanne on teha järgmist:

b) ECX/CX registri võrdlemine nulliga: kui (ECX/CX) = 0, siis antakse juhtimine üle tsükli järel järgmisele käsule;

2) loope/loopz jump_label

Loope ja loopz käsud on absoluutsed sünonüümid. Käskude ülesanne on täita järgmisi toiminguid:

a) ECX/CX registri vähendamine;

c) nulllipu ZF oleku analüüs, kui (ECX/CX) = 0 või XF = 0, antakse juhtimine üle tsükli järel järgmisele käsule.

3) loopne/loopnz jump_label

Käsud loopne ja loopnz on samuti absoluutsed sünonüümid. Käskude ülesanne on täita järgmisi toiminguid:

a) ECX/CX registri vähendamine;

b) ECX/CX registri võrdlemine nulliga;

c) nulllipu ZF oleku analüüs: kui (ECX/CX) = 0 või ZF = 1, antakse juhtimine üle tsükli järel järgmisele käsule.

Loop/loopz ja loopne/loopnz käsud on oma töös vastastikused. Need laiendavad silmuskäsu tegevust, sõeludes lisaks zf-lipu, mis võimaldab korraldada tsüklist varajase väljumise, kasutades seda lippu indikaatorina.

Silmuskäskude loop, loop/loopz ja loopne/loopnz puuduseks on see, et need rakendavad ainult lühikesi hüppeid (-128 kuni +127 baiti). Pikkade silmustega töötamiseks peate kasutama tingimuslikke hüppeid ja jmp-juhiseid, seega proovige hallata mõlemat silmuste korraldamise viisi.

loogiline VÕI, mooduli 2 liitmine (XOR);
  • loogilised, aritmeetilised ja tsüklilised nihked;
  • bittide ja operandide kontrollimine;
  • seadistus- ja tühjendusbitid (lipud) staatuse register protsessor ( PSW).
  • Loogikakäsud võimaldavad põhiliste loogiliste funktsioonide bittihaaval arvutamist kahest sisendoperandist. Lisaks kasutatakse määratud bittide kustutamise sundimiseks operatsiooni AND ( AND ) (ühe operandina kasutab see maskikoodi, milles tühjendamist vajavad bitid nullitakse). Määratud bittide sundimiseks kasutatakse operatsiooni VÕI (OR) (ühe operandina kasutatakse maskikoodi, milles ühele seadmist vajavad bitid on võrdsed ühega). XOR-operatsiooni (XOR) kasutatakse etteantud bittide inverteerimiseks (ühe operandina kasutatakse maskikoodi, milles inverteeritavad bitid on seatud ühele). Käsud nõuavad kahte sisendoperandi ja moodustavad ühe väljundoperandi.

    Nihutamiskäsud võimaldavad nihutada operandi koodi bittide kaupa paremale (madalamate bittide poole) või vasakule (kõrgemate bittide poole). Nihutuse tüüp (tõve, aritmeetiline või tsükliline) määrab, milline on kõige olulisema biti uus väärtus (paremale nihutamisel) või vähima tähtsusega biti uus väärtus (vasakule nihutamisel) ning määrab ka selle, kas kõige olulisema biti vana väärtus on bitt salvestatakse kuhugi (vasakule nihutamisel) või kõige vähem oluline bitt (paremale nihutamisel). Näiteks loogilise nihke ajal paremale seatakse operandi koodi kõige olulisem bitt nulliks ja kõige vähem oluline bitt kirjutatakse protsessori olekuregistrisse kandelipuna. Ja aritmeetilise nihkega paremale jääb kõige olulisema biti väärtus samaks (null või üks), vähima tähtsusega bitt kirjutatakse ka kandelipuks.

    Pöördnihked võimaldavad nihutada operandi koodi bitte ringikujuliselt (paremale nihutamisel päripäeva või vasakule nihutamisel vastupäeva). Sel juhul võib käiguvahetusrõngas sisaldada kandelippu, kuid ei pruugi sisaldada. Kandelipu bitt (kui seda kasutatakse) on vasakule pööramise jaoks seatud kõige olulisemaks bitiks ja paremale pööramiseks kõige vähem oluliseks bitiks. Vastavalt sellele kirjutatakse ülekandelipu biti väärtus vasakpoolse tsüklilise nihke korral ümber kõige vähem oluliseks bitiks ja parempoolse tsüklilise nihke korral kõige olulisemaks bitiks.

    Näiteks joonisel fig. 3.12 näitab parempoolsete nihkekäskude poolt sooritatavaid toiminguid.

    Bitide ja operandi kontrollimise juhised on mõeldud bittide seadistamiseks või tühjendamiseks staatuse register protsessor sõltuvalt valitud bittide väärtusest või kogu operandist tervikuna. Käsu väljundoperandi ei moodustata. operandi kontrollimise juhend ( TST) kontrollib kogu operandi koodi tervikuna nulli ja märgi jaoks (kõige olulisema biti väärtuse jaoks), selleks on vaja ainult ühte sisendoperandi. Bititesti käsk (BIT ) testib ainult üksikuid bitte, mis valitakse teise operandina maskikoodi kasutades. Maski koodis peavad põhioperandi kontrollitud bitid vastama ühekohalistele numbritele.


    Riis. 3.12.

    Lõpuks käsud bittide seadmiseks ja tühjendamiseks staatuse register protsessor (st lipud) võimaldavad teil määrata või kustutada mis tahes lipu, mis on väga mugav. Iga lipp on tavaliselt seotud kahe käsuga, millest üks seab selle ühele ja teine ​​lähtestab selle nullile. Näiteks ülekandelipule C (alates Carry ) vastaks CLC (selge) ja SEC või STC (komplekt).

    3.3.4. Hüppamise käsud

    Hüppamise käsud on mõeldud igasuguste tsüklite, harude, alamprogrammide kõnede jms korraldamiseks, see tähendab, et need häirivad programmi järjestikust voogu. Need käsud kirjutavad käsuloenduri registrisse uue väärtuse ja panevad seeläbi protsessori hüppama mitte järgmise käsu juurde, vaid mis tahes muule programmimälus olevale käsule. Mõned hüppekäsklused näevad ette edasise tagasipöördumise hetkeni, kust üleminek tehti, teised seda ette ei näe. Kui tagastus on ette nähtud, salvestatakse praegused protsessori parameetrid virna. Kui tagastus puudub, siis praeguseid protsessori parameetreid ei salvestata.

    Hüppamise käsud ilma tagastamiseta jagunevad kahte rühma:

    • meeskonnad tingimusteta hüpped;
    • meeskonnad tingimuslikud hüpped.

    Need käsud kasutavad sõnu haru(haru) ja Hüppa(põrge).

    Meeskonnad tingimusteta hüpped põhjustada hüppe uuele aadressile. Need võivad põhjustada hüppe määratud nihkeväärtusele (edasi või tagasi) või määratud mäluaadressile. Nihkeväärtus või uus aadressi väärtus määratakse sisendoperandiks.

    Meeskonnad tingimuslikud hüpped põhjustada üleminekut mitte alati, vaid ainult siis, kui määratud tingimused on täidetud. Sellised tingimused on tavaliselt protsessori olekuregistris olevate lippude väärtused ( PSW). See tähendab, et üleminekutingimus on eelmise toimingu tulemus, mis muudab lippude väärtusi. Kokku võib selliseid üleminekutingimusi olla 4 kuni 16. Mitmed näited käskudest tingimuslikud hüpped:

    • hüpata, kui võrdne nulliga;
    • hüpata, kui nullist erinev;
    • hüpata ülevoolu korral;
    • hüpata, kui ülevoolu pole;
    • hüpata, kui see on suurem kui null;
    • hüpata, kui nullist väiksem või sellega võrdne.
    uus väärtus. Kui hüppetingimus ei ole täidetud, suurendatakse lihtsalt käsuloendurit ning protsessor valib ja täidab järjestikku järgmise käsu.

    Võrdluskäsk ( CMP) enne käsku tingimuslik hüpe(või isegi mitu käsku tingimuslikud hüpped). Aga lippe saab määrata näiteks mis tahes muu käsuga edastamise käsk andmed, mis tahes aritmeetika või loogiline käsk. Pange tähele, et me ise hüppekäsklused lipud ei muutu, mis võimaldab teil lihtsalt määrata mitu hüppekäsklusedükshaaval.

    Mitme tingimusliku ja tingimusteta hüpped võimaldab protsessoril täita mis tahes keerukusega hargnenud algoritme. Näiteks joonisel fig. 3.13 näitab programmi hargnemist kaheks haruks, millele järgneb ühendus ja joonisel fig. 3.14 - hargnemine kolmeks haruks, millele järgneb ühendus.

    Hüppamise käsud naasmisega punkti, kust üleminek tehti, kasutatakse alamprogrammide, st abiprogrammide täitmiseks. Neid käske nimetatakse ka alamprogrammi kutsumiskäskudeks (üldnimetus on CALL). Alamprogrammide kasutamine võimaldab lihtsustada põhiprogrammi struktuuri, muutes selle loogilisemaks, paindlikumaks, hõlpsasti kirjutatavaks ja silumiseks. Samas tuleb arvestada, et alamprogrammide laialdane kasutamine pikendab reeglina programmi täitmise aega.


    Riis. 3.13.


    Riis. 3.14.

    Kõik hüppekäsklused tagasitulekuga eeldavad tingimusteta hüpet (nad ei kontrolli ühtegi lippu). Kuid need nõuavad ühte sisendoperandi, mis võib näidata nii uue aadressi absoluutväärtust kui ka praegusele aadressi väärtusele lisatud nihet. Programmi loenduri praegune väärtus (praegune aadress) salvestatakse enne haru käivitamist pinus.

    Kutsupunkti naasmiseks

    mikroprotsessori juhised.

    Nüüd vaatame lähemalt täidetavaid käske. Iga mikroprotsessori kogu juhiste komplekti saab jagada mitmeks rühmaks.

    Esimene rühm - See andmete liikumise käsud. Nendele käskudele alludes kopeerib protsessor ühe mäluelemendi sisu teise, kopeerib teabe mäluelemendist ühte siseregistritest või, vastupidi, kopeerib registri sisu ühte mälurakkudest. Lisaks saab andmeid kopeerida ühest siseregistrist teise.

    Tuleb märkida, et nn liigutamiskäsud tegelikult ei liiguta andmeid lahtrist lahtrisse, vaid kopeerivad need andmed. Kolimisoperatsioon digitaaltehnoloogias on mõttetu. Tavamõistes tähendab liigutamine ühest kohast eemaldamist ja teise asetamist. Kuid andmeid mäluelemendist eemaldada on võimatu!

    Mis tahes mäluelemendi bitt on alati võrdne nulli või ühega. See tähendab, et see sisaldab alati mõnda numbrit. Seetõttu teisaldage käsud, mis loevad lähtelahtrist baite andmeid ja kirjutage need sihtlahtrisse. Sel juhul lähtelahtri andmed ei muutu.

    Co. teiseks rühm on andmete teisendamise käsud. Just see rühm sisaldab käske liitmiseks, lahutamiseks, loogilisteks teisendusteks, numbrite nihutamiseks jne.

    Kolmas rühm sisaldab kontrolli edastuskäsud. Tahaksin sellest käskude klassist lähemalt rääkida. Raske on ette kujutada programmi, mis koosneb ainult ühest järjestikusest käsuahelast. Valdav enamik algoritme nõuab programmi hargnemist. See tähendab, et programm peab suutma sooritada erinevaid toimingute jadasid olenevalt mingist tingimusest.

    Näide.

    Oletame, et meie mikroprotsessorseadmel on juhtnupud. Iga nupu vajutamisel tuleb teha konkreetne toiming. Näiteks ühe nupu vajutamisel peaks täiturmehhanism pöörduma vasakule. Kui vajutate teist- pöörake paremale jne. Selle võimaldamiseks loeb programm perioodiliselt nuppude olekut. Seejärel peaks programm hindama nende seisundit. Kui vajutada esimest nuppu, täidetakse teatud käskude jada, mis annab vastavale pordile koodi, mis viib mootori kaasamiseni edasisuunas. Kui vajutada teist nuppu, siis käivitatakse teine ​​käskude jada, mis annab samale pordile täiesti erineva koodi. See kood peaks käivitama mootori tagurpidi.

    Ilmselt on selle algoritmi rakendamiseks vaja käskude järjestikune täitmine katkestada. Selleks, et programm saaks oma töö algoritmi olenevalt mis tahes tingimustest muuta, sisaldab mis tahes protsessori käsusüsteem tingimata juhtimise ülekandmise käske. Juhtimise ülekandmise käsud hõlmavad järgmist tüüpi käske: tingimuslikud hüppekäsud; tingimusteta harukäsud; käske hüpata alamprogrammile; tsükli korraldamise käsud. Vaatleme kõiki seda tüüpi käske järjekorras.

    Tingimuslikud ja tingimusteta harukäsud

    Mõlemad seda tüüpi käsud on mõeldud programmi järjestikuse täitmise katkestamiseks ja nn. üleminek. Pealegi toimub tingimuslik üleminek ainult siis, kui teatud tingimus on täidetud. Tingimusteta hüpe sooritatakse alati, kui programm kohtab vastavat käsku. Üleminekutingimused võivad olla üks järgmistest loogilistest avaldistest:

    ♦ väärtus A on võrdne väärtus B;

    ♦ väärtus A pole võrdne väärtus B;

    ♦ väärtus A vähem väärtused B;

    ♦ väärtus A rohkem väärtused B;

    ♦ väärtus A väiksem või võrdne väärtus B;

    ♦ väärtus A suurem või võrdne V suurus.

    Võrdlusväärtused võivad olla mis tahes sisemiste protsessori registrite sisu, mis tahes mälurakkude sisu või lihtsalt konstandid.

    Näide.

    Vaatleme näidet tingimuslike ja tingimusteta hüpete kasutamisest. Selguse huvides kujutame programmimälus olevat käskude ahelat graafiliste elementide jadana (vt joonis 1).riis. 2.2). Programmi edenemist näidatakse nooltega. Ruudud tähistavad tavalisi käske (liikumiskäsud ja andmete teisenduskäsud). Ring koos küsimusega- See on tingimuslik hüppejuhis. Ümardatud hüüumärgi element- see on tingimusteta üleminek. Sellel programmil on kaks haru. Kui tingimus on väär, täidetakse haru number 1. Kui tingimus- tõsi, haru number 2 täidetakse.

    Oletame, et tingimuslik haru võrdleb vajutatud klahvi koodi mõne konstandiga. Seejärel saab tingimuslausega tehtud toimingu kirjutada järgmiselt: "Kui vajutatud klahvi kood on 0, minge haru number 2 täitmisele." Seega, kui tingimus ei ole täidetud (näiteks lugemisnumber on 1), jätkab programm oma tööd tavapärases režiimis ja jätkab seega haru number 1 täitmist.

    Juhtimise edastuskäskude rühmas eristatakse nelja tüüpi käske: tingimusteta hüpped, tingimuslikud hüpped, silmused ja katkestused .

    Tingimusteta hüpete käsud. Sisaldab kolme mnemokoodi: JMP (tingimusteta haru), CALL (alamprogrammi kutse) ja RET (alamprogrammi tagastamine).

    JMP-käsk võimaldab teil hüpata programmi mis tahes punkti, mis asub nii praeguses programmisegmendis kui ka teises segmendis. Praeguses programmisegmendis hüppamisel kasutatakse JMP-käsu kolme esimest vormingut.

    Esimene vorming annab ülemineku programmi suvalisele punktile praeguses programmisegmendis, mille jaoks lisatakse IP-sisule lisakoodis 16-bitine nihe, mille kõige olulisem bitt on märk. Teine, lühendatud vorming võimaldab teil hüpata programmis punkti, mis ei ole JMP-käsklusest kaugemal kui -128-f-127 aadressi. Lõpuks laadib kolmas vorming käsu osuti 16-bitise numbriga, mis asub EA täitmisaadressil, mille määrab postbait. Seda üleminekut nimetatakse kaudseks, kuna kasutatakse kaudset adresseerimist.

    Tingimusteta hüppe rakendamiseks väljaspool praegust programmisegmenti asuvasse programmipunkti, kui on vaja CS segmendi registrit uuesti laadida, kasutatakse JMP käsu neljandat ja viiendat vormingut.

    Neljas vorming määratleb otsese segmentidevahelise ülemineku, mille puhul vormingu teine ​​ja kolmas bait näitavad üleminekupunkti suhtelist aadressi ning neljas ja viies bait tähistavad uut CS väärtust. Viies vorming, kasutades postbaiti, võimaldab määrata täitmisaadressi EA, kus asub üleminekupunkti suhteline aadress (mälubaitides aadressidega EA, EA+1) ja uue väärtuse CS (mälubaitides EA +2, EA+3).

    Käsk CALL võimaldab kutsuda alamprogrammi, mis asub nii praeguses programmisegmendis kui ka mõnes teises mälupiirkonnas. Sellel on samad vormingud kui JMP juhisel, välja arvatud lühem. Erinevalt sarnase vormingu JMP-käsklusest kirjutab CALL-käsk enne IP- või IP- ja CS-väärtuste muutmist automaatselt virna nende registrite praegused väärtused, mis tagab alamprogrammi tagastuspunkti meeldejätmise.

    Alamprogrammist naasmiseks kasutatakse RET-käsku, mille toimel kantakse juhtimine üle eelmise CALL-käsu täitmisel pinu lükatud tagastusaadressile. Aktiivses programmisegmendis asuvatest alamprogrammidest naastes kasutatakse RET-käsu kahte esimest vormingut ning teine ​​vorming erineb esimesest selle poolest, et pinukursori sisule lisatakse konstant, mis on kirjutatud 2. Käsu 3. bait. See võimaldab samaaegselt alamprogrammi naasmisega lähtestada selle alamprogrammi täitmise ajal pinu kirjutatud ja edaspidi kasutamata parameetrid.

    Segmentidevaheliseks tagastamiseks kasutatakse kolmandat ja neljandat RET-vormingut, mis tagavad nii käsuosuti kui ka programmisegmendi sisu taastamise.

    Tingimuslikud hüppekäsklused. Teostage kontrolli üleandmine sõltuvalt eelnevate toimingute tulemustest. Märgiga arvude, märgita arvude ja suvaliste arvude vaheliste seoste loomiseks kasutatakse kolme tüüpi tingimuslikke hüppeid. Kahes esimeses variandis valitakse samade arvude vahekordade jaoks erinevad käsumnemoonikud, kuna erinevad lipuväärtused vastavad samadele märgistatud ja märgita numbrite suhetele.

    Tingimuslike hüppekäskude mnemotehnikas märgiga numbrite võrdlemisel kasutatakse tähte tingimuse "suurem kui" tähistamiseks. G (Suurem- rohkem) ja tähistamiseks - täht "vähem". L (Vähem- vähem). Sarnaste tingimuste korral kasutatakse märgita numbrite võrdlemisel vastavalt tähti A (ülal- üle) ja B (all- all). Võrdsuse tingimust tähistatakse tähega E (võrdne- võrdub) ja teatud tingimuse mittetäitmine - kirjaga N (mitte- Mitte). Tuleb märkida, et iga käsu jaoks on lubatud kasutada kahte erinevat mnemokoodi; näiteks mnemoonika JL ja JNGF on samaväärsed, kuna tingimused "vähem kui" ja "mitte suurem või võrdne" on identsed.

    Täielik nimekiri käsumnemoonikatest, kontrollitavatest tingimustest, samuti vastavad Boole'i ​​lippude kombinatsioonid ja nende tähendused on toodud tabelis. 1.4.

    Tabel 1.4

    Käskude mnemooniline kood Seisund Lippude tähendus
    Signeeritud numbrite jaoks
    JL/JNGE Väiksem/mitte suurem või võrdne SF + OF = l
    JNL/JGE Mitte vähem/suurem kui või võrdne SF + OF = 0
    JG/JNLE Suurem kui/mitte väiksem või võrdne (SF + OF) V ZF = 0
    JNG/JLE Mitte suurem kui/väiksem või võrdne märgita arvude puhul (SF + OF) V ZF = l
    JB/JNAE Väiksem/mitte suurem või võrdne CF=1
    JNB/JAE Mitte vähem/suurem kui või võrdne CF=0
    JA/JNBE Rohkem CF V ZF = 0
    JNA/JBE Mitte rohkem Muude andmete jaoks CF V ZF = 1
    JE/JZ Võrdne/null ZF = 1
    JNE/JNZ Pole võrdne/null ZF = 0
    JS Miinuse järgi SF = 1
    JNS Pluss SF = 0
    JO Ülevool OF=l
    JNO Ilma ülevooluta OF = 0
    JP/JPE Ühtlase pariteediga PF = 1
    JNP/JPO Kummalise pariteediga PF = 0

    Kõik tingimuslikud hüppekäsklused on ühesuguse kahebaidise vorminguga, millest esimene bait on operatsioonikood (COP) ja teine ​​bait on 8-bitine nihe, mida käsitletakse märgistatud numbrina ja seetõttu on võimalik aadressi muuta. vahemikus -128 kuni + 127. Kui tingimuse täitmisel on vaja kaugemat ("kaugemat") üleminekut, kasutatakse täiendavalt tingimusteta ülemineku käsku.

    Iga tingimusliku hüppekäsu täitmise aeg on määratud kahel juhul: 1) tingimus on täidetud ja juhtimine antakse tegelikult üle vastavalt nihkele, 2) tingimus ei ole täidetud, mistõttu juhtimine läheb üle järgmisele käsule.

    Tsükli korraldamise käsud. Arvutustsüklite sooritamise mugavuse huvides sisestatakse protsessorisse. Nende hulka kuuluvad järgmised mnemotehnikad: LOOP (silmus kuni (CX) ei ole 0-ga), LOOPNZ/LOOPNE (tsükkel nullini/võrduni), LOOPZ/LOOPE (silmus nullini/võrduni) ja JCXZ (SH-s nulli hüppamine). ). Kõigil neil käskudel on kahebaidine vorming, mille teine ​​bait määrab 8-bitise nihke, mida kasutatakse hüppe korraldamiseks. Seda nihet käsitletakse märgistatud numbrina ja seda pikendatakse enne hüppeaadressi arvutamist 16-bitiseks.

    Kasutades silmuskäske koos stringielementidega manipuleerimise käskudega, saab kirjutada üsna keerukaid stringide teisendusprogramme. Vaatleme näidet programmi kirjutamisest, et tõlkida kuueteistkümnendsüsteemis kirjutatud andmejada mõneks koodiks, mille jaoks on otsingutabel mälus BX-is määratud algusaadressist, nagu on vaja XLAT-kooditabeli teisenduskäsu kasutamiseks. Lisaks olgu lähtestringil 80 elementi ja see asuks mälus suhtelisest algusaadressist 100 ning tulemuse string tuleks paigutada suhtelisest aadressist 200. Programm, mis kodeerib lähtestringi ümber tulemuse stringiks väärtusega suunalipp DF=0 näeb välja selline:

    MOV SI, 100
    MOV DI, 200
    MOV CX, 80

    Siin kasutatakse punktis 1.2 kirjeldatud XLAT-koodi teisendustabeli käsku.

    katkestamise käsud. Sisaldab kolme mnemokoodi: INT (katkestus), INTO (katkestus ülevoolul) ja IRET (katkestusest naasmine).

    Katkesta käsk INT millal v = 1 on kahebaidise vorminguga, mille teine ​​bait sisaldab 8-bitist numbrit, mis määrab tüübi (tüüp) või katkestuse tase. INT käsuga tüüp protsessor jätkab määratud taseme katkestusteenuse rutiini täitmist, tehes automaatselt katkestuspunkti naasmiseks vajalikud toimingud. Need toimingud on järgmised: F-lippude registri sisu kirjutatakse virna (PUSHF), IF- ja TF-lipud lähtestatakse, CS-registri praegused väärtused ja IP-käsukursor kirjutatakse virna.

    Hooldusprogrammi algusaadressi määramiseks vastavalt väärtusele tüüp kasutatakse katkestuse taseme tabelit. Selle tabeli iga 256 katkestuse taseme jaoks eraldatakse neli baiti: esimesed kaks baiti määravad IP-käsukursori väärtuse, teine ​​​​- CS-i segmendi registri väärtus. Need neli baiti määratlevad teenindusprogrammide algusaadressid (väärtuspaarid CS, IP), mis tuleb eelnevalt absoluutaadresside 0-3FFH mälurakkudesse kirjutada. Tabeli aadress, mis vastab INT käsus määratud aadressile tüüp katkestuse tase on CPU-s defineeritud järgmiselt. Pärast CS ja GR praeguste väärtuste virna salvestamist teostatakse järgmised koormused: CS = tüüp x 4 + 2 ja IP= tüüp x 4. Uued CS ja IP väärtused on võetud vastavalt aadressidega lahtritest tüüp x 4 + 2 Ja tüüp x 4, määrake soovitud teenindusprogrammi algusaadress.

    Katkestuskäsk INT, millest oli eespool juttu välja väärtusega v = 0 on ühebaidise vorminguga, st ei vaja erilist katkestuse taset. Protsessor käsitleb seda käsku automaatselt 3. taseme katkestusena. (tüüp=3) ja seda kasutatakse tavaliselt programmides katkestuspunktina.

    INTO ülevoolukatkestuse käsk põhjustab ülemineku 4. taseme katkestuse teenindamisele. (tüüp = 4) juhul, kui ülevoolulipu väärtus OF = 1. INTO käsku kasutatakse tavaliselt pärast allkirjastatud aritmeetilisi käske. Tavaliselt on esimesed paar katkestuse taset (kuni 32) reserveeritud mitmete konkreetsete olukordade käsitlemiseks, nagu näiteks nulliga jagamise katse, ületäitumine jms.

    Reserveeritud taseme katkestuste töötlemise eripära seisneb selles, et protsessor lülitub neid teenindama olenemata katkestuse lubamise lipu IF väärtusest.

    Ühebaidine IRET-käsk paigutatakse iga katkestuse teenindamise rutiini lõppu ja see annab katkestuselt tagasi. Selle käsuga tõstab protsessor pinust käsu osuti IP ja programmisegmendi CS väärtuse ning taastab ka lipuregistri F eelmise sisu (nagu POPF käsu puhul). Vajadusel saab CPU ülejäänud registrite sisu, mis vastab katkestatud programmile, salvestada pinu teenindusprogrammile üleminekul ja seejärel taastada sealt naastes, kasutades pinu juurdepääsu juhiseid.

    Informaatika ja infotehnoloogia: Tsvetkov A V loengukonspektid

    2. Juhtimise ülekandekäsud

    Saime tuttavaks mõne moodustunud võistkonnaga lineaarne programmi osad. Igaüks neist teostab üldjuhul mingi andmekonversiooni või -edastuse, mille järel annab mikroprotsessor juhtimise üle järgmisele käsule. Kuid väga vähesed programmid töötavad nii järjekindlalt. Tavaliselt on programmis punktid, kus tuleb otsustada, milline käsk järgmisena täidetakse. See lahendus võiks olla:

    1) tingimusteta - siinkohal on vaja juhtimine üle anda mitte järgmisele käsule, vaid teisele, mis on praegusest käsust teatud kaugusel;

    2) tingimuslik - otsus, milline käsk järgmisena täidetakse, tehakse mõne tingimuste või andmete analüüsi põhjal.

    Programm on käskude ja andmete jada, mis hõivavad teatud hulga RAM-i ruumi. See mäluruum võib olla külgnev või koosneda mitmest fragmendist.

    Millist programmi käsku järgmisena täita, õpib mikroprotsessor registripaari sisust cs:(e)ip:

    1) cs – koodilõigu register, mis sisaldab kehtiva koodilõigu füüsilist (baas)aadressi;

    2) eip/ip - käskude osutiregister, mis sisaldab väärtust, mis tähistab järgmise täidetava käsu nihet mälus jooksva koodilõigu alguse suhtes.

    Millist konkreetset registrit kasutatakse, sõltub määratud adresseerimisrežiimist use16 või use32. Kui on määratud use 16, siis kasutatakse ip-d, kui use32, siis eip.

    Seega muudavad juhtülekande käsud cs ja eip / ip registrite sisu, mille tulemusena valib mikroprotsessor täitmiseks mitte järgmise programmikäsu järjekorras, vaid käsu mõnes teises programmi jaotises. Mikroprotsessori sees olev torujuhe lähtestatakse.

    Vastavalt tööpõhimõttele võib programmis üleminekuid korraldavad mikroprotsessori käsud jagada kolme rühma:

    1. Juhtkäskude tingimusteta üleandmine:

    1) tingimusteta harukäsk;

    2) protseduuri kutsumise ja protseduurilt naasmise käsk;

    3) käsk tarkvarakatkestuste väljakutsumiseks ja tarkvarakatkestustelt naasmiseks.

    2. Käsud juhtimise tingimuslikuks üleandmiseks:

    1) hüppekäsklused võrdluskäsu p tulemuse järgi;

    2) üleminekukäsklused vastavalt teatud lipu olekule;

    3) juhised esx/cx registri sisust läbi hüppamiseks.

    3. Tsükli juhtimise käsud:

    1) käsk tsükli korraldamiseks loenduriga ехх/сх;

    2) käsk tsükli korraldamiseks loenduriga ех/сх koos lisatingimusega tsüklist varajase väljumise võimalusega.

    Tingimusteta hüpped

    Eelmine arutelu on paljastanud mõningaid üleminekumehhanismi üksikasju. Hüppekäsud muudavad eip/ip käsuosutiregistrit ja võib-olla ka cs-koodi segmendi registrit. Mida täpselt tuleb muuta, sõltub:

    1) operandi tüübi kohta tingimusteta harukäskes (lähedal või kaugel);

    2) hüppeaadressi eelsest näidust (hüppejuhises) modifikaator; sel juhul võib hüppeaadress ise asuda kas otse käsus (otsene hüpe) või registris või mälulahtris (kaudne hüpe).

    Modifikaator võib võtta järgmisi väärtusi:

    1) near ptr – otsene üleminek praeguse koodisegmendi sees olevale sildile. Ainult eip/ip registrit muudetakse (olenevalt määratud kasutus16 või kasutus32 koodisegmendi tüübist) käsus määratud aadressi (sildi) või väärtuse eraldamise sümbolit kasutava avaldise alusel - $;

    2) far ptr - otsene üleminek sildile teises koodisegmendis. Hüppeaadress on määratud vahetu operandi või aadressina (märgisena) ja koosneb 16-bitisest selektorist ja 16/32-bitisest nihkest, mis laetakse vastavalt cs ja ip/eip registritesse;

    3) sõna ptr - kaudne üleminek praeguse koodilõigu sees olevale sildile. Muudetakse ainult eip/ip (nihke väärtusega mälust käsus määratud aadressil või registrist). Nihke suurus 16 või 32 bitti;

    4) dword ptr - kaudne üleminek sildile teises koodisegmendis. Mõlemat registrit muudetakse (väärtusega mälust - ja ainult mälust, registrist) - cs ja eip / ip. Selle aadressi esimene sõna/dword tähistab nihet ja laaditakse ip/eip-i; teine/kolmas sõna laetakse cs-sse. jmp tingimusteta hüppejuhis

    Tingimusteta hüppe käsusüntaks on jmp [modifier] hüppe_aadress – tingimusteta hüpe ilma tagasipöördumispunkti teavet salvestamata.

    Hüppe_aadress on aadress sildi kujul või selle mäluala aadress, kus hüppekursor asub.

    Kokku on mikroprotsessori käsusüsteemis tingimusteta hüppe jmp jaoks mitu masinkäskude koodi.

    Nende erinevused on määratud üleminekukauguse ja sihtaadressi täpsustamise viisiga. Vahemikülemineku määrab operandi asukoht hüppe_aadress. See aadress võib olla praeguses koodisegmendis või mõnes muus segmendis. Esimesel juhul nimetatakse üleminekut segmendisisene, või Sulge, teises - intersegment, või kauge. Segmendisisene hüpe eeldab, et muudetakse ainult eip/ip registri sisu.

    Käsu jmp segmendisiseseks kasutamiseks on kolm võimalust:

    1) sirge lühike;

    2) sirge;

    3) kaudne.

    Protseduurid

    Assembly keeles on mitu tööriista, mis lahendavad koodiosade dubleerimise probleemi. Need sisaldavad:

    1) protseduuride mehhanism;

    2) makrokoostaja;

    3) katkestusmehhanism.

    Protseduur, mida sageli nimetatakse alamprogramm, see on mõne ülesande lagunemise (jagades mitmeks osaks) põhifunktsionaalne üksus. Protseduur on käskude rühm konkreetse alamülesande lahendamiseks ja sellel on vahendid kontrolli saamiseks punktist, kus ülesanne kutsutakse kõrgemale tasemele, ja tagastada juhtimine sellele punktile.

    Kõige lihtsamal juhul võib programm koosneda ühest protseduurist. Teisisõnu, protseduuri saab defineerida kui hästi moodustatud käskude kogumit, mida ühekordselt kirjeldatuna saab vajaduse korral programmis kõikjal välja kutsuda.

    Käskude jada kirjeldamiseks protseduurina assemblerkeeles kasutatakse kahte direktiivi: PROC ja ENDP.

    Protseduuri kirjelduse süntaks on järgmine (joonis 36).

    Riis. 36. Protseduuri kirjelduse süntaks programmis

    Jooniselt 36 on näha, et protseduuri päises (PROC direktiiv) on kohustuslik ainult protseduuri nimi. PROC direktiivi suure hulga operandide hulgast tuleks esile tõsta [kaugust]. See atribuut võib võtta väärtused lähedal või kaugel ja iseloomustab võimalust kutsuda protseduur mõnest teisest koodisegmendist. Vaikimisi on atribuut [kaugus] seatud lähedale.

    Protseduuri saab paigutada suvalisse kohta programmi, kuid nii, et see ei saaks juhuslikult kontrolli. Kui protseduur sisestatakse lihtsalt üldisesse käsuvoogu, tajub mikroprotsessor protseduuri juhiseid selle voo osana ja täidab vastavalt protseduuri juhiseid.

    Tingimuslikud hüpped

    Mikroprotsessoril on 18 tingimuslikku hüppekäsku. Need käsud võimaldavad teil kontrollida:

    1) märgiga operandide seos (“rohkem - vähem”);

    2) ilma märgita operandide seos ("kõrgem - madalam");

    3) aritmeetiliste lippude ZF, SF, CF, OF, PF (kuid mitte AF) olekud.

    Tingimuslikel hüppekäsklustel on sama süntaks:

    jcc jump_label

    Nagu näete, algab kõigi käskude mnemokood "j"-ga - sõnast hüpata(põrge), tema - määrab käsuga sõelutava konkreetse tingimuse.

    Seoses operandiga jump_label, siis saab see silt olla ainult praeguses koodisegmendis, segmentidevaheline juhtimise ülekandmine tingimushüpetes ei ole lubatud. Sellega seoses pole küsimust modifikaatorist, mis esines tingimusteta hüppekäskude süntaksis. Varasemates mikroprotsessori mudelites (i8086, i80186 ja i80286) said tingimuslikud harukäsud teha ainult lühikesi hüppeid - tingimuslikule harujuhisele järgnevast käsust -128 kuni +127 baiti. Alates mikroprotsessori mudelist 80386 on see piirang eemaldatud, kuid nagu näete, ainult praeguse koodisegmendi piires.

    Otsuse langetamiseks, kuhu suunatakse juhtimine üle tingimuslikule hüppekäsule, tuleb esmalt moodustada tingimus, mille alusel tehakse otsus juhtimise üleandmise kohta.

    Sellise seisundi allikad võivad olla:

    1) mis tahes käsk, mis muudab aritmeetiliste lippude olekut;

    2) võrdluskäsk p, mis võrdleb kahe operandi väärtusi;

    3) esx/cx registri olek.

    cmp võrdluskäsk

    Lehekülje võrdlemise käsul on huvitav tööviis. See on täpselt sama, mis lahutamiskäsu puhul – alamoperand, operand_2.

    P-käsk, nagu alamkäsk, lahutab operandid ja seab lipud. Ainus, mida ta ei tee, on lahutamise tulemuse kirjutamine esimese operandi asemele.

    Käsu str süntaks - str operand_1, operaand_2 (võrdle) - võrdleb kahte operandi ja seab võrdluse tulemuste põhjal lipud.

    P käsuga seatud lippe saab analüüsida spetsiaalsete tingimuslike harukäskude abil. Enne kui neid vaatame, pöörame pisut tähelepanu nende tingimuslike hüppejuhiste mnemoonikale (tabel 16). Märgistuste mõistmine tingimuslike hüppekäskude nime moodustamisel (element jcc käsu nimes, me määrasime selle) hõlbustab nende meeldejätmist ja edasist praktilist kasutamist.

    Tabel 16. Lühendite tähendus jcc käsunimes

    Tabel 17. Käsu str operand_1, operand_2 tingimuslike harukäskude loend

    Ärge imestage, et samadele lipuväärtustele vastavad mitu erinevat tingimuslike harukäskude mnemoonilist koodi (tabelis 17 eraldatakse need üksteisest kaldkriipsuga). Nimeerinevus tuleneb mikroprotsessorite arendajate soovist lihtsustada tingimuslike hüppekäskude kasutamist kombineerituna teatud käsurühmadega. Seetõttu peegeldavad erinevad nimetused pigem erinevat funktsionaalset orientatsiooni. Kuid asjaolu, et need käsud vastavad samadele lippudele, muudab need programmis absoluutselt samaväärseks ja võrdseks. Seetõttu on tabelis 17 need rühmitatud mitte nime, vaid nende lippude (tingimuste) väärtuste järgi, millele nad vastavad.

    Tingimuslikud harujuhised ja lipud

    Mõne tingimusliku hüppejuhise mnemooniline tähistus peegeldab lipu nime, millega need töötavad, ja sellel on järgmine struktuur: tähemärk "j" on esimene (Hüppa,üleminek), teine ​​on kas lipu tähis või eitussümbol "n", millele järgneb lipu nimi. See meeskonna struktuur peegeldab selle eesmärki. Kui n-märki pole, siis kontrollitakse lipu olekut, kui see on võrdne 1-ga, tehakse üleminek hüppesildile. Kui sümbol "n" on olemas, siis kontrollitakse lipu olekut 0-ga ja kui see õnnestub, tehakse hüpe hüppesildile.

    Käskude märguanded, lippude nimed ja hüppetingimused on näidatud tabelis 18. Neid käske saab kasutada pärast kõiki käske, mis muudavad määratud lippe.

    Tabel 18. Tingimuslikud hüppejuhised ja lipud

    Kui vaatate tabeleid 17 ja 18 tähelepanelikult, näete, et paljud neis olevad tingimuslikud hüppejuhised on samaväärsed, kuna mõlemad põhinevad samade lippude analüüsil.

    Tingimuslikud hüppejuhised ja esx/cx register

    Mikroprotsessori arhitektuur hõlmab paljude registrite spetsiifilist kasutamist. Näiteks kasutatakse akumulaatorina registrit EAX / AX / AL ja virnaga töötamiseks registreid BP, SP. ECX / CX registril on ka teatud funktsionaalne eesmärk: see täidab rolli loendur tsükli juhtkäskudes ja märgistringidega töötamisel. Võimalik, et funktsionaalselt oleks esx/cx registriga seotud tingimuslik harukäsk õigemini sellele käskude rühmale omistatud.

    Selle tingimusliku harukäsu süntaks on:

    1) jcxz jump_label (Hüppa, kui ex on null) – hüppa, kui сх on null;

    2) jecxz jump_label (Jump Equal ех Zero) – hüppa, kui ех on null.

    Need käsud on väga kasulikud silmuse loomisel ja märgistringidega töötamisel.

    Tuleb märkida, et käsule jcxz/jecxz on omane piirang. Erinevalt teistest tingimuslikest edastuskäskudest saab jcxz/jecxz käsk käsitleda ainult lühikesi hüppeid -128 baiti või +127 baiti sellele järgnevast käsust.

    Tsüklite organiseerimine

    Tsükkel, nagu teate, on oluline algoritmiline struktuur, ilma milleta ilmselt ükski programm hakkama ei saa. Saate korraldada teatud programmiosa tsüklilist täitmist, kasutades näiteks juhtkäskude tingimuslikku ülekandmist või tingimusteta hüppekäsku jmp. Sellise tsüklikorralduse korral tehakse kõik selle organisatsiooni toimingud käsitsi. Kuid arvestades sellise algoritmilise elemendi kui tsükli tähtsust, lisasid mikroprotsessori arendajad käsusüsteemi kolmest käsust koosneva rühma, mis hõlbustab tsüklite programmeerimist. Need käsud kasutavad ka esx/cx registrit as tsükliloendur.

    Kirjeldame lühidalt neid käske: 1) loop jump_label (Loop) – korrake tsüklit. Käsk võimaldab teil korraldada silmuseid, mis on sarnased kõrgetasemeliste keelte silmustele, silmusloenduri automaatse vähendamisega. Meeskonna ülesanne on teha järgmist:

    b) ECX/CX registri võrdlemine nulliga: kui (ECX/CX) = 0, siis antakse juhtimine üle tsükli järel järgmisele käsule;

    2) loope/loopz jump_label

    Loope ja loopz käsud on absoluutsed sünonüümid. Käskude ülesanne on täita järgmisi toiminguid:

    a) ECX/CX registri vähendamine;

    c) nulllipu ZF oleku analüüs, kui (ECX/CX) = 0 või XF = 0, antakse juhtimine üle tsükli järel järgmisele käsule.

    3) loopne/loopnz jump_label

    Käsud loopne ja loopnz on samuti absoluutsed sünonüümid. Käskude ülesanne on täita järgmisi toiminguid:

    a) ECX/CX registri vähendamine;

    b) ECX/CX registri võrdlemine nulliga;

    c) nulllipu ZF oleku analüüs: kui (ECX/CX) = 0 või ZF = 1, antakse juhtimine üle tsükli järel järgmisele käsule.

    Loop/loopz ja loopne/loopnz käsud on oma töös vastastikused. Need laiendavad silmuskäsu tegevust, sõeludes lisaks zf-lipu, mis võimaldab korraldada tsüklist varajase väljumise, kasutades seda lippu indikaatorina.

    Silmuskäskude loop, loop/loopz ja loopne/loopnz puuduseks on see, et need rakendavad ainult lühikesi hüppeid (-128 kuni +127 baiti). Pikkade silmustega töötamiseks peate kasutama tingimuslikke hüppeid ja jmp-juhiseid, seega proovige hallata mõlemat silmuste korraldamise viisi.

    Raamatust MANUSSÜSTEEMIDE TARKVARA. Üldnõuded arendusele ja dokumenteerimisele autor Venemaa Gosstandart

    Linuxi raamatust kasutajale autor Kostromin Viktor Aleksejevitš

    Raamatust Computer Science and Information Technology: Lecture Notes autor Tsvetkov A V

    LOENG nr 19. Juhtimise ülekande käsud

    Raamatust 200 parimat programmi Interneti jaoks. Populaarne õpetus autor Krainsky I

    2. Juhtimise ülekande käsud Tutvusime mõne käsklusega, millest moodustatakse programmi lineaarsed lõigud. Igaüks neist teostab üldiselt teatud toiminguid andmete teisendamiseks või edastamiseks, mille järel annab mikroprotsessor juhtimise üle

    Raamatust Windows Vista ilma pingeta autor

    Edastusmeetodid Video voogedastuseks on kaks meetodit, progressiivne voogesitus ja reaalajas voogesitus.Serial edastuse puhul on pildikvaliteet alati parem, kuna videot esitatakse kõvakettalt

    Raamatust DIY Linux Server autor

    Edastusprobleemid Video voogedastamisel Interneti kaudu võivad tekkida probleemid, mis halvendavad edastuskvaliteeti. Nende hulgas on mitu peamist Katkestused suhtluses Voogedastus eeldab stabiilset ühendust. Kuna Internet ei suuda pakkuda

    Raamatust TCP/IP Architecture, Protocols, Implementation (sh IP versioon 6 ja IP Security) autor Faith Sidney M

    8.1. Juhtpaneel on juhtimiseks vajalik Igas keerulises seadmes on alati kaugjuhtimispult - komplekt nuppe, hoobasid, puuteandureid, roolirattaid ... ühesõnaga seadmed, millega saab seda keerulist seadet juhtida. "kaugjuhtimispult" Vistas. Seda nimetatakse

    Raamatust OrCAD PSpice. Elektriahela analüüs autor Keown J.

    5.3. Protsessi juhtimise käsud Käsk ps Käsku ps kasutatakse hetkel töötavate protsesside teabe kuvamiseks. Sellel käsul on palju võimalusi, mille kohta saate lugeda juhendist (man ps). Siin kirjeldan ainult kõige sagedamini kasutatavaid

    Raamatust Linux: The Complete Guide autor Kolisnichenko Deniss Nikolajevitš

    10.4. DNS-serveri halduskäsud DNS-serveri haldamiseks kasutatakse programmi ndc. Seda saab kasutada start, stop, reload, restart parameetritega.Start-parameeter käivitab serveri ja stopp peatab selle. Taaslaadimisvalik laadib uuesti tsoonifailid, kui need on muutunud, ja

    Arvutiraamatust ilma stressita autor Žvalevski Andrei Valentinovitš

    14.6.1 Juurdepääsu kontrolli käsud Käsud ja parameetrid, mis määravad kasutaja juurdepääsu kaughosti failisalvestusele, on määratletud tabelis 14.1. Tabel 14.1 Kasutaja autoriseerimiskäsud arhiivi juurdepääsuks

    Raamatust The Art of Shell Scripting Programming autor Cooper Mendel

    14.6.2 Failihalduskäsud Tabelis 14.2 olevad käsud võimaldavad teil teha kaughostis tüüpilisi kataloogide asukoha määramise ja failihalduse toiminguid. Töökataloog on kasutaja praegune kataloog Tabel 14.2 Valikukäsud

    Autori raamatust

    Edastusliinid Kuigi PSpice'il on spetsiaalne seade nimega T (ülekandeliinide jaoks), on selle rakendus piiratud, kuna see mudel ei võta arvesse liinikadusid. Eelistame kasutada ülekandeliini mudelit, mis võtab arvesse kadusid ja sisaldab R elemente,

    Autori raamatust

    9.2. Protsessi juhtimiskäsud 9.2.1. Protsesside hierarhia: ps ja pstree Tead juba, et ps-käsk võimaldab vaadata teavet kõigi süsteemis hetkel töötavate protsesside kohta (jaotis 3.2). Suvandi -f korral prindib see käsk nii protsessi enda PID kui ka selle vanema PPID,

    Autori raamatust

    Juhtpaneel on juhtimiseks vajalik Igas keerulises seadmes on alati kaugjuhtimispult - komplekt nuppe, hoobasid, puuteandureid, roolirattaid ... ühesõnaga seadmed, millega saab seda keerulist seadet juhtida. "kaugjuhtimispult" Vistas. Seda nimetatakse

    Autori raamatust

    11.1. Töö juhtimise käsud Mõned järgmistest käskudest võtavad argumendina "töö ID". Vaata tabelit peatüki lõpus Tööd Loetleb taustal jooksvaid töid. Käsk ps on informatiivsem. Ülesandeid ja protsesse on lihtne segi ajada.

    Autori raamatust

    12.7. Terminali juhtimiskäsud Konsooli või terminaliga seotud käsud lähtestavad terminali või pärivad terminfo terminali andmebaasi. Tput-iga saate teha erinevaid toiminguid. tput clear on samaväärne käsuga clear. tput reset -- samaväärne



    Kas meeldis artikkel? Jaga sõpradega!
    Kas see artikkel oli abistav?
    Jah
    Ei
    Täname tagasiside eest!
    Midagi läks valesti ja teie häält ei arvestatud.
    Aitäh. Sinu sõnum on saadetud
    Kas leidsite tekstist vea?
    Valige see, klõpsake Ctrl+Enter ja me teeme selle korda!