Tranziții necondiționate. Bazele programării dispozitivelor MP (Prelegere) Comenzile de transfer de control

  • 10.01.2024

Alături de mijloacele de calcul aritmetic, sistemul de instrucțiuni cu microprocesor are și mijloace de conversie logică a datelor. Prin logic ne referim la astfel de transformări de date, care se bazează pe regulile logicii formale.

Logica formală funcționează la nivelul afirmațiilor adevărate și false. Pentru un microprocesor, aceasta înseamnă de obicei 1 și, respectiv, 0. Computerul este nativ în limbajul zerourilor și al unuurilor, dar cea mai mică unitate de date pe care operează instrucțiunile mașinii este octetul. Cu toate acestea, la nivel de sistem, este adesea necesar să puteți opera la un nivel extrem de scăzut - nivelul de biți.

Orez. 29. Instrumente logice de prelucrare a datelor


Mijloacele de transformare logică a datelor includ comenzi logice și operații logice. Operandul unei instrucțiuni de asamblare poate fi în general o expresie, care la rândul ei este o combinație de operatori și operanzi. Printre acești operatori pot fi și operatori care implementează operații logice asupra obiectelor expresii.

Înainte de a examina aceste instrumente în detaliu, să luăm în considerare care sunt datele logice în sine și ce operațiuni sunt efectuate asupra lor.

Date logice

Baza teoretică pentru prelucrarea logică a datelor este logica formală. Există mai multe sisteme de logică. Una dintre cele mai faimoase este calculul propozițional. O afirmație este orice afirmație care i se poate spune fiecăreia Adevărat, sau fals.

Calculul propozițional este un set de reguli folosite pentru a determina adevărul sau falsitatea unei combinații de afirmații.

Calculul propozițional este foarte armonios combinat cu principiile de funcționare a calculatorului și cu metodele de bază de programare a acestuia. Toate componentele hardware ale computerului sunt construite pe cipuri logice. Sistemul de reprezentare a informațiilor într-un computer la cel mai de jos nivel se bazează pe conceptul de bit. Un pic, având doar două stări (0 (fals) și 1 (adevărat)), se potrivește în mod natural în calculul propozițional.

Conform teoriei, pe instrucțiuni (pe biți) pot fi efectuate următoarele operații logice.


1. Negație (logică NU) - o operație logică pe un operand al cărui rezultat este inversul operandului original.

Această operație este caracterizată în mod unic de următorul tabel de adevăr (Tabelul 12).

Tabelul 12. Tabelul de adevăr pentru negația logică

2. Adunare logică (inclusiv logic SAU) - o operație logică pe doi operanzi al căror rezultat este adevărat (1) dacă unul sau ambii operanzi sunt adevărati (1) și fals (0) dacă ambii operanzi sunt falși (0).

Această operație este descrisă folosind următorul tabel de adevăr (Tabelul 13).

Tabelul 13. Tabelul de adevăr pentru OR inclusiv logic

3. Înmulțirea logică (logică ȘI) - o operație logică pe doi operanzi care se evaluează la adevărat (1) numai dacă ambii operanzi se evaluează la adevărat (1). În toate celelalte cazuri, valoarea operației este falsă (0).

Această operație este descrisă folosind următorul tabel de adevăr (Tabelul 14).

Tabelul 14. Tabelul de adevăr pentru AND logic

4. Adăugarea exclusivă logică (exclusiv logică SAU) - o operație logică pe doi operanzi al căror rezultat este adevărat (1) dacă doar unul dintre cei doi operanzi este adevărat (1) și fals (0) dacă ambii operanzi sunt falși (0) sau „adevăr” (1). Această operație este descrisă folosind următorul tabel de adevăr (Tabelul 15).

Tabelul 15. Tabelul de adevăr pentru SAU exclusiv logic

Sistemul de instrucțiuni al microprocesorului conține cinci instrucțiuni care sprijină aceste operațiuni. Aceste instrucțiuni efectuează operații logice asupra biților operanzilor. Dimensiunile operanzilor, desigur, trebuie să fie aceleași. De exemplu, dacă dimensiunea operanzilor este un cuvânt (16 biți), atunci operația logică este efectuată mai întâi pe biții zero ai operanzilor, iar rezultatul acestuia este scris în locul bitului 0 al rezultatului. Apoi comanda repetă secvențial aceste acțiuni pe toți biții de la primul până la al cincisprezecelea.

Comenzi logice

Sistemul de instrucțiuni cu microprocesor are următorul set de comenzi care acceptă lucrul cu date logice:

1) și operand_1, operand_2 – operație logică de înmulțire. Comanda efectuează o operație AND logică pe biți (conjuncție) pe biții operanzilor operand_1 și operand_2. Rezultatul este scris în operand_1;

2) og operand_1, operand_2 – operație logică de adunare. Comanda efectuează o operație OR logică pe biți (disjuncție) pe biții operanzilor operand_1 și operand_2. Rezultatul este scris în operand_1;

3) hog operand_1, operand_2 – operație logică de adăugare exclusivă. Instrucțiunea efectuează o operație OR logică exclusivă pe biți pe biții operanzilor operand_1 și operand_2. Rezultatul este scris în locul operandului;

4) operand de testare_1, operand_2 – operațiune de „verificare” (folosind înmulțirea logică). Comanda efectuează o operație AND logică pe biți pe biții operanzilor operand_1 și operand_2. Starea operanzilor rămâne aceeași, se schimbă doar steagurile zf, sf și pf, ceea ce face posibilă analiza stării biților individuali ai operandului fără a le schimba starea;

5) not operand – operație de negație logică. Comanda efectuează o inversare pe bit (înlocuind valoarea cu cea opusă) a fiecărui bit al operandului. Rezultatul este scris în locul operandului.

Pentru a înțelege rolul instrucțiunilor logice în sistemul de instrucțiuni al microprocesorului, este foarte important să înțelegem domeniul de aplicare al acestora și tehnicile tipice de utilizare a acestora în programare.

Folosind comenzi logice este posibil alocare biți individuali din operand în scopul de a setarea, resetarea, inversarea sau pur și simplu verificarea unei anumite valori.

Pentru a organiza o astfel de muncă cu biți, operand_2 joacă de obicei rolul unei măști. Folosind biții setați într-un bit din această mască, se determină operand_1 biții necesari pentru o anumită operație. Să arătăm ce comenzi logice pot fi folosite în acest scop:

1) pentru a seta anumiți biți la 1, utilizați comanda og operand_1, operand_2.

În această instrucțiune, operandul_2, care acționează ca o mască, trebuie să conțină un biți în locul acelor biți care ar trebui să fie setați la 1 în operandul_1;

2) pentru a reseta anumiți biți la 0, utilizați comanda și operand_1, operand_2.

În această instrucțiune, operandul_2, care acționează ca o mască, trebuie să conțină zero biți în locul acelor biți care ar trebui să fie setați la 0 în operandul_1;

3) comanda hog operand_1, operand_2 este aplicat:

a) pentru a afla care biți din operand_1 și operand sunt diferiți;

b) să inverseze starea biților specificați în operand_1.

La executarea comenzii hog, biții măștii care ne interesează (operand_2) trebuie să fie unul, restul trebuie să fie zero;

Pentru a verifica starea biților specificați, utilizați comanda test operand_1, operand_2 (verificați operand_1).

Biții verificați ai operandului_1 din mască (operand_2) trebuie să aibă o valoare de unu. Funcționarea comenzii test este similară cu algoritmul comenzii și, dar nu modifică valoarea operand_1. Rezultatul comenzii este setarea valorii steagului zero zf:

1) dacă zf = 0, atunci înmulțirea logică a dus la un rezultat zero, adică un bit unitar al măștii, care nu se potrivește cu un bit corespunzător al operandului;

2) dacă zf = 1, atunci înmulțirea logică a rezultat într-un rezultat diferit de zero, i.e. cel puțin unul un bit al măștii se potrivește cu un bit corespunzător al operandului_1.

Pentru a reacționa la rezultatul comenzii de testare, este recomandabil să folosiți comanda de salt jnz label (Săriți dacă nu este zero) - săriți dacă indicatorul zero zf este diferit de zero, sau o comandă cu acțiunea opusă - eticheta jz (Săriți) dacă zero) - săriți dacă steagul zero zf = 0.

Următoarele două comenzi caută primul bit al operandului setat la 1. Puteți căuta de la începutul sau de la sfârșitul operandului:

1) bsf operand_1, operand_2 (Bit Scanning Forward) – scanare înainte de biți. Instrucțiunea scanează biții operandului_2 de la cel mai puțin semnificativ la cel mai semnificativ (de la bitul 0 la cel mai semnificativ bit) căutând primul bit setat la 1. Dacă este găsit unul, numărul acestui bit este introdus în operand_1 ca valoare întreagă. Dacă toți biții operandului_2 sunt 0, atunci indicatorul zero zf este setat la 1, în caz contrar, indicatorul zf este resetat la 0;

2) bsr operand_1, operand_2 (Bit Scanning Reset) – scanarea biților în ordine inversă. Instrucțiunea caută (scanează) biții operandului_2 de la cel mai semnificativ la cel mai puțin semnificativ (de la bitul cel mai semnificativ la bitul 0) căutând primul bit setat la 1. Dacă este găsit unul, numărul acestui bit este introdus în operand_1 ca un valoare intreaga. Este important ca poziția primului bit din stânga să fie în continuare numărată în raport cu bitul 0. Dacă toți biții operandului_2 sunt egali cu 0, atunci indicatorul zero zf este setat la 1, altfel indicatorul zf este resetat la 0 .

