Transizioni incondizionate. Nozioni di base sulla programmazione dei dispositivi MP (lezione frontale) Comandi di trasferimento del controllo

  • 10.01.2024

Oltre ai mezzi per i calcoli aritmetici, il sistema di istruzioni del microprocessore dispone anche di mezzi per la conversione logica dei dati. Per logico intendiamo tali trasformazioni di dati, su cui si basano regole della logica formale.

La logica formale funziona a livello di affermazioni vere e false. Per un microprocessore, questo di solito significa rispettivamente 1 e 0. Il computer è nativo del linguaggio degli zeri e degli uno, ma la più piccola unità di dati su cui operano le istruzioni della macchina è il byte. Tuttavia, a livello di sistema, è spesso necessario essere in grado di operare a un livello estremamente basso: il livello di bit.

Riso. 29. Strumenti logici di elaborazione dei dati


I mezzi di trasformazione logica dei dati includono comandi logici e operazioni logiche. L'operando di un'istruzione assembler può generalmente essere un'espressione, che a sua volta è una combinazione di operatori e operandi. Tra questi operatori possono esserci anche operatori che implementano operazioni logiche sugli oggetti espressione.

Prima di esaminare questi strumenti in dettaglio, consideriamo quali sono i dati logici stessi e quali operazioni vengono eseguite su di essi.

Dati logici

La base teorica per l'elaborazione logica dei dati è logica formale. Esistono diversi sistemi logici. Uno dei più famosi è calcolo proposizionale. Un'affermazione è qualsiasi affermazione che può essere detta a entrambi VERO, O falso.

Il calcolo proposizionale è un insieme di regole utilizzate per determinare la verità o la falsità di alcune combinazioni di affermazioni.

Il calcolo proposizionale è combinato in modo molto armonioso con i principi del funzionamento del computer e i metodi di base per programmarlo. Tutti i componenti hardware del computer sono costruiti su chip logici. Il sistema per rappresentare le informazioni in un computer al livello più basso si basa sul concetto di bit. Un bit, avendo solo due stati (0 (falso) e 1 (vero)), si inserisce naturalmente nel calcolo proposizionale.

Secondo la teoria, sulle istruzioni (sui bit) possono essere eseguite le seguenti operazioni logiche.


1. Negazione (logica NON) - un'operazione logica su un operando il cui risultato è l'inverso dell'operando originale.

Tale operazione è caratterizzata univocamente dalla seguente tavola di verità (Tabella 12).

Tabella 12. Tabella di verità per la negazione logica

2. Aggiunta logica (logica inclusiva O) - un'operazione logica su due operandi il cui risultato è vero (1) se uno o entrambi gli operandi sono veri (1) e falso (0) se entrambi gli operandi sono falsi (0).

Questa operazione è descritta utilizzando la seguente tavola di verità (Tabella 13).

Tabella 13. Tabella della verità per l'OR logico inclusivo

3. Moltiplicazione logica (logica E) - un'operazione logica su due operandi che restituisce vero (1) solo se entrambi gli operandi restituiscono vero (1). In tutti gli altri casi, il valore dell'operazione è falso (0).

Questa operazione è descritta utilizzando la seguente tavola di verità (Tabella 14).

Tabella 14. Tabella della verità per AND logico

4. Aggiunta logica esclusiva (esclusiva logica O) - un'operazione logica su due operandi il cui risultato è vero (1) se solo uno dei due operandi è vero (1), e falso (0) se entrambi gli operandi sono falsi (0) o "verità" (1). Questa operazione è descritta utilizzando la seguente tavola di verità (Tabella 15).

Tabella 15. Tabella della verità per l'OR logico esclusivo

Il sistema di istruzioni del microprocessore contiene cinque istruzioni che supportano queste operazioni. Queste istruzioni eseguono operazioni logiche sui bit degli operandi. Le dimensioni degli operandi, naturalmente, devono essere le stesse. Ad esempio, se la dimensione degli operandi è una parola (16 bit), l'operazione logica viene eseguita prima sui bit zero degli operandi e il suo risultato viene scritto al posto del bit 0 del risultato. Quindi il comando ripete in sequenza queste azioni su tutti i bit dal primo al quindicesimo.

Comandi logici

Il sistema di istruzioni del microprocessore dispone del seguente set di comandi che supportano l'utilizzo di dati logici:

1) e operando_1, operando_2 – operazione di moltiplicazione logica. Il comando esegue un'operazione AND logica bit per bit (congiunzione) sui bit degli operandi operando_1 e operando_2. Il risultato viene scritto in operando_1;

2) og operando_1, operando_2 – operazione di addizione logica. Il comando esegue un'operazione OR logico bit per bit (disgiunzione) sui bit degli operandi operando_1 e operando_2. Il risultato viene scritto in operando_1;

3) hog operando_1, operando_2 – operazione di addizione logica esclusiva. L'istruzione esegue un'operazione OR esclusivo logico bit per bit sui bit degli operandi operando_1 e operando_2. Il risultato viene scritto al posto dell'operando;

4) test operando_1, operando_2 – operazione di “controllo” (usando la moltiplicazione logica). Il comando esegue un'operazione AND logica bit per bit sui bit degli operandi operando_1 e operando_2. Lo stato degli operandi rimane lo stesso, cambiano solo i flag zf, sf e pf, il che rende possibile analizzare lo stato dei singoli bit dell'operando senza modificarne lo stato;

5) non operando – operazione di negazione logica. Il comando esegue un'inversione bit a bit (sostituendo il valore con quello opposto) di ciascun bit dell'operando. Il risultato viene scritto al posto dell'operando.

Per comprendere il ruolo delle istruzioni logiche nel sistema di istruzioni del microprocessore, è molto importante comprendere l'ambito della loro applicazione e le tecniche tipiche per utilizzarle nella programmazione.

Utilizzando i comandi logici è possibile allocazione singoli bit nell'operando allo scopo di impostazione, ripristino, inversione o semplicemente controllo di un determinato valore.

Per organizzare questo lavoro con i bit, operando_2 solitamente svolge il ruolo di maschera. Utilizzando i bit impostati nel bit 1 di questa maschera, vengono determinati i bit operando_1 necessari per un'operazione specifica. Mostriamo quali comandi logici possono essere utilizzati a questo scopo:

1) per impostare alcuni bit a 1, utilizzare il comando og operand_1, operand_2.

In questa istruzione, operando_2, che funge da maschera, deve contenere un bit al posto dei bit che dovrebbero essere impostati a 1 in operando_1;

2) per resettare alcuni bit a 0, utilizzare il comando and operando_1, operando_2.

In questa istruzione, operando_2, che funge da maschera, deve contenere bit zero al posto di quei bit che dovrebbero essere impostati a 0 in operando_1;

3) viene applicato il comando hog operand_1, operand_2:

a) per scoprire quali bit in operando_1 e operando sono diversi;

b) per invertire lo stato dei bit specificati nell'operando_1.

Quando si esegue il comando hog, i bit della maschera che ci interessano (operando_2) devono essere uno, il resto deve essere zero;

Per verificare lo stato dei bit specificati, utilizzare il comando test operand_1, operand_2 (controlla operand_1).

I bit verificati di operando_1 nella maschera (operando_2) devono avere un valore pari a uno. Il funzionamento del comando test è simile all'algoritmo del comando e, ma non modifica il valore di operando_1. Il risultato del comando è impostare il valore del flag zero zf:

1) se zf = 0, allora la moltiplicazione logica ha dato come risultato zero, cioè un bit unitario della maschera, che non corrispondeva al corrispondente bit dell'operando;

2) se zf = 1, allora la moltiplicazione logica ha prodotto un risultato diverso da zero, cioè almeno una il bit della maschera corrisponde al bit corrispondente di operando_1.

Per reagire al risultato del comando di test è consigliabile utilizzare il comando di salto jnz label (Jump if Not Zero) - salta se il flag di zero zf è diverso da zero, oppure un comando con azione opposta - jz label (Jump se Zero) - salta se il flag zero zf = 0.

I due comandi successivi cercano il primo bit dell'operando impostato a 1. È possibile effettuare la ricerca dall'inizio o dalla fine dell'operando:

1) bsf operando_1, operando_2 (Scansione bit in avanti) – scansione dei bit in avanti. L'istruzione esegue la scansione dei bit di operando_2 dal meno significativo al più significativo (dal bit 0 al bit più significativo) cercando il primo bit impostato a 1. Se ne viene trovato uno, il numero di questo bit viene inserito in operando_1 come valore intero. Se tutti i bit dell'operando_2 sono 0, allora il flag zero zf viene impostato a 1, altrimenti il ​​flag zf viene reimpostato a 0;

2) bsr operand_1, operand_2 (Bit Scanning Reset) – scansione dei bit in ordine inverso. L'istruzione esamina (scansiona) i bit dell'operando_2 dal più significativo al meno significativo (dal bit più significativo al bit 0) cercando il primo bit impostato su 1. Se ne viene trovato uno, il numero di questo bit viene inserito in operando_1 come valore intero. È importante che la posizione del primo bit a sinistra venga ancora conteggiata rispetto al bit 0. Se tutti i bit dell'operando_2 sono uguali a 0, allora il flag zero zf viene impostato su 1, altrimenti il ​​flag zf viene reimpostato su 0 .

Negli ultimi modelli di microprocessori Intel, nel gruppo dei comandi logici sono comparsi molti altri comandi che consentono l'accesso a un bit specifico dell'operando. L'operando può essere posizionato in memoria o in un registro di uso generale. La posizione del bit è specificata dall'offset del bit rispetto al bit meno significativo dell'operando. Il valore di offset può essere specificato come valore diretto o contenuto in un registro di uso generale. È possibile utilizzare i risultati dei comandi bsr e bsf come valore di offset. Tutte le istruzioni assegnano il valore del bit selezionato al flag CE

1) operando bt, offset bit (test bit): controlla il bit. Il comando trasferisce il valore del bit al flag cf;

2) operando bts, offset bit (Test e impostazione bit) – controllo e impostazione del bit. L'istruzione trasferisce il valore del bit al flag CF e quindi imposta a 1 il bit da testare;

3) btr operativo, offset bit (test e ripristino bit) – controllo e ripristino del bit. L'istruzione trasferisce il valore di un bit al flag CF e poi imposta questo bit a 0;

4) operando btc, offset bit (Test bit e conversione) – controlla e inverte il bit. L'istruzione trasferisce il valore di un bit al flag cf e poi inverte il valore di quel bit.

Comandi di spostamento

Anche le istruzioni di questo gruppo consentono la manipolazione di singoli bit degli operandi, ma in modo diverso rispetto alle istruzioni logiche discusse sopra.

Tutte le istruzioni di spostamento spostano i bit nel campo dell'operando a sinistra o a destra a seconda del codice operativo. Tutte le istruzioni di spostamento hanno la stessa struttura: operando cop, shift_counter.

Numero di bit spostati – contatore_shift – si trova al posto del secondo operando e può essere specificato in due modi:

1) staticamente, che implica specificare un valore fisso utilizzando un operando immediato;

2) dinamicamente, il che significa memorizzare il valore del contatore di spostamento nel registro cl prima di eseguire l'istruzione di spostamento.

In base alla dimensione del registro cl, è chiaro che il valore del contatore degli spostamenti può variare da 0 a 255. Ma in realtà questo non è del tutto vero. Per scopi di ottimizzazione, il microprocessore accetta solo il valore cinque bit meno significativi contatore, ovvero il valore è compreso tra 0 e 31.

Tutti i comandi di spostamento impostano il flag di riporto cfr.

Quando i bit vengono spostati oltre l'operando, prima colpiscono il flag di riporto, impostandolo uguale al valore del bit successivo che finisce all'esterno dell'operando. La posizione successiva di questo bit dipende dal tipo di istruzione di spostamento e dall'algoritmo del programma.

In base al principio di funzionamento i comandi di cambio possono essere suddivisi in due tipologie:

1) comandi di spostamento lineare;

2) comandi di cambio ciclico.

Comandi di spostamento lineare

I comandi di questo tipo includono comandi che eseguono uno spostamento secondo il seguente algoritmo:

1) il successivo bit “spinto” imposta il flag CF;

2) il bit introdotto nell'operando dall'altra parte ha valore 0;

3) quando il bit successivo viene spostato, va nel flag CF e il valore del bit spostato precedente viene perso! I comandi di spostamento lineare si dividono in due sottotipi:

1) comandi di spostamento lineare logico;

2) comandi di spostamento lineare aritmetico.

I comandi di spostamento lineare logico includono quanto segue:

1) operando shl, shift_counter (Shift Logical Left) – spostamento logico a sinistra. Il contenuto dell'operando viene spostato a sinistra del numero di bit determinato dal valore shift_count. A destra (nella posizione del bit meno significativo) vengono inseriti gli zeri;

2) operando shr, shift_counter (Shift Logical Right) – spostamento logico a destra. Il contenuto dell'operando viene spostato a destra del numero di bit determinato dal valore shift_count. A sinistra (nella posizione del bit di segno più significativo) vengono inseriti gli zeri.

La Figura 30 mostra come funzionano questi comandi.

Riso. 30. Schema di funzionamento dei comandi di spostamento logico lineare


Le istruzioni di spostamento lineare aritmetico differiscono dalle istruzioni di spostamento logico in quanto operano in modo speciale sul bit di segno dell'operando.

1) operando sal, shift_counter (Shift Arithmetic Left) – spostamento aritmetico a sinistra. Il contenuto dell'operando viene spostato a sinistra del numero di bit determinato dal valore shift_count. A destra (nella posizione del bit meno significativo) ci sono gli zeri. Il comando sal non preserva il segno, ma imposta il flag con/in caso di cambio di segno un'altra punta retrattile. Per il resto, il comando sal è del tutto simile al comando shl;

2) operando sar, shift_counter (Shift Arithmetic Right) – spostamento aritmetico a destra. Il contenuto dell'operando viene spostato a destra del numero di bit determinato dal valore contatore_shift. A sinistra vengono inseriti gli zeri nell'operando. Il comando sar preserva il segno, ripristinandolo dopo aver spostato ogni bit successivo.

La Figura 31 mostra come funzionano le istruzioni di spostamento aritmetico lineare.


Riso. 31. Schema di funzionamento dei comandi di spostamento aritmetico lineare

Comandi di rotazione

I comandi di rotazione dello spostamento sono comandi che memorizzano i valori dei bit che vengono spostati. Esistono due tipi di comandi di rotazione:

1) semplici comandi di cambio ciclico;

2) comandi di spostamento ciclici tramite il carry flag cfr.

Alle squadre ciclico semplice i turni includono:

1) operando rol, shift_counter (Ruota a sinistra) – spostamento ciclico a sinistra. Il contenuto dell'operando viene spostato a sinistra del numero di bit determinato dall'operando contatore_shift. I bit spostati a sinistra vengono scritti nello stesso operando a destra;

2) operando gog, shift_counter (Ruota a destra) – spostamento ciclico a destra. Il contenuto dell'operando viene spostato a destra del numero di bit determinato dall'operando contatore_shift. I bit spostati a destra vengono scritti nello stesso operando a sinistra.

Riso. 32. Schema di funzionamento di semplici comandi di cambio ciclici


Come si può vedere dalla Figura 32, le semplici istruzioni di spostamento ciclico eseguono un'azione utile durante il loro funzionamento, vale a dire: il bit spostato ciclicamente non solo viene inserito nell'operando dall'altra estremità, ma allo stesso tempo il suo valore diventa il valore dell'operando bandiera CE

Comandi di rotazione tramite carry flag CF differiscono dai semplici comandi di scorrimento ciclico in quanto il bit che viene spostato non va immediatamente all'operando dall'altra estremità, ma viene prima scritto nel flag di riporto CE Solo la successiva esecuzione di questa istruzione di spostamento (assumendo che venga eseguita in un ciclo) fa sì che il bit precedentemente spostato venga posizionato all'altra estremità dell'operando(Fig. 33).

Ai comandi di cambio ciclico tramite carry flag sono correlati:

1) operando rcl, shift_counter (Ruota tramite riporto a sinistra) – spostamento ciclico a sinistra tramite riporto.

Il contenuto dell'operando viene spostato a sinistra del numero di bit determinato dall'operando contatore_shift. I bit spostati diventano alternativamente il valore del flag di riporto cfr.

2) operando rcg, shift_counter (Ruota tramite riporto a destra) – spostamento ciclico a destra tramite riporto.

Il contenuto dell'operando viene spostato a destra del numero di bit determinato dall'operando contatore_shift. I bit spostati diventano alternativamente il valore del flag di riporto CF.

Riso. 33. Comandi di cambio ciclici tramite carry flag CF


Dalla Figura 33 è chiaro che quando si passa attraverso il carry flag appare un elemento intermedio, con l'aiuto del quale, in particolare, è possibile sostituire i bit spostati ciclicamente, in particolare mancata corrispondenza sequenze di bit.

Per disadattamento di una sequenza di bit di seguito intendiamo un'azione che ci consente in qualche modo di localizzare ed estrarre le sezioni necessarie di questa sequenza e scriverle in un'altra posizione.

Comandi di cambio aggiuntivi

Il sistema di comando degli ultimi modelli di microprocessori Intel, a partire dall'i80386, contiene comandi di spostamento aggiuntivi che espandono le capacità di cui abbiamo discusso in precedenza. Questi sono i comandi di spostamento doppia precisione: 1) shld operand_1, operand_2, shift_counter – spostamento a sinistra a doppia precisione. Il comando shld esegue una sostituzione spostando i bit di operando_1 a sinistra, riempiendo i suoi bit di destra con i valori dei bit spostati da operando_2 secondo lo schema di Fig. 34. Il numero di bit da spostare è determinato dal valore contatore_shift, operando_2 non cambia.


Riso. 34. Schema del comando shld


2) shrd operand_1, operand_2, shift_counter – spostamento a destra a doppia precisione. L'istruzione esegue la sostituzione spostando i bit di operando_1 a destra, riempiendo i suoi bit di sinistra con i valori dei bit spostati da operando_2 secondo lo schema di Figura 35. Il numero di bit spostati è determinato dal valore contatore_shift, che può essere compreso tra 0 e 31. Questo valore può essere specificato come operando immediato o contenuto nel registro cl. Senso operando_2 non cambia.

Riso. 35. Schema del comando shrd


Come abbiamo notato, i comandi shld e shrd eseguono spostamenti fino a 32 bit, ma a causa delle peculiarità della specifica degli operandi e dell'algoritmo operativo, questi comandi possono essere utilizzati per lavorare con campi fino a 64 bit di lunghezza.

2. Comandi di trasferimento controllo