În cele mai recente modele de microprocesoare Intel au mai apărut câteva comenzi în grupul de comenzi logice care permit accesul la un anumit bit al operandului. Operandul poate fi localizat fie în memorie, fie într-un registru de uz general. Poziția biților este specificată de offset-ul bitului în raport cu bitul cel mai puțin semnificativ al operandului. Valoarea offset poate fi specificată fie ca valoare directă, fie conținută într-un registru de uz general. Puteți utiliza rezultatele comenzilor bsr și bsf ca valoare de offset. Toate instrucțiunile atribuie valoarea bitului selectat indicatorului CE

1) operand bt, bit offset (Bit Test) – verificați bitul. Comanda transferă valoarea biților către flag-ul cf;

2) operand bts, bit offset (Bit Test and Set) – verificarea și setarea bitului. Instrucțiunea transferă valoarea biților către indicatorul CF și apoi setează bitul care urmează să fie testat la 1;

3) btr operational, bit offset (Bit Test and Reset) – verificarea si resetarea bitului. Instrucțiunea transferă valoarea unui bit în flag-ul CF și apoi setează acest bit la 0;

4) operand btc, bit offset (Bit Test and Convert) – verificați și inversați bitul. Instrucțiunea transferă valoarea unui bit către indicatorul cf și apoi inversează valoarea acelui bit.

Comenzi Shift

Instrucțiunile din acest grup oferă, de asemenea, manipularea biților individuali ai operanzilor, dar într-un mod diferit de instrucțiunile logice discutate mai sus.

Toate instrucțiunile de schimbare mută biții din câmpul operand la stânga sau la dreapta, în funcție de codul operațional. Toate instrucțiunile de schimbare au aceeași structură - operand cop, shift_counter.

Numărul de biți deplasați – shift_counter – este situat în locul celui de-al doilea operand și poate fi specificat în două moduri:

1) static, care presupune specificarea unei valori fixe folosind un operand imediat;

2) dinamic, ceea ce înseamnă stocarea valorii contorului de deplasare în registrul cl înainte de a executa instrucțiunea de deplasare.

Pe baza mărimii registrului cl, este clar că valoarea contorului de deplasare poate varia de la 0 la 255. Dar, de fapt, acest lucru nu este în întregime adevărat. În scopuri de optimizare, microprocesorul acceptă doar valoarea cinci biți cei mai puțin semnificativi contor, adică valoarea variază de la 0 la 31.

Toate comenzile de schimbare setează indicatorul de transport, cf.

Pe măsură ce biții sunt mutați dincolo de operand, ei lovesc mai întâi indicatorul de transport, setându-l egal cu valoarea următorului bit care ajunge în afara operandului. Unde merge mai departe acest bit depinde de tipul de instrucțiune de schimbare și de algoritmul programului.

Pe baza principiului de funcționare, comenzile de schimbare pot fi împărțite în două tipuri:

1) comenzi de schimbare liniară;

2) comenzi de schimbare ciclică.

Comenzi de schimbare liniară

Comenzile de acest tip includ comenzi care efectuează o schimbare în conformitate cu următorul algoritm:

1) următorul bit „împins” setează steag-ul CF;

2) bitul introdus în operand de la celălalt capăt are valoarea 0;

3) când următorul bit este deplasat, acesta intră în pavilionul CF și valoarea bitului deplasat anterior se pierde! Comenzile de schimbare liniară sunt împărțite în două subtipuri:

1) comenzi logice de schimbare liniară;

2) comenzi aritmetice de deplasare liniară.

Comenzile logice de schimbare liniară includ următoarele:

1) operand shl, shift_counter (Shift Logical Left) – deplasare logică la stânga. Conținutul operandului este deplasat la stânga cu numărul de biți determinat de valoarea shift_count. În dreapta (în poziția bitului cel mai puțin semnificativ) sunt introduse zerouri;

2) operand shr, shift_counter (Shift Logical Right) – deplasare logică la dreapta. Conținutul operandului este deplasat la dreapta cu numărul de biți determinat de valoarea shift_count. În stânga (în poziția celui mai semnificativ, bit de semn) sunt introduse zerouri.

Figura 30 arată cum funcționează aceste comenzi.

Orez. 30. Schema de funcționare a comenzilor de schimbare logică liniară


Instrucțiunile de schimbare liniară aritmetică diferă de instrucțiunile de deplasare logică prin faptul că operează într-un mod special pe bitul de semn al operandului.

1) operand sal, shift_counter (Shift Arithmetic Left) – deplasare aritmetică la stânga. Conținutul operandului este deplasat la stânga cu numărul de biți determinat de valoarea shift_count. În dreapta (în poziția bitului cel mai puțin semnificativ) sunt zerouri. Comanda sal nu păstrează semn, dar setează steag cu/în cazul schimbării semnului un alt bit retractabil. În caz contrar, comanda sal este complet similară cu comanda shl;

2) operand sar, shift_counter (Shift Arithmetic Right) – deplasare aritmetică la dreapta. Conținutul operandului este deplasat la dreapta cu numărul de biți determinat de valoare shift_counter.În stânga, în operand sunt introduse zerouri. Comanda sar păstrează semnul, restabilindu-l după deplasarea fiecărui bit următor.

Figura 31 arată cum funcționează instrucțiunile de schimbare aritmetică liniară.


Orez. 31. Schema de funcționare a comenzilor de deplasare aritmetică liniară

Rotiți comenzi

Comenzile de rotație de schimbare sunt comenzi care stochează valorile biților deplasați. Există două tipuri de comenzi de rotație:

1) comenzi simple de schimbare ciclică;

2) comenzi de schimbare ciclică prin indicatorul de transport, cf.

La echipe ciclic simplu turele includ:

1) operand rol, shift_counter (Rotate Left) – deplasare ciclică la stânga. Conținutul operandului este deplasat la stânga cu numărul de biți determinat de operand shift_counter. Biții deplasați la stânga sunt scrieți în același operand din dreapta;

2) operand gog, shift_counter (Rotire la dreapta) – deplasare ciclică la dreapta. Conținutul operandului este deplasat la dreapta cu numărul de biți determinat de operand shift_counter. Biții deplasați la dreapta sunt scrieți în același operand din stânga.

Orez. 32. Schema de funcționare a comenzilor simple de schimbare ciclică


După cum se poate observa din Figura 32, instrucțiunile simple de deplasare ciclică efectuează o acțiune utilă în timpul funcționării lor, și anume: bitul deplasat ciclic nu este doar împins în operand de la celălalt capăt, dar, în același timp, valoarea lui devine valoarea lui. Steagul CE

Rotiți comenzi prin carry flag CF diferă de comenzile simple de deplasare ciclică prin aceea că bitul care este deplasat nu ajunge imediat la operand de la celălalt capăt al acestuia, ci este scris mai întâi la indicatorul de transport CE Doar următoarea execuție a acestei instrucțiuni de deplasare (presupunând că este executată într-o buclă) are ca rezultat plasarea bitului deplasat anterior la celălalt capăt al operandului(Fig. 33).

La comenzi de schimbare ciclică prin steagul de transport sunt legate următoarele:

1) operand rcl, shift_counter (Rotire prin Carry Left) – deplasare ciclică la stânga prin carry.

Conținutul operandului este deplasat la stânga cu numărul de biți determinat de operand shift_counter. Biții deplasați devin alternativ valoarea indicatorului de transport, cf.

2) operand rcg, shift_counter (Rotire prin Carry Right) – deplasare ciclică la dreapta prin carry.

Conținutul operandului este deplasat la dreapta cu numărul de biți determinat de operand shift_counter. Biții deplasați devin alternativ valoarea indicatorului de transport CF.

Orez. 33. Comenzi de schimbare ciclică prin intermediul flag CF


Din figura 33 este clar că la trecerea prin steag-ul de transport, apare un element intermediar, cu ajutorul căruia, în special, este posibilă înlocuirea biților deplasați ciclic, în special, nepotrivire secvențe de biți.

Prin nepotrivirea unei secvențe de biți de mai jos înțelegem o acțiune care ne permite într-un fel să localizăm și să extragem secțiunile necesare din această secvență și să le scriem într-o altă locație.

Comenzi suplimentare de schimbare

Sistemul de comandă al celor mai recente modele de microprocesoare Intel, începând cu i80386, conține comenzi suplimentare de schimbare care extind capacitățile pe care le-am discutat mai devreme. Acestea sunt comenzi de schimbare precizie dubla: 1) shld operand_1, operand_2, shift_counter – deplasare la stânga cu precizie dublă. Comanda shld efectuează o înlocuire prin deplasarea biților operandului_1 la stânga, umplându-și biții din dreapta cu valorile biților deplasați de la operand_2 conform diagramei din Fig. 34. Numărul de biți care trebuie deplasați este determinat de valoare shift_counter, operand_2 nu se schimba.


Orez. 34. Schema comenzii shld


2) shrd operand_1, operand_2, shift_counter – deplasare la dreapta cu precizie dublă. Instrucțiunea efectuează înlocuirea prin deplasarea biților operandului_1 la dreapta, umplându-și biții din stânga cu valorile biților deplasați de la operand_2 conform diagramei din Figura 35. Numărul de biți deplasați este determinat de valoarea shift_counter, care poate fi în intervalul 0... 31. Această valoare poate fi specificată ca operand imediat sau cuprinsă în registrul cl. Sens operand_2 nu se schimba.

Orez. 35. Schema comenzii shrd


După cum am observat, comenzile shld și shrd efectuează deplasări de până la 32 de biți, dar datorită particularităților de specificare a operanzilor și a algoritmului de operare, aceste comenzi pot fi folosite pentru a lucra cu câmpuri de până la 64 de biți.

2. Comenzile de transfer de control