Abbiamo conosciuto alcune delle squadre che la compongono lineare sezioni del programma. Ciascuno di essi generalmente esegue alcune azioni di conversione o trasferimento di dati, dopodiché il microprocessore trasferisce il controllo al comando successivo. Ma pochissimi programmi funzionano in modo così coerente. Di solito ci sono punti in un programma in cui è necessario decidere quale comando verrà eseguito successivamente. Questa soluzione potrebbe essere:

1) incondizionato - a questo punto è necessario trasferire il controllo non al comando successivo, ma a un altro, che si trova a una certa distanza dal comando attuale;

2) condizionale – la decisione su quale comando verrà eseguito successivamente viene presa in base all'analisi di alcune condizioni o dati.

Un programma è una sequenza di comandi e dati che occupano una certa quantità di spazio RAM. Questo spazio di memoria può essere contiguo o costituito da più frammenti.

Il microprocessore sa quale istruzione del programma deve essere eseguita successivamente dal contenuto di una coppia di registri cs:(e)ip:

1) cs – registro del codice del segmento, che contiene l'indirizzo fisico (base) del segmento del codice corrente;

2) eip/ip – registro del puntatore dell'istruzione, che contiene un valore che rappresenta l'offset di memoria della successiva istruzione da eseguire rispetto all'inizio del segmento di codice corrente.

Il registro specifico che verrà utilizzato dipende da se la modalità di indirizzamento è impostata su use16 o use32. Se viene specificato use 16, verrà utilizzato ip, se use32 verrà utilizzato eip.

Pertanto, le istruzioni di trasferimento del controllo modificano il contenuto dei registri cs e eip/ip, in conseguenza dei quali il microprocessore seleziona per l'esecuzione non il comando di programma successivo in ordine, ma un comando in qualche altra sezione del programma. Il trasportatore all'interno del microprocessore viene ripristinato.

In base al principio di funzionamento, i comandi del microprocessore che garantiscono l'organizzazione delle transizioni nel programma possono essere suddivisi in 3 gruppi:

1. Comandi per il trasferimento incondizionato del controllo:

1) comando di salto incondizionato;

2) comando per chiamare una procedura e ritornare da una procedura;

3) comando per richiamare gli interrupt software e ritornare dagli interrupt software.

2. Trasferimento condizionato dei comandi di controllo:

1) comandi di salto in base al risultato del comando di confronto delle pagine;

2) comandi di transizione basati sullo stato di un determinato flag;

3) comandi per navigare all'interno del contenuto del registro ecx/cx.

3. Comandi di controllo del ciclo:

1) comando per organizzare un ciclo con un contatore ecx/cx;

2) un comando per organizzare un ciclo con un contatore ecx/cx con possibilità di uscita anticipata dal ciclo sotto una condizione aggiuntiva.

Salti incondizionati

La discussione precedente ha rivelato alcuni dettagli del meccanismo di transizione. Le istruzioni di salto modificano il registro del puntatore dell'istruzione eip/ip ed eventualmente il registro del segmento di codice cs. Ciò che deve essere modificato esattamente dipende da:

1) dal tipo di operando nel comando di salto incondizionato (vicino o lontano);

2) dall'indicazione prima dell'indirizzo di salto (nel comando di salto) modificatore; in questo caso l'indirizzo di salto stesso può trovarsi o direttamente nel comando (salto diretto), oppure in un registro o cella di memoria (salto indiretto).

Modificatore può assumere i seguenti valori:

1) vicino ptr – transizione diretta a un'etichetta all'interno del segmento di codice corrente. Viene modificato solo il registro eip/ip (a seconda del tipo specificato di segmento di codice use16 o use32) in base all'indirizzo (etichetta) specificato nel comando o in un'espressione utilizzando il carattere di estrazione del valore - $;

2) far ptr – transizione diretta a un'etichetta in un altro segmento di codice. L'indirizzo di salto è specificato come operando o indirizzo (etichetta) immediato e consiste in un selettore a 16 bit e un offset a 16/32 bit, che vengono caricati rispettivamente nei registri cs e ip/eip;

3) parola ptr – transizione indiretta a un'etichetta all'interno del segmento di codice corrente. Viene modificato solo eip/ip (mediante il valore di offset dalla memoria all'indirizzo specificato nel comando o dal registro). Dimensione offset 16 o 32 bit;

4) dword ptr – transizione indiretta a un'etichetta in un altro segmento di codice. Entrambi i registri – cs ed eip/ip – vengono modificati (da un valore dalla memoria - e solo dalla memoria, da un registro). La prima word/dword di questo indirizzo rappresenta l'offset e viene caricata in ip/eip; la seconda/terza parola viene caricata in cs. comando di salto incondizionato jmp

La sintassi del comando di salto incondizionato è jmp [modificatore] indirizzo_salto - un salto incondizionato senza memorizzare informazioni sul punto di ritorno.

Il jump_address è un indirizzo di etichetta o l'indirizzo dell'area di memoria in cui si trova il puntatore di salto.

In totale, il sistema di istruzioni del microprocessore contiene diversi codici di istruzione della macchina per il salto incondizionato jmp.

Le loro differenze sono determinate dalla distanza di transizione e dal metodo di specificazione dell'indirizzo di destinazione. Allineare la transizione è determinata dalla posizione dell'operando indirizzo_transizione. Questo indirizzo potrebbe trovarsi nel segmento di codice corrente o in qualche altro segmento. Nel primo caso, viene chiamata la transizione intrasegmentale, O i propri cari, nel secondo - intersegmentale, O distante Un salto intrasegmento presuppone che venga modificato solo il contenuto del registro eip/ip.

Sono disponibili tre opzioni per l'utilizzo all'interno del segmento del comando jmp:

1) dritto corto;

2) dritto;

3) indiretto.


Procedure

Il linguaggio assembly dispone di diversi strumenti che risolvono il problema della duplicazione di sezioni del codice del programma. Questi includono:

1) meccanismo delle procedure;

2) macroassemblatore;

3) meccanismo di interruzione.

La procedura, spesso chiamata sottoprogramma - questa è l'unità funzionale di base della decomposizione (divisione in più parti) di un compito. Una procedura è un gruppo di comandi per risolvere una sottoattività specifica e ha i mezzi per ottenere il controllo dal punto in cui si richiama un'attività di livello superiore e si restituisce il controllo a questo punto.

Nel caso più semplice, un programma può consistere in una procedura. In altre parole, una procedura può essere definita come un insieme di comandi correttamente formattati che, una volta descritti, possono essere richiamati, se necessario, in qualsiasi punto del programma.

Per descrivere una sequenza di comandi come una procedura, il linguaggio assembly utilizza due direttive: PROC e ENDP.

La sintassi per descrivere la procedura è la seguente (Fig. 36).


Riso. 36. Sintassi per descrivere una procedura in un programma


Dalla Figura 36 si può vedere che nell'intestazione della procedura (direttiva PROC) è richiesto solo il nome della procedura. Tra il gran numero di operandi della direttiva PROC, [distanza] merita una menzione speciale. Questo attributo può assumere valori vicini o lontani e caratterizza la possibilità di richiamare una procedura da un altro segmento di codice. Per impostazione predefinita, l'attributo [distanza] è impostato su vicino.

La procedura può essere posizionata ovunque nel programma, ma in modo tale che il controllo non ricada accidentalmente su di essa. Se una procedura viene semplicemente inserita nel flusso di comandi generale, il microprocessore percepirà i comandi della procedura come parte di questo flusso e, di conseguenza, eseguirà i comandi della procedura.

Salti condizionali

Il microprocessore ha 18 istruzioni di salto condizionale. Questi comandi ti permettono di verificare:

1) il rapporto tra operandi con segno (“più – meno”);

2) la relazione tra operandi senza segno (“sopra – sotto”);

3) stati dei flag aritmetici ZF, SF, CF, OF, PF (ma non AF).

I comandi di salto condizionale hanno la stessa sintassi:

etichetta_transizione jcc

Come puoi vedere, il codice mnemonico di tutti i comandi inizia con "j" - dalla parola salto(rimbalzo), suo - definisce la condizione specifica analizzata dal comando.

Per quanto riguarda l'operando etichetta_transizione, allora questa etichetta può essere posizionata solo all'interno del segmento di codice corrente; il trasferimento del controllo tra segmenti nelle transizioni condizionali non è consentito. A questo proposito scompare la questione del modificatore, che era presente nella sintassi dei comandi di salto incondizionato. Nei primi modelli di microprocessore (i8086, i80186 e i80286), le istruzioni di salto condizionato potevano eseguire solo salti brevi, una distanza compresa tra -128 e +127 byte dall'istruzione successiva all'istruzione di salto condizionale. A partire dal modello di microprocessore 80386, questa limitazione viene rimossa, ma, come puoi vedere, solo all'interno del segmento di codice corrente.

Per poter decidere dove trasferire il controllo con un comando di salto condizionato, deve prima essere generata una condizione sulla base della quale verrà presa la decisione di trasferire il controllo.

Le fonti di tale condizione possono essere:

1) qualsiasi comando che modifica lo stato dei flag aritmetici;

2) la pagina dei comandi di confronto, che confronta i valori di due operandi;

3) stato del registro ecx/cx.


comando di confronto cmp

Il comando confronta pagina ha un principio di funzionamento interessante. È assolutamente identico al comando di sottrazione: sub operando, operando_2.

Il comando page, come il comando sub, sottrae operandi e imposta flag. L'unica cosa che non fa è scrivere il risultato della sottrazione al posto del primo operando.

La sintassi del comando page è page operando_1, operando_2 (confronta) – confronta due operandi e imposta flag in base ai risultati del confronto.

I flag impostati dal comando page possono essere analizzati utilizzando speciali comandi di ramo condizionale. Prima di esaminarli, prestiamo un po' di attenzione ai mnemonici di questi comandi di salto condizionale (Tabella 16). Comprendere la notazione durante la formazione dei nomi dei comandi di salto condizionali (l'elemento nel nome del comando jcc, da noi designato) ne renderà più semplice la memorizzazione e l'ulteriore utilizzo pratico.

Tabella 16. Significato delle abbreviazioni nel nome del comando jcc
Tabella 17. Elenco dei comandi di salto condizionale per la pagina comandi operando_1, operando_2

Non stupitevi del fatto che gli stessi valori di flag corrispondano a diversi codici mnemonici di comandi di salto condizionato (sono separati tra loro da una barra nella Tabella 17). La differenza nel nome è dovuta al desiderio dei progettisti di microprocessori di rendere più semplice l'uso delle istruzioni di salto condizionato in combinazione con determinati gruppi di istruzioni. Pertanto, nomi diversi riflettono piuttosto orientamenti funzionali diversi. Tuttavia, il fatto che questi comandi rispondano agli stessi flag li rende assolutamente equivalenti e uguali nel programma. Pertanto, nella Tabella 17 sono raggruppati non per nome, ma per i valori di flag (condizioni) a cui reagiscono.


Istruzioni e flag di salto condizionale

La notazione mnemonica per alcuni comandi di salto condizionato riflette il nome del flag su cui operano, ed ha la seguente struttura: il carattere "j" viene prima. (Salto, transizione), il secondo è la designazione del flag oppure il simbolo di negazione “n”, seguito dal nome del flag. Questa struttura del team riflette il suo scopo. Se non è presente il carattere “n” viene controllato lo stato del flag; se è uguale a 1 si passa all'etichetta di salto. Se è presente il carattere "n", viene verificato lo stato del flag per l'uguaglianza 0 e, in caso di successo, viene effettuato un salto all'etichetta di salto.

I codici mnemonici dei comandi, i nomi dei flag e le condizioni di transizione sono forniti nella Tabella 18. Questi comandi possono essere utilizzati dopo qualsiasi comando che modifica i flag specificati.

Tabella 18. Comandi e flag di salto condizionale

Se osservi attentamente le Tabelle 17 e 18, puoi vedere che molti dei comandi di salto condizionale in esse contenuti sono equivalenti, poiché entrambi si basano sull'analisi degli stessi flag.


Istruzioni di salto condizionale e registro ecx/cx

L'architettura del microprocessore prevede l'uso specifico di molti registri. Ad esempio, il registro EAX/AX/AL viene utilizzato come accumulatore e i registri BP e SP vengono utilizzati per lavorare con lo stack. Il registro ESH/CX ha anche uno scopo funzionale specifico: svolge il ruolo contatore nei comandi di controllo del loop e quando si lavora con stringhe di caratteri. È possibile che dal punto di vista funzionale il comando di salto condizionale associato al registro ecx/cx venga classificato più correttamente come questo gruppo di comandi.

La sintassi per questo comando di ramo condizionale è:

1) jcxz jump_label (Salta se ex è Zero) – salta se cx è zero;

2) jecxz jump_label (Jump Equal exx Zero) – salta se exx è zero.

Questi comandi sono molto comodi da usare quando si organizza un ciclo e quando si lavora con stringhe di caratteri.

Va notato che esiste una limitazione inerente al comando jcxz/jecxz. A differenza di altre istruzioni di trasferimento di controllo condizionale, l'istruzione jcxz/jecxz può indirizzare solo salti brevi - a -128 byte o +127 byte dall'istruzione successiva.

Cicli organizzativi

Il ciclo, come sapete, è un'importante struttura algoritmica, senza il cui utilizzo, probabilmente, nessun singolo programma può fare. È possibile organizzare l'esecuzione ciclica di una determinata sezione del programma, ad esempio utilizzando comandi di trasferimento condizionati o il comando di salto incondizionato jmp. Con questo tipo di organizzazione del ciclo, tutte le operazioni relative alla sua organizzazione vengono eseguite manualmente. Ma, data l'importanza di un elemento algoritmico come un ciclo, gli sviluppatori del microprocessore hanno introdotto nel sistema di comando un gruppo di tre comandi per facilitare la programmazione dei cicli. Questi comandi utilizzano anche il registro ecx/cx as contatore dei cicli.

Diamo una breve descrizione di questi comandi: 1) loop jump_label (Loop) – ripete il ciclo. Il comando permette di organizzare cicli simili ai cicli for nei linguaggi di alto livello con decremento automatico del contatore dei cicli. Il compito del team è quello di fare quanto segue:

b) confrontare il registro ESX/CX con zero: se (ECX/CX) = 0, allora il controllo viene trasferito al comando successivo dopo il loop;

2) loope/loopz etichetta_transizione

I comandi loope e loopz sono sinonimi assoluti. Il lavoro dei comandi è quello di eseguire le seguenti azioni:

a) decremento del registro ESH/CX;

c) analisi dello stato del flag zero ZF se (ECX/CX) = 0 o XF = 0, il controllo viene trasferito al comando successivo dopo il loop.

3) etichetta_transizione loopne/loopnz

Anche i comandi loopne e loopnz sono sinonimi assoluti. Il lavoro dei comandi è quello di eseguire le seguenti azioni:

a) decremento del registro ESH/CX;

b) confrontare il registro ESX/CX con zero;

c) analisi dello stato del flag di zero ZF: se (ECX/CX) = 0 o ZF = 1, il controllo viene trasferito al comando successivo dopo il loop.

I comandi loope/loopz e loopne/loopnz hanno un principio di funzionamento inverso. Estendono l'azione del comando loop analizzando ulteriormente il flag zf, che consente di organizzare un'uscita anticipata dal loop, utilizzando questo flag come indicatore.

Lo svantaggio dei comandi loop, loope/loopz e loopne/loopnz è che implementano solo salti brevi (da -128 a +127 byte). Per lavorare con cicli lunghi, dovrai utilizzare i comandi di ramo condizionale e il comando jmp, quindi prova a padroneggiare entrambi i metodi di organizzazione dei cicli.

Nozioni di base sulla programmazione dei dispositivi MP (lezione)

PIANO DELLE LEZIONI

1. Classificazione dei comandi del microprocessore

2.Tipologie di indirizzamento

3. Struttura e formati dei comandi di MP KR580VM80

1. Classificazione dei comandi del microprocessore

Come già notato, il vantaggio fondamentale di MP è la programmabilità. Ciò significa che applicando comandi all'ingresso MP è possibile garantire la sequenza di operazioni desiderata, ovvero implementazione di un algoritmo specifico. L'algoritmo del problema da risolvere può essere complesso quanto desiderato, è solo necessario che questo algoritmo sia suddiviso in passaggi in conformità con il sistema di comando del parlamentare. Pertanto, il sistema di comando non è importante solo dal punto di vista di ciò che può fare il parlamentare, ma anche di come viene eseguito l’algoritmo. La presenza o l'assenza di qualsiasi comando o gruppo di comandi può influenzare in modo significativo la scelta di MP per una particolare applicazione.

La classificazione dei comandi MP è presentata nella Figura 8.

In base al numero di celle di memoria necessarie per accogliere un comando, si distinguono comandi di una, due o tre parole di lunghezza. Le istruzioni lunghe due o tre parole richiedono rispettivamente due o tre cicli di accesso alla memoria per essere recuperate.

In molti casi, in particolare quando si confrontano MP con architetture simili, è utile classificare i comandi in base alle caratteristiche architetturali dell'MP.

Dal punto di vista funzionale, i team sono divisi in tre grandi gruppi: trasmissione, gestione ed elaborazione dati. Consideriamo nel dettaglio i principali comandi utilizzati in MP, utilizzando la classificazione in base alle caratteristiche funzionali. I nomi dei comandi saranno indicati con parole russe che indicano il significato delle operazioni eseguite.

Comandi di trasferimento dati fornire il semplice conferimento delle informazioni senza eseguire alcuna operazione di trattamento. I comandi di questo gruppo sono divisi in comandi relativi all'accesso alla memoria, comandi di accesso ai registri e comandi di input/output.

I comandi relativi all'accesso alla memoria includono:

RICORDARE(WRITE), mediante il quale il contenuto del registro viene inviato alla cella di memoria.

I comandi relativi al trasferimento di un byte o di una parola devono indicare il numero di un registro specifico, l'indirizzo della cella di memoria e, se necessario, il numero del modulo di memorizzazione.

I comandi associati all'accesso ai registri devono indicare il numero della fonte dell'informazione e il numero del registro del risultato. Questo sottogruppo di comandi di trasferimento dati comprende i comandi:

SCARICA DIRETTAMENTE, in cui la costante specificata nel codice di comando viene scritta nel registro;

INOLTRARE, attraverso il quale il contenuto di un registro viene inviato ad un altro.

I comandi I/O includono:

ACCEDERE, mediante il quale il contenuto del dispositivo di input viene inviato al registro interno dell'MP;

CONCLUSIONE, in cui il contenuto del registro interno dell'MP (solitamente un accumulatore) viene inviato al dispositivo di output.