Am întâlnit câteva dintre echipele care alcătuiesc liniar secțiuni ale programului. Fiecare dintre ele efectuează în general unele acțiuni de conversie sau transfer de date, după care microprocesorul transferă controlul către următoarea comandă. Dar foarte puține programe funcționează într-un mod atât de consistent. De obicei, există puncte într-un program în care trebuie luată o decizie cu privire la ce comandă va fi executată în continuare. Această soluție ar putea fi:

1) neconditionat -în acest moment este necesar să se transfere controlul nu către următoarea comandă, ci către alta, care se află la o anumită distanță de comanda curentă;

2) conditionat - decizia despre ce comandă va fi executată în continuare se ia pe baza analizei unor condiţii sau date.

Un program este o secvență de comenzi și date care ocupă o anumită cantitate de spațiu RAM. Acest spațiu de memorie poate fi fie contiguu, fie format din mai multe fragmente.

Microprocesorul știe ce instrucțiune de program ar trebui să fie executată în continuare de conținutul unei perechi de registre cs:(e)ip:

1) cs – registru de cod de segment, care conține adresa fizică (de bază) a segmentului de cod curent;

2) eip/ip – registru de indicator al instrucțiunii, care conține o valoare reprezentând offset-ul de memorie al următoarei instrucțiuni de executat față de începutul segmentului de cod curent.

Ce registru specific va fi utilizat depinde dacă modul de adresare este setat la use16 sau use32. Dacă se specifică utilizarea 16, atunci se utilizează ip, dacă se utilizează 32, se utilizează eip.

Astfel, instrucțiunile de transfer de control modifică conținutul registrelor cs și eip/ip, drept urmare microprocesorul selectează pentru execuție nu următoarea comandă de program în ordine, ci o comandă dintr-o altă secțiune a programului. Transportorul din interiorul microprocesorului este resetat.

Pe baza principiului de funcționare, comenzile microprocesorului care asigură organizarea tranzițiilor în program pot fi împărțite în 3 grupuri:

1. Comenzi pentru transferul necondiționat al controlului:

1) comandă de săritură necondiționată;

2) comanda de a apela o procedură și de a reveni dintr-o procedură;

3) comandă pentru a apela întreruperi software și a reveni de la întreruperile software.

2. Transferul condiționat al comenzilor de control:

1) comenzi de salt bazate pe rezultatul comenzii de comparare a paginii;

2) comenzi de tranziție bazate pe starea unui anumit steag;

3) comenzi pentru a naviga prin conținutul registrului ecx/cx.

3. Comenzi de control al ciclului:

1) comanda pentru organizarea unui ciclu cu contor ecx/cx;

2) o comandă de organizare a unui ciclu cu un contor ecx/cx cu posibilitatea de ieșire anticipată din ciclu într-o condiție suplimentară.

Salturi neconditionate

Discuția anterioară a scos la iveală câteva detalii ale mecanismului de tranziție. Instrucțiunile de salt modifică registrul pointerului instrucțiunii eip/ip și, eventual, registrul segmentului de cod cs. Ce anume trebuie modificat depinde de:

1) pe tipul de operand din comanda de salt necondiționat (aproape sau departe);

2) din indicația de dinaintea adresei de salt (în comanda de salt) modificator;în acest caz, adresa de salt în sine poate fi localizată fie direct în comandă (salt direct), fie într-o celulă de registru sau de memorie (salt indirect).

Modificator poate lua următoarele valori:

1) lângă ptr – tranziție directă la o etichetă în cadrul segmentului de cod curent. Numai registrul eip/ip este modificat (în funcție de tipul specificat de segment de cod use16 sau use32) în funcție de adresa (eticheta) specificată în comandă sau de o expresie folosind caracterul de extragere a valorii - $;

2) far ptr – tranziție directă la o etichetă într-un alt segment de cod. Adresa de salt este specificată ca operand imediat sau adresă (etichetă) și constă dintr-un selector de 16 biți și un offset de 16/32 de biți, care sunt încărcate în registrele cs și, respectiv, ip/eip;

3) word ptr – tranziție indirectă la o etichetă în cadrul segmentului de cod curent. Se modifică doar eip/ip (prin valoarea offset-ului din memorie la adresa specificată în comandă, sau din registru). Dimensiune offset 16 sau 32 de biți;

4) dword ptr – trecere indirectă la o etichetă într-un alt segment de cod. Ambele registre – cs și eip/ip – sunt modificate (cu o valoare din memorie - și numai din memorie, dintr-un registru). Primul cuvânt/dword al acestei adrese reprezintă offset-ul și este încărcat în ip/eip; al doilea/al treilea cuvânt este încărcat în cs. jmp comandă de salt necondiționat

Sintaxa comenzii de salt necondiționat este jmp [modifier] jump_address - un salt necondiționat fără a stoca informații despre punctul de întoarcere.

Jump_address este fie o adresă de etichetă, fie adresa zonei de memorie în care se află indicatorul de salt.

În total, sistemul de instrucțiuni al microprocesorului conține mai multe coduri de instrucțiuni jmp necondiționate ale mașinii de salt.

Diferențele lor sunt determinate de distanța de tranziție și de metoda de specificare a adresei țintă. Gamă tranziția este determinată de locația operandului adresa_tranziție. Această adresă poate fi în segmentul de cod curent sau în alt segment. În primul caz, se numește tranziția intrasegmental, sau cei dragi, in secunda - intersegmental, sau îndepărtat Un salt intra-segment presupune că numai conținutul registrului eip/ip este modificat.

Există trei opțiuni pentru utilizarea intra-segment a comenzii jmp:

1) drept scurt;

2) drept;

3) indirect.


Proceduri

Limbajul de asamblare are mai multe instrumente care rezolvă problema duplicării secțiunilor de cod de program. Acestea includ:

1) mecanismul procedurilor;

2) macro-asamblator;

3) mecanism de întrerupere.

Procedura, adesea numită subrutină - aceasta este unitatea funcțională de bază de descompunere (diviziunea în mai multe părți) a unei sarcini. O procedură este un grup de comenzi pentru rezolvarea unei anumite sarcini secundare și are mijloacele de a obține controlul din punctul de a apela o sarcină de nivel superior și de a reveni controlul în acest punct.

În cel mai simplu caz, un program poate consta dintr-o singură procedură. Cu alte cuvinte, o procedură poate fi definită ca un set de comenzi corect formatat, care, odată descris, poate fi apelat, dacă este necesar, oriunde în program.

Pentru a descrie o secvență de comenzi ca o procedură, limbajul de asamblare folosește două directive: PROC și ENDP.

Sintaxa pentru descrierea procedurii este următoarea (Fig. 36).


Orez. 36. Sintaxă pentru descrierea unei proceduri într-un program


Din Figura 36 se poate observa că în antetul procedurii (directiva PROC) este necesar doar numele procedurii. Dintre numărul mare de operanzi ai directivei PROC, [distanța] merită o mențiune specială. Acest atribut poate lua valori aproape sau departe și caracterizează posibilitatea apelării unei proceduri din alt segment de cod. În mod implicit, atributul [distanță] este setat la aproape.

Procedura poate fi plasată oriunde în program, dar în așa fel încât controlul să nu cadă accidental asupra ei. Dacă o procedură este pur și simplu inserată în fluxul general de comandă, atunci microprocesorul va percepe comenzile procedurii ca parte a acestui flux și, în consecință, va executa comenzile procedurii.

Salturi condiționate

Microprocesorul are 18 instrucțiuni de sărituri condiționate. Aceste comenzi vă permit să verificați:

1) relația dintre operanzii semnati („mai mult – mai puțin”);

2) relația dintre operanzii nesemnați („de sus – dedesubt”);

3) stări ale steagurilor aritmetice ZF, SF, CF, OF, PF (dar nu AF).

Comenzile de salt condiționat au aceeași sintaxă:

jcc transition_label

După cum puteți vedea, codul mnemonic al tuturor comenzilor începe cu „j” - din cuvânt a sari(sări), a ei - definește condiția specifică analizată de comandă.

Referitor la operand transiție_label, atunci această etichetă poate fi localizată numai în segmentul de cod curent; transferul intersegment al controlului în tranzițiile condiționate nu este permis. În acest sens, problema modificatorului, care era prezentă în sintaxa comenzilor de sărituri necondiționate, dispare. În modelele de microprocesor timpurii (i8086, i80186 și i80286), instrucțiunile de sărituri condiționate puteau face doar sărituri scurte - o distanță de la -128 la +127 de octeți de la instrucțiunea care urmează instrucțiunii de salt condiționat. Începând cu modelul de microprocesor 80386, această limitare este eliminată, dar, după cum puteți vedea, doar în cadrul segmentului de cod curent.

Pentru a lua o decizie cu privire la locul în care va fi transferat controlul cu o comandă de salt condiționat, trebuie mai întâi generată o condiție pe baza căreia se va lua decizia de a transfera controlul.

Sursele unei astfel de afecțiuni pot fi:

1) orice comandă care schimbă starea steagurilor aritmetice;

2) pagina de comandă de comparare, care compară valorile a doi operanzi;

3) starea registrului ecx/cx.


comanda de comparare cmp

Comanda de comparare a paginii are un principiu de funcționare interesant. Este absolut aceeași cu comanda de scădere - sub operand, operand_2.

Comanda de pagină, ca și comanda secundară, scade operanzi și setează steaguri. Singurul lucru pe care nu îl face este să scrie rezultatul scăderii în locul primului operand.

Sintaxa comenzii de pagină este pagina operand_1, operand_2 (comparare) – compară doi operanzi și setează steaguri pe baza rezultatelor comparației.

Indicatoarele setate de comanda page pot fi analizate folosind comenzi speciale de ramificație condiționată. Înainte de a le privi, să acordăm puțină atenție mnemonicii acestor comenzi de sărituri condiționate (Tabelul 16). Înțelegerea notării la formarea numelor comenzilor de sărituri condiționate (elementul din numele comenzii jcc, desemnat de noi) va ușura memorarea lor și utilizarea practică ulterioară.