Comandi di controllo , spesso chiamati comandi di transizione, consentono di eseguire varie azioni in base al valore dei segnali esterni o alle condizioni generate all'interno del sistema. Tutti i comandi di controllo sono suddivisi in comandi di transizione incondizionati e condizionali.

I comandi di salto incondizionato includono:

SALTO INCONDIZIONATO(BP), secondo il quale il contenuto del campo indirizzo del comando BP viene scritto nel contatore del programma, cioè fornisce una transizione nel programma all'indirizzo specificato nel comando;

TRASFERIMENTO INCONDIZIONATO CON RIMBORSO(transizione a una subroutine), in base al quale i nuovi contenuti vengono scritti nel contatore del programma (l'indirizzo del primo comando della subroutine), ma a differenza del comando BP, lo stato del contatore del programma e alcuni altri registri vengono salvati in memoria . Quando una subroutine viene eseguita sul suo ultimo comando RETURN, il contenuto del contatore del programma e tutti i registri vengono ripristinati.

Le istruzioni di salto condizionato controllano lo stato di un bit di registro, di un flag flip-flop o di un altro parametro. Il risultato del controllo determina se la transizione verrà eseguita o meno. Tipicamente la transizione viene eseguita se il risultato del controllo corrisponde alla condizione specificata nel comando. Questo sottogruppo di comandi di controllo comprende:

SALTO CONDIZIONATO(UP) per indirizzo.Il codice del comando UP deve indicare la condizione da verificare, per la quale MT utilizza un valore zero o diverso da zero del risultato, un segno positivo o negativo del risultato, la presenza o assenza di riporto segnali, overflow, ecc.Quando la condizione è soddisfatta, il contenuto del contatore degli indirizzi viene scritto nel contatore del programma.Campi di comando UE, ad es. fornisce una transizione nel programma all'indirizzo specificato nel comando. Se la condizione non è soddisfatta, il controllo viene trasferito al comando successivo del programma;

TRANSIZIONE CONDIZIONATA CON RITORNO, che differisce dal comando SALTO INCONDIZIONATO CON RITORNO in quanto il passaggio alla subroutine avviene solo quando viene soddisfatta la condizione specificata.

In genere, il sistema di comando MP include numerosi altri comandi ausiliari che consentono di controllare lo stato dei registri o dei trigger che influenzano l'esecuzione di transizioni condizionali, ad esempio: SET FLAG, RESET FLAG, SET BATTERY HIGH BIT, RESET BATTERY HIGH BIT, ecc. .

Comandi di elaborazione dati si dividono in aritmetiche e logiche. Quelli aritmetici includono:

PIEGA il contenuto di due registri oppure di un registro e di una cella di memoria;

SOTTRARRE dal contenuto di una cella di memoria o di un registro; contenuto di un registro;

AUMENTARE DI 1(INCREMENTO) contenuto di una cella o registro di memoria (puntatore stack, registro indice, accumulatore);

DIMINUIRE DI 1(DECREMENTO) contenuto di una cella o registro di memoria;

AGGIUNGI CON ESEGUIRE, mediante il quale l'addizione viene eseguita tenendo conto dello stato del trigger di trasferimento. Ciò facilita l'organizzazione dell'elaborazione di grandi numeri;

SOTTRARE CONTABILE IL PRESTITO;

SPOSTARE contenuto di una cella o registro di memoria (solitamente un bit).

Il sottogruppo dei comandi logici comprende i seguenti comandi:

E(MOLTIPLICAZIONE LOGICA), mediante la quale viene effettuata l'operazione di congiunzione tra il contenuto di due registri o di una cella di memoria ed un registro;

O(SOMMA LOGICA), mediante la quale viene effettuata un'operazione di disgiunzione tra il contenuto di due registri o di una cella di memoria ed un registro;

INVALIDITÀ, che effettua un confronto bit a bit del contenuto di due registri oppure di una cella di memoria e un registro;

INVERSIONE contenuto di una cella di memoria o di un registro.

2.Tipologie di indirizzamento

Una delle caratteristiche architetturali più importanti di MP è l'elenco dei possibili metodi di accesso alla memoria o tipi di indirizzamento. Le capacità di indirizzamento di MP sono significative da due punti di vista.

Innanzitutto, una grande quantità di memoria richiede una grande lunghezza di indirizzo, poiché un indirizzo di n bit consente l'accesso alla memoria con una capacità di 2n parole. Le tipiche parole MP da 8 bit consentono l'accesso diretto a sole 256 celle di memoria, il che chiaramente non è sufficiente. Se consideriamo che l'accesso alla memoria è l'operazione più comune, allora è ovvio che l'efficienza dell'utilizzo di MP è in gran parte determinata dai metodi di indirizzamento di un grande volume di memoria con una piccola capacità di bit di MP.

In secondo luogo, per facilità di programmazione, è auspicabile disporre di un sistema semplice per generare indirizzi di dati quando si lavora con matrici, tabelle e puntatori. Diamo un'occhiata ai modi per risolvere questi problemi.

Se il campo indirizzo del comando è limitato e insufficiente per accedere direttamente a qualsiasi cella di memoria, in questi casi la memoria viene divisa in pagine, dove 2n celle di memoria sono considerate una pagina.

Per far corrispondere il campo dell'indirizzo di un comando a bit piccolo con una memoria di grande capacità (per risolvere il problema della "pagina"), nell'MP vengono utilizzati vari tipi di indirizzamento:

Indirizzamento diretto alla pagina corrente . Con questo indirizzamento, il contatore del programma è diviso in due campi; i bit di ordine superiore indicano il numero di pagina, mentre i bit di ordine inferiore indicano l'indirizzo della cella sulla pagina. Il campo dell'indirizzo del comando contiene l'indirizzo della cella sulla pagina e l'indirizzo della pagina deve essere impostato in altro modo, ad esempio utilizzando un comando speciale.

Indirizzamento diretto tramite registro di pagina. L'MP deve avere un registro di pagina accessibile a livello di programmazione caricato da un comando speciale. Questo registro aggiunge diversi bit al campo indirizzo dell'istruzione, necessari per indirizzare tutta la memoria.

Indirizzamento diretto tramite doppie parole. Per aumentare la lunghezza del campo indirizzo di un comando, viene allocata una parola aggiuntiva per l'indirizzo (e se necessario due).

Indirizzamento relativo al contatore del programma. Il campo dell'indirizzo dell'istruzione viene trattato come un numero intero con segno, che viene aggiunto al contenuto del contatore del programma per formare l'indirizzo di esecuzione. Questo metodo di indirizzamento relativo crea una pagina mobile e semplifica lo spostamento dei programmi nella memoria.

Indirizzamento relativo al registro indice. L'indirizzo di esecuzione è formato sommando il contenuto del registro indice e del campo indirizzo del comando, considerato come un intero con segno. Il registro indice viene caricato con comandi speciali.

Indirizzamento indiretto . Quando viene utilizzato l'indirizzamento indiretto, il campo indirizzo del comando specifica l'indirizzo nella pagina corrente in cui è memorizzato l'indirizzo del dirigente. In questo caso è necessario un bit aggiuntivo nel campo del comando, segno di indirizzamento indiretto. L'indirizzo esecutivo può essere memorizzato non in una cella di memoria, ma in un registro di uso generale. In questo caso l'indirizzamento indiretto è detto indirizzamento dei registri.

3. Struttura e formati dei comandi di MP KR580VM80

Il sistema di comando MP della serie KR580VM80 contiene comandi in tre formati: a byte singolo, doppio e tre byte.

Il contenuto del primo byte indica il formato del comando, il codice dell'operazione, il tipo di indirizzamento e i registri o le coppie di registri, se coinvolti nell'operazione, tuttavia non è possibile specificare quali bit specifici vengono assegnati ai primi tre byte. i componenti specificati del comando, perché possono essere posizionati in qualsiasi bit del comando. Ma nonostante ciò, supporremo che siano codificati come un unico campo, chiamato campo del codice operativo. Le varianti dei formati per il primo byte del comando sono mostrate nella Figura 9.

Se nell'operazione sono coinvolti dei registri, è possibile specificarne uno o due nel primo byte del comando. In questo caso, ai numeri di registro nel campo di comando vengono assegnati bit abbastanza specifici: i tre bit di ordine inferiore (b2 – b0) codificano il numero del registro sorgente contenente l'operando, e i tre bit intermedi (b5 – b3) – il numero del registro di destinazione in cui viene inviato il risultato dell'operazione. Nei casi in cui entrambi o uno di questi registri non sono coinvolti nell'esecuzione dell'operazione, i bit corrispondenti vengono utilizzati per il codice dell'operazione.

È accettata la seguente codifica di registro:

000 – registro B, 100 – registro H,

001 – registro C, 101 – registro L,

010 – registro D, 110 – cella di memoria,

011 – registro E, 111 – batteria A.

Il codice 100 è un segno di indirizzamento indiretto della memoria utilizzando un indirizzo a 16 bit situato nei registri H e L. A seconda della posizione di questo codice nel comando, si accede alla cella di memoria corrispondente per un operando o per scrivere i risultati di l'operazione.

Numerosi comandi MP prevedono l'elaborazione o la trasmissione di numeri di doppia lunghezza. In questi casi, le coppie di registri B e C, D ed E, o H e L vengono combinate in registri a 16 bit numerati rispettivamente 00, 01 e 10. I numeri delle coppie di registri nei comandi sono assegnati ai bit b2 e b1 (registro sorgente), b5 e b4 (registro di destinazione) e i bit b0 e b3 sono utilizzati per indicare il codice operazione.

I comandi a doppio byte nell'MP includono comandi con indirizzamento diretto e comandi di ingresso/uscita, pertanto il secondo byte del comando di questo gruppo contiene un operando a 8 bit o un indirizzo a 8 bit di un dispositivo di ingresso o di uscita.

Nelle istruzioni a tre byte, il secondo e il terzo byte contengono indirizzi a 16 bit (nelle istruzioni di indirizzamento diretto) o operandi a 16 bit (nelle istruzioni per caricare coppie di registri e puntatori allo stack).

Dopo l'esecuzione di ciascuna operazione ALU, vengono generati cinque segni, i cui valori possono influenzare l'esecuzione della successiva elaborazione delle informazioni e dei comandi di trasferimento del controllo condizionale. Tuttavia, va tenuto presente che comandi diversi hanno effetti diversi sui singoli segni.

Per comodità di salvataggio e ripristino dello stato dell'MP durante le interruzioni e le transizioni alle subroutine, tutte le caratteristiche specificate vengono memorizzate in un registro speciale: il registro delle caratteristiche. La posizione dei segni nei bit del registro è mostrata nella tabella.

dove S è l'attributo “segno” (prende il valore del bit più significativo

risultato);

Z – segno del risultato zero;

AC è un segno di trasferimento ausiliario (se c'è trasferimento

tra tetradi di byte, allora AC=1, altrimenti AC=0;

P – un segno di parità del risultato (se il numero di uno nel byte

il risultato è pari, allora P=1, altrimenti P=0);

C – segno di cessione o prestito (se, durante l'esecuzione dei comandi,

Quando si è verificato un trasferimento da un grado senior o un prestito a un livello senior-

La cifra più alta è C=1, altrimenti C=0).

Nota: Per i comandi di moltiplicazione logica, il segno di riporto ausiliario AC assume il valore del quarto bit del risultato.

Il sistema di comando completo della serie MP KR580VM80 è riportato nell'appendice del libro di testo “Microprocessori e sistemi a microprocessore”. Lì, per ciascun comando, è indicato come, dopo la sua esecuzione, il valore di ciascun attributo cambia: viene impostato in base al risultato dell'operazione (+), non cambia (–), viene azzerato (0 ) o impostarlo su uno (1).

In generale, il comando dovrebbe contenere le seguenti informazioni:

–codice operazione indicante l'operazione che il MP deve compiere;

–indirizzi di due operandi (addizioni, sottrazioni, ecc.). Se uno qualsiasi degli operandi è una costante, al posto del suo indirizzo è possibile specificare nel comando il valore dell'operando stesso. Tuttavia, questa circostanza deve riflettersi nel codice operativo in modo che l'MP utilizzi la parte appropriata del comando per lo scopo previsto;

–indirizzo della cella di memoria in cui inserire il risultato dell'operazione;

–indirizzo del comando successivo.

Quelli. il comando è generalmente composto da quattro indirizzi, tuttavia questa struttura di comando porta a un formato di comando più lungo che, a sua volta, è associato a un processo di elaborazione e a una struttura del processore più complessi. Pertanto, nella tecnologia MP, i comandi addressless e unicast sono più diffusi, consentendo di costruire un processore semplice, tuttavia, quando si eseguono operazioni complesse, vengono utilizzati diversi formati di comando.

Il sistema di istruzioni MP della serie 580 dispone di istruzioni a byte singolo, doppio e tre byte.

Le informazioni su come deve essere indirizzato il comando sono contenute nell'opcode del primo byte del comando.

Per velocizzare i calcoli, alcuni operandi sono memorizzati nel blocco RON. Le istruzioni che operano su questi operandi utilizzano codici di indirizzo abbreviati (indirizzamento dei registri).

Questi comandi consentono di eliminare il ciclo relativamente lungo di accesso alla RAM e quindi di aumentare significativamente la velocità delle operazioni. A causa della capacità limitata del RON e quando si lavora con una vasta gamma di dati, vengono utilizzati altri metodi di indirizzamento che consentono l'accesso agli operandi situati nella memoria esterna all'MP. Il più comune è l'indirizzamento indiretto dei registri, che utilizza una coppia di registri HL.

Nel gruppo dei comandi di trasferimento del controllo, esistono quattro tipi di comandi: rami incondizionati, rami condizionali, loop e interruzioni .

Comandi di salto incondizionati. Include tre codici mnemonici: JMP (salto incondizionato), CALL (chiamata subroutine) e RET (ritorno dalla subroutine).

Il comando JMP consente di saltare a qualsiasi punto del programma, situato sia nel segmento corrente del programma che in un altro segmento. Quando si salta all'interno del segmento di programma corrente, vengono utilizzati i primi tre formati di istruzioni JMP.

Il primo formato fornisce una transizione verso un punto arbitrario nel programma all'interno del segmento di programma corrente, per il quale viene aggiunto un offset di 16 bit al contenuto IP nel codice in complemento a due, il cui bit più significativo è firmato. Il secondo formato abbreviato consente di saltare a un punto del programma a non più di -128-f-127 indirizzi dall'istruzione JMP. Infine, il terzo formato carica il puntatore dell'istruzione con un numero a 16 bit, che si trova nell'indirizzo esecutivo EA, determinato dal postbyte. Questa transizione è chiamata indiretta perché viene utilizzato l'indirizzamento indiretto.

Per implementare un salto incondizionato a un punto del programma situato all'esterno del segmento di programma corrente quando è richiesto un ricaricamento del registro del segmento CS, vengono utilizzati il ​​quarto e il quinto formato di istruzione JMP.

Il quarto formato definisce una transizione intersegmento diretta, in cui il secondo e il terzo byte del formato indicano l'indirizzo relativo del punto di transizione, e il quarto e il quinto byte indicano il nuovo valore CS. Il quinto formato, utilizzando un postbyte, permette di determinare l'indirizzo esecutivo EA, dove si trova il relativo indirizzo del punto di transizione (in byte di memoria con indirizzi EA, EA+1), ed il nuovo valore CS (in byte di memoria EA+2, EA+3).

Il comando CALL consente di chiamare una subroutine situata nel segmento di programma corrente o in un'altra area di memoria. Ha gli stessi formati del comando JMP, tranne che è più breve. A differenza del comando JMP di un formato simile, il comando CALL, prima di modificare i valori IP o IP e CS, scrive automaticamente i valori correnti di questi registri nello stack, garantendo che il punto di ritorno dalla subroutine venga ricordato.

Per tornare da una subroutine, utilizzare il comando RET, che trasferisce il controllo all'indirizzo di ritorno inserito nello stack durante l'esecuzione del comando CALL precedente. Quando si ritorna da subroutine situate nel segmento di programma corrente, vengono utilizzati i primi due formati dell'istruzione RET, e il secondo formato differisce dal primo in quanto una costante scritta nel 2° e 3° byte dell'istruzione viene aggiunta al contenuto di il puntatore dello stack. Ciò consente, contemporaneamente al ritorno dalla subroutine, di reimpostare i parametri scritti nello stack durante l'esecuzione di questa subroutine e non utilizzati in futuro.

Per il ritorno intersegmento vengono utilizzati il ​​terzo e il quarto formato RET, che forniscono il recupero del contenuto sia del puntatore dell'istruzione che del segmento di programma.

Comandi di salto condizionato. Trasferisci il controllo in base ai risultati delle operazioni precedenti. Esistono tre tipi di salti condizionali utilizzati per stabilire relazioni tra numeri con segno, numeri senza segno e numeri arbitrari. Nelle prime due varietà vengono selezionati codici mnemonici di comando diversi per le stesse relazioni tra numeri, poiché valori di flag diversi corrispondono alle stesse relazioni tra numeri con segno e senza segno.

Nei codici mnemonici dei comandi di salto condizionale, quando si confrontano numeri con segno, la lettera viene utilizzata per indicare la condizione “maggiore di” G (Maggiore- altro) e designare - la lettera "meno". L (meno- meno). Per condizioni simili, quando si confrontano numeri senza segno, vengono utilizzate rispettivamente le lettere A (sopra- sopra) e Sotto- Sotto). La condizione di uguaglianza è indicata dalla lettera E (Uguale- è uguale) e il mancato rispetto di una condizione - per lettera N(Non- Non). Si precisa che è consentito utilizzare due codici mnemonici diversi per ciascun comando; ad esempio, i codici mnemonici JL e JNGF sono equivalenti, poiché le condizioni “minore di” e “non maggiore o uguale a” sono identiche.

Un elenco completo dei codici mnemonici dei comandi, delle condizioni da controllare, nonché delle corrispondenti combinazioni booleane di flag e dei loro valori sono riportati nella Tabella. 1.4.

Tabella 1.4

Codice mnemonico dei comandi Condizione Significato delle bandiere
Per i numeri firmati
JL/JNGE Minore/non superiore o uguale a SF + OF = l
JNL/JGE Non inferiore/maggiore o uguale a SF + OF = 0
JG/JNLE Maggiore/non inferiore o uguale a (SF + OF) V ZF = 0
JNG/JLE Non maggiore/minore o uguale a Per numeri senza segno (SF + OF) V ZF = l
JB/JNAE Minore/non superiore o uguale a CF=1
JNB/JAE Non inferiore/maggiore o uguale a CF=0
JA/JNBE Di più CFVZF = 0
JNA/JBE Non più Per altri dati CFVZF = 1
JE/JZ Uguale/zero ZF = 1
JNE/JNZ Non uguale/zero ZF = 0
JS Per meno SF = 1
JNS Il lato positivo SF = 0
JO Traboccamento OF = l
JNO Per assenza di trabocco OF = 0
JP/JPE Per parità pari PF = 1
JNP/JPO Per parità dispari PF = 0