Tabelul 16. Semnificația abrevierilor din numele comenzii jcc
Tabelul 17. Lista comenzilor de salt condiționat pentru pagina de comandă operand_1, operand_2

Nu fi surprins de faptul că aceleași valori ale steagului corespund mai multor coduri mnemonice diferite ale comenzilor de sărituri condiționate (sunt separate unele de altele printr-o bară oblică în Tabelul 17). Diferența de nume se datorează dorinței designerilor de microprocesoare de a facilita utilizarea instrucțiunilor de salt condiționat în combinație cu anumite grupuri de instrucțiuni. Prin urmare, nume diferite reflectă mai degrabă orientări funcționale diferite. Cu toate acestea, faptul că aceste comenzi răspund la aceleași steaguri le face absolut echivalente și egale în program. Prin urmare, în Tabelul 17, acestea sunt grupate nu după nume, ci după valorile (condițiile) de steag la care reacționează.


Instrucțiuni și steaguri condiționale pentru ramuri

Notația mnemonică pentru unele comenzi de sărituri condiționate reflectă numele steagului pe care operează și are următoarea structură: caracterul „j” este primul. (A sari, tranziție), al doilea este fie desemnarea steagului, fie simbolul de negație „n”, urmat de numele steagului. Această structură de echipă reflectă scopul ei. Dacă nu există caracterul „n”, atunci starea steagului este verificată; dacă este egal cu 1, se face o tranziție la eticheta de salt. Dacă caracterul „n” este prezent, atunci starea steagului este verificată pentru egalitatea 0, iar dacă are succes, se face un salt la eticheta de salt.

Codurile mnemonice ale comenzilor, numele steagurilor și condițiile de tranziție sunt date în Tabelul 18. Aceste comenzi pot fi utilizate după orice comenzi care schimbă steagurile specificate.

Tabelul 18. Comenzi de sărituri condiționate și steaguri

Dacă vă uitați îndeaproape la Tabelele 17 și 18, puteți vedea că multe dintre comenzile de salt condiționat din ele sunt echivalente, deoarece ambele se bazează pe analiza acelorași steaguri.


Instrucțiuni de sărituri condiționate și registrul ecx/cx

Arhitectura microprocesorului presupune utilizarea specifică a multor registre. De exemplu, registrul EAX/AX/AL este folosit ca acumulator, iar registrele BP și SP sunt folosite pentru a lucra cu stiva. Registrul ESH/CX are și un scop funcțional specific: îndeplinește rolul tejgheaîn comenzile de control al buclei și când se lucrează cu șiruri de caractere. Este posibil ca din punct de vedere funcțional comanda de salt condiționat asociată cu registrul ecx/cx să fie clasificată mai corect ca acest grup de comenzi.

Sintaxa pentru această comandă de ramificare condiționată este:

1) jcxz jump_label (Sari daca ex este zero) – sari daca cx este zero;

2) jecxz jump_label (Jump Equal exx Zero) – sari dacă exx este zero.

Aceste comenzi sunt foarte convenabile de utilizat atunci când organizați o buclă și când lucrați cu șiruri de caractere.

Trebuie remarcat faptul că există o limitare inerentă comenzii jcxz/jecxz. Spre deosebire de alte instrucțiuni de transfer de control condiționat, instrucțiunea jcxz/jecxz poate adresa doar salturi scurte - la -128 octeți sau +127 octeți de la următoarea instrucțiune.

Organizarea ciclurilor

Ciclul, după cum știți, este o structură algoritmică importantă, fără a cărei utilizare, probabil, nici un singur program nu poate face. Puteți organiza execuția ciclică a unei anumite secțiuni a programului, de exemplu, folosind comenzi de transfer condiționat sau comanda de salt necondiționat jmp. La acest tip de organizare a ciclului, toate operațiunile legate de organizarea acestuia sunt efectuate manual. Dar, având în vedere importanța unui astfel de element algoritmic ca ciclu, dezvoltatorii de microprocesoare au introdus un grup de trei comenzi în sistemul de comandă pentru a facilita programarea ciclurilor. Aceste comenzi folosesc, de asemenea, registrul ecx/cx ca contor de cicluri.

Să dăm o scurtă descriere a acestor comenzi: 1) loop jump_label (Loop) – repetă ciclul. Comanda vă permite să organizați bucle similare cu buclele for în limbi de nivel înalt, cu scăderea automată a contorului de bucle. Sarcina echipei este de a face următoarele:

b) compararea registrului ESX/CX cu zero: dacă (ECX/CX) = 0, atunci controlul este transferat la următoarea comandă după buclă;

2) loope/loopz transition_label

Comenzile loope și loopz sunt sinonime absolute. Lucrarea comenzilor este de a efectua următoarele acțiuni:

a) decrementarea registrului ESH/CX;

c) analiza stării indicatorului zero ZF dacă (ECX/CX) = 0 sau XF = 0, controlul este transferat la următoarea comandă după buclă.

3) loopne/loopnz transition_label

Comenzile loopne și loopnz sunt, de asemenea, sinonime absolute. Lucrarea comenzilor este de a efectua următoarele acțiuni:

a) decrementarea registrului ESH/CX;

b) compararea registrului ESX/CX cu zero;

c) analiza stării indicatorului zero ZF: dacă (ECX/CX) = 0 sau ZF = 1, controlul este transferat la următoarea comandă după buclă.

Comenzile loop/loopz și loopne/loopnz sunt inverse în principiul lor de funcționare. Ele extind acțiunea comenzii buclei prin analiza suplimentară a steagului zf, ceea ce face posibilă organizarea unei ieșiri timpurii din buclă, folosind acest indicator ca indicator.

Dezavantajul comenzilor loop, loope/loopz și loopne/loopnz este că implementează doar salturi scurte (de la -128 la +127 octeți). Pentru a lucra cu bucle lungi, va trebui să utilizați comenzi de ramificare condiționată și comanda jmp, așa că încercați să stăpâniți ambele metode de organizare a buclelor.

Bazele programării dispozitivelor MP (Prelegere)

PLANUL DE PRELEGERE

1. Clasificarea comenzilor microprocesorului

2.Tipuri de adresare

3. Structura și formatele de comandă ale MP KR580VM80

1. Clasificarea comenzilor microprocesorului

După cum sa menționat deja, avantajul fundamental al MP este programabilitatea. Aceasta înseamnă că prin aplicarea comenzilor la intrarea MP, este posibil să se asigure secvența dorită de operații, adică. implementarea unui anumit algoritm.Algoritmul problemei care se rezolvă poate fi atât de complex pe cât se dorește, este necesar doar ca acest algoritm să fie defalcat în pași în conformitate cu sistemul de comandă al MP. Prin urmare, sistemul de comandă este important să nu doar din punctul de vedere a ceea ce poate face MP, dar și modul în care se execută algoritmul. Prezența sau absența oricărei comenzi sau grup de comenzi poate afecta semnificativ alegerea MP pentru o anumită aplicație.

Clasificarea comenzilor MP este prezentată în Figura 8.

Pe baza numărului de celule de memorie necesare pentru a găzdui o comandă, se disting comenzile de unul, două sau trei cuvinte în lungime. Instrucțiunile care au două sau trei cuvinte necesită două sau, respectiv, trei cicluri de acces la memorie pentru a fi preluate.

În multe cazuri, în special când se compară MP-uri cu arhitecturi similare, este util să se clasifice comenzile în conformitate cu caracteristicile arhitecturale ale MP.

Din punct de vedere funcțional, echipele sunt împărțite în trei mari grupe: transmisie, management și prelucrare a datelor. Să luăm în considerare în detaliu principalele comenzi utilizate în MP, folosind clasificarea în funcție de caracteristicile funcționale. Numele comenzilor vor fi notate cu cuvinte rusești care indică semnificația operațiunilor efectuate.

Comenzi de transfer de date asigura un transfer simplu de informații fără a efectua nicio operațiune de prelucrare. Comenzile din acest grup sunt împărțite în comenzi legate de accesul la memorie, comenzile de acces la înregistrare și comenzile de intrare/ieșire.

Comenzile legate de accesul la memorie includ:

TINE MINTE(SCRIERE), prin care conținutul registrului este trimis către celula de memorie.

Comenzile legate de transferul unui octet sau cuvânt trebuie să indice numărul unui anumit registru, adresa celulei de memorie și, dacă este necesar, numărul modulului de stocare.

Comenzile asociate cu accesarea registrelor trebuie să indice numărul sursei de informații și numărul registrului rezultat. Acest subgrup de comenzi de transfer de date include comenzile:

DESCARCĂ DIRECT, în care constanta specificată în codul de comandă este scrisă în registru;

REDIRECŢIONA, prin care conținutul unui registru este trimis altuia.

Comenzile I/O includ:

INTRODUCE, prin care conținutul dispozitivului de intrare este trimis în registrul intern al MP;

CONCLUZIE, în care conținutul registrului intern al MP (de obicei un acumulator) este trimis către dispozitivul de ieșire.

Comenzi de control , numite adesea comenzi de tranziție, vă permit să efectuați diverse acțiuni în conformitate cu valoarea semnalelor externe sau condițiilor generate în cadrul sistemului.Toate comenzile de control sunt împărțite în comenzi de tranziție necondiționate și condiționate.

Comenzile de sărituri necondiționate includ:

SĂRIT NECONDIȚIONAT(BP), conform căruia conținutul câmpului de adresă al comenzii BP este scris în contorul de programe, adică oferă o tranziție în program la adresa specificată în comandă;