Tutte le istruzioni di salto condizionato hanno lo stesso formato a due byte, il primo byte del quale è il codice operativo (OPC) e il secondo è un offset a 8 bit, che viene trattato come un numero con segno e pertanto consente modifiche dell'indirizzo nell'intervallo da -128 a +127. Se è necessaria una transizione più distante (“lontana”) quando una condizione è soddisfatta, viene utilizzato un ulteriore comando di transizione incondizionata.

Il tempo di esecuzione di ciascuna delle istruzioni di salto condizionato è indicato per due casi: 1) la condizione è soddisfatta e il controllo viene effettivamente trasferito in base all'offset, 2) la condizione non è soddisfatta, quindi il controllo viene trasferito all'istruzione successiva.

Squadre per l'organizzazione dei cicli. Introdotto nella CPU per comodità di eseguire cicli di calcolo. Questi includono i seguenti codici mnemonici: LOOP (loop fino a quando (CX) non è uguale a 0), LOOPNZ/LOOPNE (loop fino a zero/non uguale a), LOOPZ/LOOPE (loop fino a zero/uguale a) e JCXZ (salta su zero in SH). Ciascuno di questi comandi ha un formato a due byte, il secondo byte del quale specifica l'offset a 8 bit utilizzato per organizzare il salto. Questo offset viene trattato come un numero con segno e viene esteso con segno a 16 bit prima che venga calcolato l'indirizzo di salto.

Utilizzando i comandi loop insieme ai comandi per manipolare gli elementi stringa, è possibile creare programmi di conversione di stringhe abbastanza complessi. Consideriamo un esempio di composizione di un programma per convertire una stringa di dati scritti nel sistema numerico esadecimale in un codice per il quale la tabella di conversione si trova in memoria dall'indirizzo iniziale specificato in BX, come richiesto per utilizzare il comando di conversione della tabella per XLAT codici. Supponiamo inoltre che la stringa sorgente contenga 80 elementi e si trovi in ​​memoria dal relativo indirizzo iniziale 100, e la stringa risultato debba essere posizionata dal relativo indirizzo 200. Il programma che converte la stringa sorgente nella stringa risultato, con il valore del flag di direzione DF=0, avrà la forma:

MOVSI,100
MOVDI,200
MOV CX, 80

Qui viene utilizzato il comando di conversione della tabella XLAT descritto in 1.2.

Comandi di interruzione. Include tre mnemonici: INT (interruzione), INTO (interruzione in caso di overflow) e IRET (ritorno interruzione).

Comando di interruzione INT alle v=1 ha un formato a due byte, il secondo byte del quale contiene un numero a 8 bit che ne definisce il tipo (tipo) o livello di interruzione. Tramite comando INT tipo Il processore procede all'esecuzione del programma di servizio di interruzione del livello specificato e le azioni necessarie per garantire il ritorno al punto di interruzione vengono eseguite automaticamente. Queste azioni sono le seguenti: il contenuto del registro dei flag F viene scritto nello stack (PUSHF), i flag IF e TF vengono resettati, i valori correnti del registro CS e il puntatore dell'istruzione IP vengono scritti nello stack.

Per determinare l'indirizzo iniziale del programma di servizio in base al valore tipo Viene utilizzata la tabella dei livelli di interruzione. Per ciascuno dei 256 livelli di interruzione in questa tabella, vengono allocati quattro byte: i primi due byte determinano il valore del puntatore dell'istruzione IP, il secondo il valore del registro del segmento CS. Questi quattro byte determinano gli indirizzi iniziali dei programmi di servizio (coppie di valori CS, IP), che devono prima essere scritti nelle celle di memoria agli indirizzi assoluti 0-3FFH. Indirizzo della tabella corrispondente a quello specificato nel comando INT tipo il livello di interruzione viene determinato nella CPU come segue. Dopo aver memorizzato i valori attuali di CS e GR nello stack, viene eseguito il caricamento: CS = tipo X 4 + 2 e IP = tipo X 4. Nuovi valori CS e IP presi rispettivamente dalle celle dell'indirizzo tipo X 4 + 2 E tipo X 4, determinare l'indirizzo di partenza del programma di manutenzione richiesto.

Il comando di interruzione INT discusso in precedenza quando il valore del campo è v=0 ha un formato a byte singolo, ovvero non richiede un'indicazione speciale del livello di interruzione. Questo comando viene automaticamente percepito dal processore come un interrupt di livello 3. (tipo=3) ed è comunemente usato nei programmi come punto di controllo.

Il comando di interruzione di overflow INTO provoca una transizione al servizio dell'interruzione di quarto livello (tipo = 4) nel caso in cui il valore del flag di overflow OF = 1. Il comando INTO viene generalmente utilizzato dopo i comandi aritmetici con segno. Tipicamente, i primi livelli di interruzione (fino a 32) sono riservati all'elaborazione di una serie di situazioni specifiche, come un tentativo di divisione per zero, overflow e simili.

Una peculiarità dell'elaborazione delle interruzioni di livelli riservati è che il processore procede a servirle indipendentemente dal valore del flag di abilitazione dell'interruzione IF.

L'istruzione IRET da un byte viene posta alla fine di ciascuna routine di servizio di interruzione e fornisce il ritorno dell'interruzione. Con questo comando, il processore recupera il valore del puntatore dell'istruzione IP e del segmento del programma CS dallo stack, e ripristina anche il contenuto precedente del registro dei flag F (come con il comando POPF). Se necessario, il contenuto dei restanti registri della CPU corrispondenti al programma interrotto può essere memorizzato nello stack quando si passa al programma di servizio e quindi ripristinato al ritorno da esso utilizzando le istruzioni di accesso allo stack.

Per indirizzo indiretto

PCHL – l'indirizzo di salto è memorizzato nella coppia di registri HL. Quando viene eseguito (HL) → PC.

Comandi di salto condizionato

Jcon @, dove con è un mnemonico di condizione dalla parola inglese condizione.

Si è notato in precedenza che lo stato dei bit (flag) di RgP (F) viene utilizzato come condizione di transizione. I mnemonici corrispondenti a questi stati sono presentati in Fig. 6.18.

Ad esempio: JC 8BFE – quando C=1 va all'indirizzo 8BFE, quando C=0 viene eseguito il comando successivo all'indirizzo.

Comandi per chiamare PP e ritornare

In precedenza è stato notato che l'indirizzo del mittente viene automaticamente memorizzato nello stack, ad es. (PC) ® pila.

Comandi incondizionati

CALL @ – chiamata di subroutine;

RET – ritorno dalla subroutine.

Comandi condizionali

Ccon @ – chiamata di subroutine;

Rcon – ritorno dalla subroutine.

L'azione dei comandi è simile all'azione dei comandi di salto condizionato, cioè se la condizione è vera, chiama o ritorna. In caso contrario, verranno eseguiti i seguenti comandi.

Altri comandi di controllo

RST n, dove n = 0.1,...,7 – riavvio secondo il vettore di interrupt n.

Quando questo comando viene eseguito, il controllo viene trasferito alla subroutine che serve questo interrupt. Durante l'esecuzione dell'istruzione RST, il contenuto del contatore del programma del PC viene memorizzato nello stack e l'indirizzo del corrispondente vettore di interruzione viene scritto nel PC.

Questo indirizzo è impostato come segue. Il comando RST ha la struttura 11NN N111, cioè un byte. La combinazione NNN a tre bit è specificata dal valore n (n = 0...7). Nel contatore dei comandi del PC viene inserito il valore 0000 0000 00NN N000, che funge da indirizzo del corrispondente vettore di interruzione.

Quindi, impostando un certo valore di n, è possibile generare l'indirizzo di uno degli 8 vettori di interrupt. Questi indirizzi si trovano nella zona da 0000H a 0038H dello spazio indirizzi e occupano 8 byte, cioè A loro sono riservate le prime 64 celle di memoria (a ciascuno degli 8 vettori sono assegnati 8 byte). In queste zone (8 byte ciascuna) vengono scritti solo i comandi per saltare alle corrispondenti subroutine (handler), che si trovano in altre aree di memoria.

Le subroutine di interruzione (come le normali subroutine) devono terminare con il comando RET. Durante l'esecuzione di questo comando, l'indirizzo del comando principale del programma prima del quale si è verificata l'interruzione viene selezionato dallo stack e trasferito al registro indirizzi PA, e il valore aumentato di 1 viene inserito nel contatore del programma.

EI – abilitazione interruzione. Questo comando è posto all'inizio della sezione di programma in cui è abilitata l'interruzione. Con questo comando il trigger di abilitazione dell'interrupt nell'unità di controllo MP viene impostato sullo stato 1.

DI – disabilitazione dell'interruzione. Questo comando viene inserito alla fine della sezione di programma in cui è stato abilitato l'interrupt e reimposta il trigger allo stato 0.

NOP è un comando "vuoto". Salta 4 misure. Cambia solo il PC.