TRANSFER NECONDIȚIONAT CU RESTITUIRE(tranziție la o subrutină), conform căreia conținutul nou este scris în contorul de program (adresa primei comenzi a subrutinei), dar spre deosebire de comanda BP, starea contorului de program și a altor registre este salvată în memorie . Când o subrutină este executată la ultima sa comandă RETURN, conținutul contorului programului și toate registrele sunt restaurate.

Instrucțiunile de salt condiționat verifică starea unui bit de registru, a unui flip-flop de semnalizare sau a unui alt parametru. Rezultatul verificării determină dacă tranziția va fi efectuată sau nu. De obicei, tranziția este efectuată dacă rezultatul verificării se potrivește cu condiția specificată în comandă. Acest subgrup de comenzi de control include:

SĂRIT CONDIȚIONAT(UP) prin adresă.Codul comenzii UP trebuie să indice condiția care se verifică, pentru care MT folosește o valoare zero sau diferită de zero a rezultatului, un semn pozitiv sau negativ al rezultatului, prezența sau absența transportului. semnale, depășire etc.. Când condiția este îndeplinită, conținutul contorului de adrese este scris în contorul de programe Câmpurile de comandă UE, adică. oferă o tranziție în program la adresa specificată în comandă. Dacă condiția nu este îndeplinită, controlul este transferat la următoarea comandă de program;

TRANZIȚIE CONDIȚIONATĂ CU RETURNARE, care diferă de comanda NECONDITIONAL JUMP WITH RETURN prin faptul că trecerea la subrutină are loc numai atunci când condiția specificată este îndeplinită.

De obicei, sistemul de comandă MP include mai multe comenzi auxiliare care vă permit să controlați starea registrelor sau a declanșatorilor care afectează execuția tranzițiilor condiționate, de exemplu: SET FLAG, RESET FLAG, SET BATTERY HIGH BIT, RESET BATTERY HIGH BIT etc. .

Comenzi de prelucrare a datelor sunt împărțite în aritmetice și logice. Cele aritmetice includ:

FOLD conținutul a două registre sau a unui registru și a unei celule de memorie;

SCĂDEA din conținutul unei celule de memorie sau al unui registru;conținutul unui registru;

CREȘTE CU 1(INCREMENTARE) conținutul unei celule de memorie sau al unui registru (indicator de stivă, registru index, acumulator);

SCADĂ CU 1(DECREMENTARE) conținutul unei celule de memorie sau al unui registru;

ADAUGĂ CU REALIZARE, prin care se realizează adăugarea ținând cont de starea declanșatorului de transfer. Acest lucru facilitează organizarea procesării numerelor mari;

SCADEAZA CONTABILITATEA IMRUMUTULUI;

SCHIMB conținutul unei celule de memorie sau al unui registru (de obicei un bit).

Subgrupul de comenzi logice include următoarele comenzi:

ȘI(MULTIPLICARE LOGICĂ), prin care se realizează operația de conjuncție între conținutul a două registre sau o celulă de memorie și un registru;

SAU(ADIUȚIA LOGICĂ), prin care se realizează o operație de disjuncție între conținutul a două registre sau o celulă de memorie și un registru;

INVALIDITATE, care realizează o comparație pe biți a conținutului a două registre sau a unei celule de memorie și a unui registru;

INVERSIUNE conținutul unei celule de memorie sau al unui registru.

2.Tipuri de adresare

Una dintre cele mai importante caracteristici arhitecturale ale MP este lista de metode posibile de accesare a memoriei sau tipuri de adresare. Capacitățile de adresare ale MP sunt semnificative din două puncte de vedere.

În primul rând, o cantitate mare de memorie necesită o lungime mare a adresei, deoarece o adresă de n biți permite accesul la memorie cu o capacitate de 2n cuvinte. Cuvintele MP tipice de 8 biți fac posibilă accesarea directă a doar 256 de celule de memorie, ceea ce în mod clar nu este suficient. Dacă ținem cont de faptul că accesarea memoriei este cea mai comună operațiune, atunci este evident că eficiența utilizării MP este determinată în mare măsură de metodele de abordare a unui volum mare de memorie cu o capacitate mică de biți de MP.

În al doilea rând, pentru ușurința programării, este de dorit să existe un sistem simplu de generare a adreselor de date atunci când se lucrează cu matrice, tabele și pointeri. Să ne uităm la modalități de a rezolva aceste probleme.

Dacă câmpul de adresă al comenzii este limitat și insuficient pentru a accesa direct orice celulă de memorie, atunci memoria în astfel de cazuri este împărțită în pagini, unde 2n celule de memorie sunt considerate o pagină.

Pentru a potrivi câmpul de adresă al unei comenzi pe biți mici cu memorie de mare capacitate (pentru a rezolva problema „paginii”), în MP sunt utilizate diferite tipuri de adresare:

Adresare directă către pagina curentă . Cu această adresare, contorul programului este împărțit în două câmpuri; biții de ordin superior indică numărul paginii, iar biții de ordin inferior indică adresa celulei de pe pagină. Câmpul de adresă al comenzii conține adresa celulei de pe pagină, iar adresa paginii trebuie setată într-un alt mod, de exemplu, folosind o comandă specială.

Adresare directă folosind registrul paginii. MP-ul trebuie să aibă un registru de pagină accesibil programatic, încărcat printr-o comandă specială. Acest registru adaugă câțiva biți în câmpul de adresă al instrucțiunii, necesari pentru adresarea întregii memorie.

Adresare directă folosind cuvinte duble. Pentru a mări lungimea câmpului de adresă al unei comenzi, este alocat un cuvânt suplimentar pentru adresă (și dacă este necesar, două).

Adresarea relativă la contorul de programe. Câmpul de adresa de instrucțiune este tratat ca un întreg cu semn, care este adăugat la conținutul contorului programului pentru a forma adresa de execuție. Această metodă de adresare relativă creează o pagină plutitoare și facilitează mutarea programelor în memorie.

Adresarea relativă la registrul index. Adresa de execuție se formează prin însumarea conținutului registrului index și a câmpului de adresă al comenzii, considerat ca un întreg cu semn. Registrul index este încărcat cu comenzi speciale.

Adresare indirectă . Când se utilizează adresarea indirectă, câmpul de adresă al comenzii specifică adresa de pe pagina curentă în care este stocată adresa executivă. În acest caz, este necesar un bit suplimentar în câmpul de comandă - un semn de adresare indirectă. Adresa executivă poate fi stocată nu într-o celulă de memorie, ci într-un registru de uz general. În acest caz, adresarea indirectă se numește adresare de registru.

3. Structura și formatele de comandă ale MP KR580VM80

Sistemul de comandă MP al seriei KR580VM80 conține comenzi în trei formate: un singur octet, dublu octet și trei octeți.

Conținutul primului octet indică formatul comenzii, codul operației, tipul de adresare și registrele sau perechile de registre, dacă acestea sunt implicate în operație.Totuși, este imposibil să se specifice biții specifici care sunt alocați primilor trei dintre componentele specificate ale comenzii, deoarece pot fi localizate în orice biți ai comenzii. Dar, în ciuda acestui fapt, vom presupune că acestea sunt codificate ca un singur câmp, care se numește câmpul de cod de operare. Variantele de formate pentru primul octet al comenzii sunt prezentate în Figura 9.

Dacă registrele sunt implicate în operație, unul sau două dintre ele pot fi specificate în primul octet al comenzii. În acest caz, numerelor de registru din câmpul de comandă sunt alocați biți destul de specifici: cei trei biți de ordin inferior (b2 – b0) codifică numărul registrului sursă care conține operandul, iar cei trei din mijloc (b5 – b3) – numărul registrului de destinație în care este trimis rezultatul operației.În acele cazuri, când ambele sau unul dintre aceste registre nu sunt implicate în executarea operației, se folosesc biții corespunzători pentru codul operației.

Este acceptată următoarea codificare de registru:

000 – registrul B, 100 – registrul H,

001 – registrul C, 101 – registrul L,

010 – registrul D, 110 – celula de memorie,

011 – registru E, 111 – baterie A.

Codul 100 este un semn al adresei indirecte de memorie folosind o adresă de 16 biți situată în registrele H și L. În funcție de locația acestui cod în comandă, celula de memorie corespunzătoare este accesată fie pentru un operand, fie pentru scrierea rezultatelor operațiunea.

O serie de comenzi MP asigură procesarea sau transmiterea numerelor cu lungime dublă. În aceste cazuri, perechile de registre B și C, D și E sau H și L sunt combinate în registre de 16 biți numerotate 00, 01 și, respectiv, 10. Numerele de perechi de registre din comenzi sunt atribuite biților b2 și b1 (registrul sursă), b5 și b4 (registrul de destinație), iar biții b0 și b3 sunt utilizați pentru a indica codul operației.

Comenzile pe dublu octet din MP includ comenzi cu adresare directă și comenzi de intrare/ieșire.În consecință, al doilea octet al comenzii din acest grup conține un operand de 8 biți sau o adresă de 8 biți a unui dispozitiv de intrare sau de ieșire.

În instrucțiunile de trei octeți, al doilea și al treilea octet conțin adrese de 16 biți (în instrucțiunile de adresare directă) sau operanzi de 16 biți (în instrucțiunile pentru încărcarea perechilor de registre și a indicatorului de stivă).

După executarea fiecărei operațiuni ALU, sunt generate cinci semne, ale căror valori pot influența execuția comenzilor ulterioare de prelucrare a informațiilor și de transfer de control condiționat.Totuși, trebuie avut în vedere că diferitele comenzi au efecte diferite asupra semnelor individuale.

Pentru confortul salvării și restabilirii stării MP în timpul întreruperilor și tranzițiilor la subrutine, toate caracteristicile specificate sunt stocate într-un registru special - registrul caracteristicilor. Locația semnelor în biții de registru este prezentată în tabel.

unde S este atributul „semn” (preia valoarea celui mai semnificativ bit

rezultat);

Z – semnul rezultatului zero;

AC este un semn de transfer auxiliar (dacă există transfer

între tetrade de octeți, apoi AC=1, în caz contrar AC=0;

P – un semn de paritate al rezultatului (dacă numărul de unități din octet

rezultatul este par, atunci P=1, altfel P=0);

C – semn de transfer sau împrumut (dacă, la executarea comenzilor,

Când a avut loc un transfer de la un grad superior sau un împrumut la un senior-

Cea mai mare cifră este C=1, în caz contrar C=0).

Notă: Pentru comenzile de înmulțire logică, semnul de transport auxiliar AC ia valoarea celui de-al patrulea bit al rezultatului.

Sistemul complet de comandă al seriei MP KR580VM80 este prezentat în anexa manualului „Microprocesoare și sisteme cu microprocesoare”. Acolo, pentru fiecare comandă, se indică modul în care, după executarea acesteia, valoarea fiecărui atribut se modifică: se setează în funcție de rezultatul operației (+), nu se modifică (–), se resetează la zero (0). ) sau setați la unu (1).

În general, comanda ar trebui să conțină următoarele informații:

– codul operațiunii care indică operația pe care MP trebuie să o efectueze;

–adresele a doi operanzi (adunanzi, subtraende etc.). Dacă oricare dintre operanzi este o constantă, atunci în loc de adresa sa, valoarea operandului însuși poate fi specificată în comandă. Cu toate acestea, această împrejurare trebuie să fie reflectată în codul de operare, astfel încât MP să folosească partea corespunzătoare a comenzii pentru scopul său;

–adresa celulei de memorie în care trebuie plasat rezultatul operației;

– adresa următoarei comenzi.

Acestea. comanda este, în general, cu patru adrese.Totuși, această structură de comandă duce la un format de comandă mai lung, care, la rândul său, este asociat cu un proces de procesare și o structură de procesor mai complexe. Prin urmare, în tehnologia MP, comenzile fără adresă și unicast sunt cele mai răspândite, făcând posibilă construirea unui procesor simplu.Cu toate acestea, atunci când se efectuează operații complexe, se folosesc diverse formate de comandă.

Sistemul de instrucțiuni MP seria 580 are instrucțiuni pe un singur octet, pe dublu și pe trei octeți.

Informațiile despre modul în care comanda care urmează să fie adresată sunt conținute în codul operațional al primului octet al comenzii.

Pentru a accelera calculele, unii operanzi sunt stocați în blocul RON. Instrucțiunile care operează pe acești operanzi folosesc coduri de adresă prescurtate (adresarea în registru).

Aceste comenzi vă permit să eliminați ciclul relativ lung de accesare a memoriei RAM și, prin urmare, să creșteți semnificativ viteza operațiunilor. Datorită capacității limitate a RON și atunci când se lucrează cu o gamă largă de date, se folosesc alte metode de adresare care permit accesul la operanzii aflați în memoria externă MP. Cea mai comună este adresarea indirectă a registrului, care utilizează o pereche de registre HL.

În grupul de comenzi de transfer de control, există patru tipuri de comenzi: ramuri necondiționate, ramuri condiționate, bucle și întreruperi .

Comenzi de sărituri necondiționate. Include trei coduri mnemonice: JMP (salt necondiționat), CALL (apel subrutine) și RET (întoarcere din subrutină).

Comanda JMP vă permite să săriți în orice punct al programului, situat atât în ​​segmentul de program curent, cât și în alt segment. Când săriți în cadrul segmentului de program curent, sunt utilizate primele trei formate de instrucțiuni JMP.

Primul format oferă o tranziție la un punct arbitrar al programului în cadrul segmentului de program curent, pentru care se adaugă un offset de 16 biți la conținutul IP în codul complementar al doi, dintre care bitul cel mai semnificativ este semnat. Al doilea format, scurtat, vă permite să săriți la un punct din program nu mai mult de -128-f-127 adrese din instrucțiunea JMP. În cele din urmă, al treilea format încarcă indicatorul de instrucțiune cu un număr de 16 biți, care se află la adresa executivă EA, determinată de postbyte. Această tranziție se numește indirectă deoarece se utilizează adresarea indirectă.

Pentru a implementa un salt necondiționat la un punct de program situat în afara segmentului de program curent atunci când este necesară o reîncărcare a registrului de segment CS, sunt utilizate al patrulea și al cincilea format de instrucțiuni JMP.

Al patrulea format definește o tranziție intersegment directă, în care al doilea și al treilea octet al formatului indică adresa relativă a punctului de tranziție, iar al patrulea și al cincilea octet indică noua valoare CS. Al cincilea format, folosind un postbyte, vă permite să determinați adresa executivă EA, la care se află adresa relativă a punctului de tranziție (în octeți de memorie cu adrese EA, EA+1) și noua valoare CS (în octeți de memorie). EA+2, EA+3).

Comanda CALL vă permite să apelați o subrutină situată fie în segmentul de program curent, fie într-o altă zonă de memorie. Are aceleași formate ca și comanda JMP, cu excepția faptului că este mai scurtă. Spre deosebire de comanda JMP de un format similar, comanda CALL, înainte de a schimba valorile IP sau IP și CS, scrie automat valorile curente ale acestor registre în stivă, ceea ce asigură că punctul de întoarcere din subrutină este memorat.

Pentru a reveni dintr-o subrutină, utilizați comanda RET, care transferă controlul către adresa de retur introdusă în stivă atunci când executați comanda CALL anterioară. La întoarcerea de la subrutinele situate în segmentul de program curent, se folosesc primele două formate ale instrucțiunii RET, iar al doilea format diferă de primul prin faptul că la conținutul instrucțiunii se adaugă o constantă scrisă în al 2-lea și al 3-lea octet al instrucțiunii. indicatorul stivei. Aceasta permite, concomitent cu revenirea din subrutină, să resetați parametrii înscriși în stivă în timpul execuției acestei subrutine și neutilizați în viitor.

Pentru returnarea intersegmentului, sunt utilizate al treilea și al patrulea format RET, care asigură recuperarea conținutului atât al pointerului de instrucțiuni, cât și al segmentului de program.

Comenzi de sărituri condiționate. Transfer de control în funcție de rezultatele operațiunilor anterioare. Există trei tipuri de salturi condiționate care sunt utilizate pentru a stabili relații între numerele cu semn, numerele fără semn și numerele arbitrare. În primele două soiuri, sunt selectate coduri mnemonice de comandă diferite pentru aceleași relații între numere, deoarece valori diferite ale steagului corespund acelorași relații între numerele semnate și nesemnate.

În codurile mnemonice ale comenzilor de sărituri condiționate, atunci când se compară numerele semnate, litera este folosită pentru a indica condiția „mai mare decât” G (mai mare- mai mult), și pentru a desemna - „mai puțin” litera L (mai puțin- Mai puțin). Pentru condiții similare, la compararea numerelor nesemnate se folosesc, respectiv, litere A (mai sus- mai sus) și De mai jos- sub). Condiția de egalitate este indicată de literă E (Egal- este egal), iar neîndeplinirea unei condiții - prin scrisoare N (Nu- Nu). Trebuie remarcat faptul că este permisă utilizarea a două coduri mnemonice diferite pentru fiecare comandă; de exemplu, codurile mnemonice JL și JNGF sunt echivalente, deoarece condițiile „mai puțin decât” și „nu mai mare decât sau egal cu” sunt identice.

O listă completă de coduri mnemonice de comandă, condițiile verificate, precum și combinațiile booleene corespunzătoare de steaguri și valorile acestora sunt date în tabel. 1.4.

Tabelul 1.4

Cod mnemonic de comandă Condiție Înțelesul steagurilor
Pentru numerele semnate
JL/JNGE Mai mic/nu mai mult sau egal cu SF + OF = l
JNL/JGE Nu mai puțin/mai mare sau egal cu SF + OF = 0
JG/JNLE Mai mult decât/nu mai puțin sau egal cu (SF + OF) V ZF = 0
JNG/JLE Nu mai mare decât/mai mic sau egal cu Pentru numere nesemnate (SF + OF) V ZF = l
JB/JNAE Mai mic/nu mai mult sau egal cu CF=1
JNB/JAE Nu mai puțin/mai mare sau egal cu CF=0
JA/JNBE Mai mult CF V ZF = 0
JNA/JBE Nu mai mult Pentru alte date CF V ZF = 1
JE/JZ Egal/zero ZF = 1
JNE/JNZ Nu este egal/zero ZF = 0
JS Cu minus SF = 1
JNS Pe partea de plus SF = 0
JO Revărsare OF = l
JNO Prin absența preaplinului OF = 0
JP/JPE Prin paritate egală PF = 1
JNP/JPO Prin paritate impară PF = 0

Toate instrucțiunile de salt condiționate au același format de doi octeți, primul octet este codul de operare (OPC), iar al doilea este un offset de 8 biți, care este tratat ca un număr semnat și, prin urmare, permite modificări de adrese în interval de la -128 la + 127. Dacă este necesară o tranziție mai îndepărtată („departe”) atunci când condiția este îndeplinită, se folosește o comandă suplimentară de tranziție necondiționată.

Timpul de execuție al fiecăreia dintre instrucțiunile de salt condiționat este indicat pentru două cazuri: 1) condiția este îndeplinită și controlul este efectiv transferat în conformitate cu offset, 2) condiția nu este îndeplinită, astfel încât controlul este transferat la instrucțiunea următoare.