HLT – fermarsi. Causa l'interruzione dell'esecuzione del programma e l'immissione nello stato di arresto. L'MP è disconnesso dall'indirizzo esterno e dai bus dati (cioè i loro buffer vanno nello stato Z). L'uscita WAIT (attesa) è impostata al livello 1. Questo stato può essere interrotto dai segnali di avvio MP o ponendolo nello stato di interruzione.

DOMANDE DI AUTOTEST

1. Quali dispositivi sono necessari per creare un semplice microcomputer?

2. Elenca 5 opzioni per le strutture dei microcomputer.

3. Utilizzando un'interfaccia intermedia.

4. Cosa comprende il concetto di “controllore PU”?

5. Elencare le caratteristiche del processore I8080.

6. Registri dati. Il loro scopo.

7. Firmare i registri. Quali attributi sono memorizzati in questi registri?

8. Descrivere il principio dello scambio bidirezionale di dati tra SD interno ed esterno.

9. Quali registri può utilizzare un programmatore?

10. Fornire uno schema a blocchi di un microcomputer basato su MP KR580VM80.

11. Da quali cicli è composto un ciclo macchina?

12. Elenca i formati dati di MP KR580VM80.

13. Elenca i formati dei comandi dell'MP KR580VM80.

14. Quali metodi di indirizzamento vengono utilizzati nell'MP KR580VM80?

15. In quali gruppi possono essere divise le squadre MP KR580VM80?

16. Trasferimenti a byte singolo. Fornisci esempi di comandi di questo gruppo.

17. Trasferimenti a doppio byte. Fornisci esempi di comandi di questo gruppo.

18. Quali operazioni della batteria conosci?

19. Operazioni in RON e memoria. Quali operazioni comprendono?

20. Elencare i comandi di controllo.

COMPITI DI CONTROLLO

1. I fogli risposte devono riportare il numero del gruppo, il cognome dello studente e il numero della sua opzione.

2. I numeri delle domande vengono selezionati dallo studente in base alle sue ultime due cifre nel registro dei voti. Nella Tabella 6.1, n-1 è la penultima cifra del numero e n è l'ultima cifra. Le celle della tabella contengono il numero di domande a cui deve essere data risposta scritta.

Numeri delle domande Tabella 6.1

un n un 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

L'operazione di transizione incondizionata (BP) si riferisce alle operazioni di trasferimento incondizionato del controllo ed è composta da quanto segue. All'inizio dell'operazione, il contenuto del CC, indicante il comando che segue il BP (indirizzo di ritorno), viene inviato a P1 AU se il programma prevede il ritorno; questo permette di salvare l'indirizzo di ritorno trasferendo ulteriormente in memoria il contenuto di P1 (ad esempio tramite il funzionamento 3G). A tale scopo i primi comandi della parte di programma alla quale avviene il passaggio devono contenere un'operazione corrispondente. Nella fase successiva dell'operazione, il contenuto di 1-14 bit, che è l'indirizzo di transizione, viene letto dalla cella RAM o ROM con l'indirizzo specificato nel comando BP nello SchK. A questo indirizzo viene quindi richiesto alla ROM il comando al quale viene effettuata la transizione.

Operazione di turno

Nel formato Shift (FSD), sono codificate le operazioni “Spostamento aritmetico a destra (sinistra)” e “Spostamento logico a destra (sinistra)”. Quando vengono eseguite, le azioni vengono eseguite sul numero situato nell'AC. Vengono specificati gli attributi nel comando: la direzione dello spostamento (5 r), i tipi di spostamenti (8.9 r) e il loro numero (1-4 r). Durante l'operazione, i bit del registro P2 vengono spostati, il risultato viene registrato nei registri P2 e РСм e lo spostamento a destra viene eseguito di 3 bit contemporaneamente, lo spostamento a sinistra è di 1 bit. Il valore del 5° bit pari a “1” determina lo spostamento a sinistra, pari a “0” - a destra.

Le operazioni sono cicliche. Il numero di cicli di cambio viene contato dal contatore di cicli (CC). Prima di eseguire la parte ciclica dell'operazione, viene inviato al centro il contenuto di 1-5 bit del comando contenente una costante e un segno di spostamento. Successivamente, il contenuto di P2 viene inviato a RSM. Lo spostamento stesso viene effettuato grazie alla copia “obliqua” del contenuto dei registri P2 e Pcm rispettivamente in P2’ e Pcm’. Quindi il risultato dello spostamento da PCm' e P2' attraverso SM1 e SM2 viene riscritto in P2 e PSM. Il completamento dell'operazione è indicato dal valore di SchT =0.

A seconda del tipo di spostamento (L o A), vengono spostati tutti i 16 bit (L) oppure solo 15 bit (mantissa) senza segno (A). Quando A si sposta a destra, i bit di ordine superiore liberati vengono riempiti con un segno e quando si sposta a sinistra, i bit di ordine inferiore liberati vengono riempiti con zeri. Durante uno spostamento logico a destra o a sinistra, i bit lasciati liberi vengono riempiti con zeri.

È inoltre possibile modificare a livello di codice la costante di spostamento.

32 Interazione di nodi ed elementi dello schema a blocchi del processore CB durante l'esecuzione di operazioni di salto condizionato.

Operazioni di salto condizionato



L'esecuzione dell'operazione inizia con la verifica della fattibilità della condizione di transizione confrontando il valore dell'attributo result dell'operazione precedente con il codice “mask” presente nel comando. Se la condizione è soddisfatta, avviene la transizione all'esecuzione del comando, il cui indirizzo si trova nella parte dell'operando dell'indirizzo del formato PFU. Se la condizione di transizione non è soddisfatta, viene eseguito il comando che segue il comando “Salto condizionato” nel programma.

Il comando “Salto Condizionale” (JJ) occupa due celle ROM adiacenti. La prima cella contiene il comando, la seconda cella contiene l'indirizzo di salto. Un salto condizionato è determinato da una combinazione nei 7-9 bit del comando, la condizione per l'inserimento dell'indirizzo di ritorno è determinata dal 6° bit.

Quando la condizione è soddisfatta, l'indirizzo di transizione viene inserito nel contatore del programma, quindi dalla cella con questo indirizzo verrà letto il codice del comando successivo. L'indirizzo di ritorno viene inserito in P1 se il 6° bit è uguale a 0 e in Pcm se il valore di questo bit è uguale a uno.

Se la condizione di transizione non è soddisfatta, l'istruzione successiva viene selezionata dalla cella con codice indirizzo i+2. In questo caso il codice specificato (indirizzo di ritorno) viene inserito in P1 indipendentemente dal valore del 6° bit del comando. Quest'ultimo è determinato dall'algoritmo operativo del processore SV durante la decifrazione del codice operativo dell'UE.

L'immissione dell'indirizzo di ritorno sul PCM è dovuta al fatto che l'uscita sul code bus dall'AC ha solo il registro specificato.

Una particolarità dell'esecuzione dell'operazione NC è che se nei bit “maschera” del comando è presente il codice 111 o 000, la transizione condizionale degenera rispettivamente in una incondizionata o in un'operazione di invio ai registri base. In questi casi gli indirizzi di salto o l'indirizzo di invio ai registri base sono il contenuto della parte indirizzo-operando dell'istruzione (AOC).

Quando si esegue l'operazione di invio al BR, il contenuto dell'AOC viene inviato a uno o più BR contemporaneamente, a seconda del contenuto dei 15-17 bit del comando. L'indirizzo del mittente in questo caso non viene inviato a P1 e RSM.



L'esecuzione di un'operazione NC come operazione TCU può essere utilizzata negli interrupt per passare ai programmi di interruzione. Per fare ciò, nel 5° bit del comando, viene impostato l'attributo di una transizione programmata (PNT). In questo caso, il comando viene letto nel processore dalla ROM tramite un segnale di interruzione (ISR). In questo caso, l'indirizzo di accesso alla ROM (indirizzo di interruzione) viene generato dal circuito di interruzione del processore.

Una particolarità dell'operazione in questo caso è che l'indirizzo di ritorno per gli interrupt non è l'indirizzo del comando successivo al comando in formato FUP, ma l'indirizzo del comando prima del quale si è verificato l'interrupt. Il segnale NPP viene elaborato come segue. Sulla base di questo segnale, il circuito di interruzione del processore genera un indirizzo di interruzione (APr), uguale all'indirizzo della prima cella dell'istruzione di salto nel formato FUP(i). Questo indirizzo viene trasferito in memoria tramite lo switch e il registro degli indirizzi ROM. Gli indirizzi di interruzione sono selezionati in modo tale che l'indirizzo della prima cella del comando (i) sia pari e l'indirizzo della seconda cella (i+1) sia dispari. Il secondo indirizzo si ottiene modificando (nell'hardware) la cifra meno significativa senza l'intervento del CC da zero a uno. Nel processo di lettura di un comando dalla ROM e di esecuzione, il contenuto dello SchK (K+1) viene memorizzato nel registro P1 dell'AC, e il contenuto della seconda cella del comando (i+1), che è l'indirizzo del passaggio al comando con indirizzo j, vengono inseriti nello SchK. Viene effettuata una richiesta alla ROM in merito ai nuovi contenuti del CC. Pertanto, l'indirizzo dell'istruzione successiva al momento dell'interruzione (K+1) viene memorizzato nel registro P1. Dopo l'elaborazione dell'interrupt questo indirizzo viene utilizzato per ritornare al programma interrotto.

33 Interazione di nodi ed elementi dello schema a blocchi del processore SV durante l'esecuzione di operazioni di controllo del processore e del sistema.