Echipe pentru organizarea ciclurilor. Introdus în CPU pentru confortul realizării ciclurilor de calcul. Acestea includ următoarele coduri mnemonice: LOOP (buclă până la (CX) nu este egală cu 0), LOOPNZ/LOOPNE (buclă până la zero/nu este egal cu), LOOPZ/LOOPE (buclă până la zero/egal cu) și JCXZ (săritură pe zero în SH). Fiecare dintre aceste comenzi are un format de doi octeți, al doilea octet specificând offset-ul de 8 biți utilizat pentru aranjarea saltului. Acest offset este tratat ca un număr cu semn și este extins cu semn la 16 biți înainte ca adresa de salt să fie calculată.

Folosind comenzi bucle împreună cu comenzi pentru manipularea elementelor șir, puteți crea programe de conversie de șir destul de complexe. Să luăm în considerare un exemplu de compunere a unui program pentru a converti un șir de date scrise în sistemul numeric hexazecimal într-un cod pentru care tabelul de conversie se află în memorie de la adresa de pornire specificată în BX, așa cum este necesar pentru a utiliza comanda de conversie a tabelului pentru XLAT coduri. Să presupunem în continuare că șirul sursă conține 80 de elemente și se află în memorie de la adresa de pornire relativă 100, iar șirul rezultat ar trebui plasat de la adresa relativă 200. Programul care convertește șirul sursă în șirul rezultat, cu valoarea indicatorului de direcție DF=0, va avea forma:

MOVSI ,100
MOV DI ,200
MOV CX, 80

Comanda de conversie a tabelului XLAT descrisă în 1.2 este folosită aici.

Comenzi de întrerupere. Include trei mnemonice: INT (întrerupere), INTO (întrerupere la depășire) și IRET (întoarcere întrerupere).

Comanda de întrerupere INT la v=1 are un format de doi octeți, al doilea octet conține un număr de 8 biți care definește tipul (tip) sau nivelul de întrerupere. Prin comanda INT tip Procesorul procedează la executarea programului de serviciu de întrerupere la nivelul specificat, iar acțiunile necesare pentru a asigura revenirea la punctul de întrerupere sunt efectuate automat. Aceste acțiuni sunt următoarele: conținutul registrului de steaguri F este scris în stivă (PUSHF), steaguri IF și TF sunt resetate, valorile curente ale registrului CS și indicatorul de instrucțiuni IP sunt scrise în stivă.

Pentru a determina adresa de pornire a programului de service în funcție de valoare tip Este folosit tabelul de nivel de întrerupere. Pentru fiecare dintre cele 256 de niveluri de întrerupere din acest tabel, sunt alocați patru octeți: primii doi octeți determină valoarea pointerului instrucțiunii IP, al doilea - valoarea registrului de segment CS. Acești patru octeți determină adresele de pornire ale programelor de serviciu (perechi de valori CS, IP), care trebuie mai întâi scrise în celulele de memorie la adresele absolute 0-3FFH. Adresă de tabel corespunzătoare celei specificate în comanda INT tip nivelul de întrerupere este determinat în CPU după cum urmează. După stocarea valorilor curente ale CS și GR în stivă, se efectuează încărcarea: CS = tip X 4 + 2 și IP = tip X 4. Noi valori CS și IP preluate din celulele de adrese, respectiv tip X 4 + 2 Și tip X 4, determinați adresa de pornire a programului de întreținere necesar.

Comanda de întrerupere INT discutată mai sus când valoarea câmpului este v=0 are un format pe un singur octet, adică nu necesită indicarea specială a nivelului de întrerupere. Această comandă este percepută automat de procesor ca o întrerupere de nivel 3. (tip=3)și este folosit în mod obișnuit în programe ca punct de control.

Comanda de întrerupere a depășirii INTO determină o tranziție la întreruperea de al patrulea nivel (tip = 4)în cazul în care valoarea steagului de overflow OF = 1. Comanda INTO este folosită de obicei după comenzi aritmetice semnate. De obicei, primele câteva niveluri de întrerupere (până la 32) sunt rezervate pentru procesarea unui număr de situații specifice, cum ar fi o încercare de împărțire la zero, depășire și altele asemenea.

O particularitate a procesării întreruperilor de niveluri rezervate este că procesorul procedează la deservirea acestora, indiferent de valoarea indicatorului de activare a întreruperii IF.

Instrucțiunea IRET de un octet este plasată la sfârșitul fiecărei rutine de serviciu de întrerupere și asigură revenirea întreruperii. Cu această comandă, procesorul preia valoarea indicatorului de instrucțiune IP și a segmentului de program CS din stivă și, de asemenea, restabilește conținutul anterior al registrului de steaguri F (ca și în cazul comenzii POPF). Dacă este necesar, conținutul registrelor CPU rămase corespunzătoare programului întrerupt poate fi stocat pe stivă la trecerea la programul de service și apoi restaurat la întoarcerea din acesta folosind instrucțiuni de acces la stivă.

Prin adresa indirectă

PCHL – adresa de salt este stocată în perechea de registre HL. Când este executat (HL) → PC.

Comenzi de sărituri condiționate

Jcon @, unde con este o condiție mnemonică din cuvântul englez condition.

S-a remarcat anterior că starea biților (steaguri) din RgP (F) este utilizată ca o condiție de tranziție. Mnemoteciile corespunzătoare acestor stări sunt prezentate în Fig. 6.18.

De exemplu: JC 8BFE – când C=1 merge la adresa 8BFE, când C=0 se execută următoarea comandă la adresa.

Comenzi pentru apelarea PP și întoarcere

S-a remarcat anterior că adresa de retur este stocată automat pe stivă, adică. (PC) ® stivă.

Comenzi necondiționate

CALL @ – apel de subrutină;

RET – întoarcere din subrutină.

Comenzi condiționale

Ccon @ – apel de subrutină;

Rcon – întoarcere din subrutină.

Acțiunea comenzilor este similară cu acțiunea comenzilor de sărituri condiționate, adică. dacă condiția este adevărată, atunci sunați sau reveniți. Dacă nu, atunci sunt executate următoarele comenzi.

Alte comenzi de control

RST n, unde n = 0,1,...,7 – repornire conform vectorului de întrerupere n.

Când această comandă este executată, controlul este transferat subrutinei care deservesc această întrerupere. În timpul execuției instrucțiunii RST, conținutul contorului de programe PC este stocat pe stivă, iar adresa vectorului de întrerupere corespunzător este scrisă pe PC.

Această adresă este setată după cum urmează. Comanda RST are structura 11NN N111, i.e. un octet. Combinația NNN pe trei biți este specificată de valoarea n (n = 0...7). Valoarea 0000 0000 00NN N000 este introdusă în contorul de comenzi PC, care servește ca adresă a vectorului de întrerupere corespunzător.

Astfel, setând o anumită valoare a lui n, puteți genera adresa unuia dintre cei 8 vectori de întrerupere. Aceste adrese sunt situate în zona de la 0000H la 0038H a spațiului de adrese și trec prin 8 octeți, adică. Primele 64 de celule de memorie le sunt rezervate (fiecărui dintre cei 8 vectori îi sunt alocați 8 octeți). În aceste zone (de câte 8 octeți) sunt scrise doar comenzile pentru săritul la subrutinele corespunzătoare (handlere), care se află în alte zone de memorie.

Întreruperea subrutinelor (ca subrutinele normale) trebuie să se încheie cu comanda RET. În timpul executării acestei comenzi, adresa comenzii programului principal înaintea căreia a avut loc întreruperea este selectată din stivă și transferată în registrul de adrese PA, iar valoarea mărită cu 1 este introdusă în contorul de program.

EI – activare întrerupere. Această comandă este plasată la începutul secțiunii de program în care întreruperea este activată. Cu această comandă, declanșatorul de activare a întreruperii din unitatea de control MP este setat la starea 1.

DI – dezactivare întrerupere. Această comandă este plasată la sfârșitul secțiunii de program în care a fost activată întreruperea și resetează declanșatorul la starea 0.

NOP este o comandă „vide”. Omite 4 măsuri. Doar PC-ul se schimba.

HLT – oprire. Determină oprirea execuției programului și intrarea în starea oprită. MP-ul este deconectat de la adresa externă și magistralele de date (adică, tampoanele lor intră în starea Z). Ieșirea WAIT (în așteptare) este setată la nivelul 1. Această stare poate fi întreruptă de semnalele de pornire MP sau prin plasarea ei în starea de întrerupere.

ÎNTREBĂRI DE AUTOTESTARE

1. Ce dispozitive sunt necesare pentru a crea un microcomputer simplu?

2. Enumerați 5 opțiuni pentru structurile de microcalculatoare.

3. Utilizarea unei interfețe intermediare.

4. Ce include conceptul de „controller PU”?

5. Enumerați caracteristicile procesorului I8080.

6. Registre de date. Scopul lor.

7. Semnează registre. Ce atribute sunt stocate în aceste registre?

8. Descrieți principiul schimbului de date bidirecțional între SD intern și extern.

9. Ce registre poate folosi un programator?

10. Dați o diagramă bloc a unui microcomputer bazat pe MP KR580VM80.

11. Din ce cicluri constă un ciclu de mașină?

12. Listați formatele de date ale MP KR580VM80.

13. Listați formatele de comandă ale MP KR580VM80.

14. Ce metode de adresare sunt folosite în MP KR580VM80?

15. În ce grupuri pot fi împărțite echipele MP KR580VM80?

16. Transferuri pe un singur octet. Dați exemple de comenzi din acest grup.

17. Transferuri pe dublu octet. Dați exemple de comenzi din acest grup.

18. Ce operațiuni cu baterie cunoașteți?

19. Operatii in lei si memorie. Ce operațiuni includ ele?

20. Listați comenzile de control.

SARCINI DE CONTROL

1. Fișele de răspuns trebuie să indice numărul grupului, numele de familie al elevului și numărul opțiunii acestuia.

2. Numerele întrebărilor sunt selectate de elev în conformitate cu ultimele sale două cifre din carnetul de note. În tabelul 6.1, n-1 este penultima cifră a numărului, iar n este ultima cifră. Celulele tabelului conțin numărul de întrebări la care trebuie dat un răspuns scris.

Numerele de întrebare Tabelul 6.1

a n a n-1
1,5,9, 13,16 2,6,10,14,17 3,7,11,15,18 4,8,12,13,19 1,9,11,14,20 2,10,12,15,18 3,5,8, 13,17 4,6,7, 14,19 1,8,10,13,17 2,5,7, 14,18
3,6,8, 15,19 4,7,9, 13,16 1,5,12,14,20 2,6,11,15,16 3,7,10,13,17 4,8,9, 14,18 1,7,12,13,18 2,8,10,14,19 3,5,11,15,20 4,6,9, 13,17
2,7,9, 13,20 1,8,11,15,19 4,5,10,15,17 3,6,12,14,16 1,5,9, 13,16 2,6,10,14,17 3,7,11,15,18 4,8,12,13,19 1,9,11,14,20 2,10,12,15,18
3,5,8, 13,17 4,6,7, 14,19 1,8,10,13,17 2,5,7, 14,18 3,6,8, 15,19 4,7,9, 13,16 1,5,12,14,20 2,6,11,15,16 3,7,10,13,17 4,8,9, 14,18
1,7,12,13,18 2,8,10,14,19 3,5,11,15,20 4,6,9, 13,17 2,7,9, 13,20 1,8,11,15,19 4,5,10,15,17 3,6,12,14,16 1,5,9, 13,16 2,6,10,14,17
3,7,11,15,18 4,8,12,13,19 1,9,11,14,20 2,10,12,15,18 3,5,8, 13,17 4,6,7, 14,19 1,8,10,13,17 2,5,7, 14,18 3,6,8, 15,19 4,7,9, 13,16
1,5,12,14,20 2,6,11,15,16 3,7,10,13,17 4,8,9, 14,18 1,7,12,13,18 2,8,10,14,19 3,5,11,15,20 4,6,9, 13,17 2,7,9, 13,20 1,8,11,15,19
4,5,10,15,17 3,6,12,14,16 1,5,9, 13,16 2,6,10,14,17 3,7,11,15,18 4,8,12,13,19 1,9,11,14,20 2,10,12,15,18 3,5,8, 13,17 4,6,7, 14,19
1,8,10,13,17 2,5,7, 14,18 3,6,8, 15,19 4,7,9, 13,16 1,5,12,14,20 2,6,11,15,16 3,7,10,13,17 4,8,9, 14,18 1,7,12,13,18 2,8,10,14,19
3,5,11,15,20 4,6,9, 13,17 2,7,9, 13,20 1,8,11,15,19 4,5,10,15,17 3,6,12,14,16 1,5,9, 13,16 2,6,10,14,17 3,7,11,15,18 4,8,12,13,19

Operația de tranziție necondiționată (BP) se referă la operațiunile de transfer necondiționat al controlului și constă în următoarele. La începutul operațiunii, conținutul CC, indicând comanda care urmează BP (adresa de retur), este trimis către P1 AU dacă programul prevede o retur; aceasta vă permite să salvați adresa de retur prin transferarea în continuare a conținutului P1 (de exemplu, prin operarea 3G) în memorie. Pentru a face acest lucru, primele comenzi ale secțiunii de program la care se face tranziția trebuie să conțină o operație corespunzătoare. În următoarea etapă a operațiunii, conținutul de 1-14 biți, care este adresa de tranziție, este citit din celula RAM sau ROM cu adresa specificată în comanda BP din SchK. La această adresă se face apoi o cerere către ROM pentru comanda către care se face trecerea.

Funcționare în schimburi

În formatul de schimbare (FSD), operațiile „Deplasare aritmetică la dreapta (stânga)” și „Deplasare logică la dreapta (stânga)” sunt codificate. Când sunt executate, se efectuează acțiuni asupra numărului situat în AC. Sunt specificate atributele din comandă: direcția schimbului (5 r), tipurile de schimburi (8,9 r) și numărul acestora (1-4 r). În timpul operației, biții registrului P2 sunt deplasați, rezultatul este înregistrat în registrele P2 și РСм, iar deplasarea la dreapta este efectuată cu 3 biți în același timp, deplasarea la stânga este de 1 bit. Valoarea celui de-al 5-lea bit egală cu „1” determină deplasarea la stânga, egală cu „0” - la dreapta.

Operațiunile sunt ciclice. Numărul de cicluri de schimbare este numărat de contorul de cicluri (CC). Înainte de a executa partea ciclică a operației, conținutul a 1-5 biți ai comenzii care conține o constantă și un semn de deplasare este trimis în centru. Apoi, conținutul P2 este trimis către RSM. Deplasarea în sine este efectuată datorită copierii „oblice” a conținutului registrelor P2 și Pcm în P2’ și, respectiv, Pcm’. Apoi rezultatul trecerii de la PCm' și P2' la SM1 și SM2 este rescris în P2 și PSM. Finalizarea operației este indicată de valoarea lui SchT =0.

În funcție de tipul de deplasare (L sau A), fie toți cei 16 biți (L), fie doar 15 biți (mantișă) fără semn (A) sunt deplasați. Când A se deplasează la dreapta, biții de ordin înalt eliberați sunt umpluți cu un semn, iar când se deplasează la stânga, biții de ordin inferior eliberați sunt umpluți cu zerouri. În timpul unei deplasări logice la dreapta sau la stânga, biții eliberați sunt umpluți cu zerouri.

De asemenea, puteți modifica constant constanta de schimbare.

32 Interacțiunea nodurilor și elementelor diagramei bloc a procesorului CB la efectuarea operațiilor de salt condiționat.

Operații de sărituri condiționate



Execuția operației începe cu verificarea fezabilității condiției de tranziție prin compararea valorii atributului rezultat al operației anterioare cu codul „mască” din comandă. Dacă condiția este îndeplinită, atunci are loc tranziția la execuția comenzii, a cărei adresă se află în partea operand-adresă a formatului PFU. Dacă condiția de tranziție nu este îndeplinită, atunci comanda care urmează comenzii „Salt condiționat” din program este executată.

Comanda „Conditional Jump” (JJ) ocupă două celule ROM adiacente. Prima celulă conține comanda, a doua celulă conține adresa de salt. Un salt condiționat este determinat de o combinație în cei 7-9 biți ai comenzii, condiția pentru plasarea adresei de retur este determinată de al 6-lea bit.

Când condiția este îndeplinită, adresa de tranziție este introdusă în contorul programului, prin urmare codul comenzii următoare va fi citit din celula cu această adresă. Adresa de retur se introduce in P1 daca al 6-lea bit este egal cu 0 si in Pcm daca valoarea acestui bit este egala cu unu.

Dacă condiția de tranziție nu este îndeplinită, următoarea instrucțiune este selectată din celula cu codul de adresă i+2. În acest caz, codul specificat (adresa de retur) este introdus în P1 indiferent de valoarea celui de-al 6-lea bit al comenzii. Acesta din urmă este determinat de algoritmul de operare al procesorului SV la descifrarea codului de operare UE.

Introducerea adresei de retur pe PCM se datorează faptului că ieșirea către magistrala de cod de la AC are doar registrul specificat.

O particularitate a executării operației NC este că dacă există codul 111 sau 000 în biții „mască” ai comenzii, tranziția condiționată degenerează într-una necondiționată sau, respectiv, într-o operație de trimitere către registrele de bază. În aceste cazuri, adresele de salt sau adresa de trimitere către registrele de bază sunt conținutul părții adresa-operand a instrucțiunii (AOC).

La efectuarea operațiunii de trimitere către BR, conținutul AOC este trimis la unul sau mai multe BR-uri deodată, în funcție de conținutul celor 15-17 biți ai comenzii. Adresa de retur în acest caz nu este trimisă către P1 și RSM.



Executarea unei operații NC ca operație TCU poate fi utilizată în întreruperi pentru a trece la programele de întrerupere. Pentru a face acest lucru, în al 5-lea bit al comenzii, este setat atributul unei tranziții programate (PNT). În acest caz, comanda este citită în procesor din ROM printr-un semnal de întrerupere (ISR). În acest caz, adresa de acces ROM (adresa de întrerupere) este generată de circuitul de întrerupere a procesorului.

O particularitate a operațiunii în acest caz este că adresa de retur pentru întreruperi nu este adresa comenzii care urmează comenzii în format FUP, ci adresa comenzii înaintea căreia a avut loc întreruperea. Semnalul NPP este procesat după cum urmează. Pe baza acestui semnal, circuitul de întrerupere al procesorului generează o adresă de întrerupere (APr), egală cu adresa primei celule a instrucțiunii de salt în formatul FUP(i). Această adresă este transferată în memorie prin comutator și registrul de adrese ROM. Adresele de întrerupere sunt selectate în așa fel încât adresa primei celule a comenzii (i) să fie pară, iar adresa celei de-a doua celule (i+1) să fie impară. A doua adresă se obține prin schimbarea (în hardware) a cifrei cel mai puțin semnificative fără participarea CC de la zero la unu. În procesul de citire a unei comenzi din ROM și de executare a acesteia, conținutul SchK (K+1) este stocat în registrul P1 al AC, iar conținutul celei de-a doua celule a comenzii (i+1), care este adresa trecerii la comanda cu adresa j, sunt introduse în SchK. Se face o cerere către ROM cu privire la noul conținut al CC. Astfel, adresa următoarei instrucțiuni la momentul întreruperii (K+1) este stocată în registrul P1. După ce întreruperea a fost procesată, această adresă este utilizată pentru a reveni la programul întrerupt.

33 Interacțiunea nodurilor și elementelor diagramei bloc a procesorului SV la efectuarea operațiunilor de control al procesorului și sistemului.