LA CAMPANA

C'è chi ha letto questa notizia prima di te.
Iscriviti per ricevere gli ultimi articoli.
E-mail
Nome
Cognome
Come vuoi leggere The Bell
Niente spam

Argomento 1.4 Mnemonici dell'assemblatore. Struttura e formati dei comandi. Tipi di indirizzamento. Set di comandi del microprocessore

Piano:

1 Lingua dell'Assemblea. Concetti basilari

2 Simboli del linguaggio assembly

3 Tipi di dichiarazioni assembler

4 Direttive di assemblaggio

5 Set di istruzioni del processore

1 ilinguaggio assembly. Concetti basilari

linguaggio assembly è una rappresentazione simbolica del linguaggio macchina. Tutti i processi nella macchina, al livello hardware più basso, sono guidati solo da comandi (istruzioni) in linguaggio macchina. Quindi è chiaro che, nonostante il nome generale, il linguaggio assembly per ogni tipo di computer è diverso.

Un programma assembler è una raccolta di blocchi di memoria chiamati segmenti di memoria.Un programma può essere costituito da uno o più di questi segmenti di blocco. Ogni segmento contiene una serie di frasi in lingua, ciascuna delle quali occupa una riga separata di codice di programma.

Le frasi di assemblaggio sono di quattro tipi:

1) comandi o istruzioni, che sono analoghi simbolici delle istruzioni della macchina. Nel processo di traduzione, le istruzioni dell'assemblatore vengono convertite nei comandi corrispondenti del set di istruzioni del microprocessore;

2) macro -frasi del testo del programma che si formano in un certo modo, che vengono sostituite durante la trasmissione con altre frasi;

3) direttive,che sono istruzioni al traduttore dell'assemblatore per eseguire alcune azioni. Le direttive non hanno analoghi nella rappresentazione della macchina;

4) righe di commento contenente qualsiasi simbolo, comprese le lettere dell'alfabeto russo. I commenti vengono ignorati dal traduttore.

­ La struttura di un programma in assembly. Sintassi dell'assembly.

Le frasi che compongono un programma possono essere un costrutto sintattico corrispondente a un comando, macro, direttiva o commento. Affinché il traduttore assembler li riconosca, devono essere formati secondo determinate regole sintattiche. Il modo migliore per farlo è usare una descrizione formale della sintassi della lingua, come le regole grammaticali. I modi più comuni per descrivere un linguaggio di programmazione come questo - diagrammi di sintassi e forme estese di Backus-Naur. Più conveniente per un uso pratico diagrammi di sintassi.Ad esempio, la sintassi delle frasi assembler può essere descritta utilizzando i diagrammi di sintassi mostrati nelle seguenti figure 10, 11, 12.

Figura 10 - Formato di una frase assembler


­ Figura 11 - Formato delle direttive

­ Figura 12 - Formato dei comandi e delle macro

In queste figure:

­ nome dell'etichetta - identificatore, il cui valore è l'indirizzo del primo byte della frase del testo sorgente del programma che designa;

­ nome - identificatore che distingue questa direttiva da altre direttive con lo stesso nome. A seguito dell'elaborazione di una determinata direttiva da parte dell'assemblatore, a questo nome possono essere assegnate determinate caratteristiche;

­ codice operativo (COP) e direttiva - sono designazioni mnemoniche della corrispondente istruzione della macchina, macro o direttiva del traduttore;

­ operandi - parti di un comando, una macro o una direttiva assembler che designano gli oggetti da manipolare. Gli operandi dell'assemblatore sono descritti da espressioni con costanti numeriche e di testo, etichette e identificatori di variabili che utilizzano segni di operazione e alcune parole riservate.

I diagrammi di sintassi aiutano trova e poi passa dall'input del diagramma (a sinistra) al suo output (a destra). Se esiste un tale percorso, la frase o la costruzione è sintatticamente corretta. Se non esiste tale percorso, il compilatore non accetterà questa costruzione.

­ 2 Simboli del linguaggio Assembly

I caratteri consentiti durante la scrittura del testo del programma sono:

1) tutte le lettere latine: A-Z, a-z... In questo caso, le lettere maiuscole e minuscole sono considerate equivalenti;

2) numeri da 0 prima 9 ;

3) segni ? , @ , $ , _ , & ;

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

Le frasi assembler sono formate da gettoni, che sono sequenze sintatticamente inseparabili di caratteri linguistici validi che hanno senso per un traduttore.

Lexemes siamo:

1) identificatori - sequenze di caratteri validi utilizzati per designare oggetti programma come codici operativi, nomi di variabili e nomi di etichette. La regola per scrivere identificatori è la seguente: un identificatore può essere costituito da uno o più caratteri;

2) stringhe di caratteri - sequenze di caratteri racchiuse tra virgolette singole o doppie;

3) numeri interi di uno dei seguenti sistemi numerici : binario, decimale, esadecimale. L'identificazione dei numeri durante la loro scrittura in programmi in linguaggio assembly avviene secondo alcune regole:

4) i numeri decimali non richiedono simboli aggiuntivi per la loro identificazione, ad esempio 25 o 139. Per l'identificazione nel codice sorgente del programma numeri binari è necessario dopo aver scritto gli zeri e gli uno che li compongono, mettere il latino “ b", Ad esempio 10010101 b.

5) i numeri esadecimali hanno più convenzioni quando vengono scritti:

In primo luogo, sono costituiti da numeri 0...9 , lettere minuscole e maiuscole dell'alfabeto latino un', b, c, d, e, f o UN, B, C, D, E, F.

In secondo luogo, il traduttore potrebbe avere difficoltà a riconoscere i numeri esadecimali a causa del fatto che possono essere costituiti solo da cifre 0 ... 9 (ad esempio 190845) o iniziare con una lettera dell'alfabeto latino (ad esempio, ef15). Per "spiegare" al traduttore che un dato token non è un numero decimale o un identificatore, il programmatore deve selezionare un numero esadecimale in modo speciale. Per fare ciò, alla fine della sequenza di cifre esadecimali che compongono un numero esadecimale, scrivi la lettera latina “ h". Questo è un prerequisito. Se un numero esadecimale inizia con una lettera, davanti ad essa viene scritto uno zero iniziale: 0 ef15 h.

Quasi ogni frase contiene una descrizione dell'oggetto su cui o con l'aiuto del quale viene eseguita un'azione. Questi oggetti vengono chiamati operandi... Possono essere definiti in questo modo: operandi - questi sono oggetti (alcuni valori, registri o celle di memoria) su cui agiscono istruzioni o direttive, oppure sono oggetti che definiscono o chiariscono l'azione di istruzioni o direttive.

È possibile effettuare la seguente classificazione degli operandi:

­ operandi costanti o immediati;

­ indirizzo operandi;

­ operandi mobili;

contatore indirizzi;

­ registra operando;

­ operandi di base e indice;

­ operandi strutturali;

record.

Gli operandi sono componenti elementari che fanno parte di un'istruzione della macchina che denota gli oggetti su cui viene eseguita un'operazione. In un caso più generale, gli operandi possono essere inclusi come parti costituenti in formazioni più complesse chiamate espressioni.

Espressioni sono combinazioni di operandi e operatori, considerati nel loro insieme. Il risultato della valutazione di un'espressione può essere un indirizzo di una cella di memoria o un valore (assoluto) costante.

­ 3 Tipi di dichiarazioni assembler

Elenchiamo i possibili tipi operatori dell'assemblatore e regole sintattiche per la formazione di espressioni assembler:

­ operatori aritmetici;

­ operatori di turno;

­ operatori di confronto;

­ operatori logici;

­ operatore indice;

­ digitare l'operatore di override;

­ operatore di sostituzione del segmento;

­ operatore di denominazione del tipo di struttura;

­ operatore per ottenere la componente di segmento dell'indirizzo dell'espressione;

­ operatore per ottenere l'offset di un'espressione.

1 Direttive dell'assemblatore

­ Le direttive assembler sono:

1) Direttive sulla segmentazione. Nel corso della discussione precedente, abbiamo scoperto tutte le regole di base per scrivere comandi e operandi in un programma assembly. Rimane aperta la questione di come formulare correttamente la sequenza di comandi in modo che il traduttore possa elaborarli e il microprocessore possa eseguirli.

Considerando l'architettura del microprocessore, abbiamo appreso che ha sei registri di segmento, attraverso i quali può funzionare contemporaneamente:

­ con un segmento di codice;

­ con un segmento dello stack;

­ con un segmento di dati;

­ con tre segmenti di dati aggiuntivi.

Fisicamente, un segmento è un'area di memoria occupata da istruzioni e (o) dati, i cui indirizzi sono calcolati rispetto al valore nel registro di segmento corrispondente. La descrizione sintattica del segmento in assembler è la costruzione mostrata nella Figura 13:


­ Figura 13 - Descrizione sintattica del segmento in assembler

È importante notare che la funzionalità di un segmento è in qualche modo più ampia della semplice suddivisione di un programma in blocchi di codice, dati e stack. La segmentazione fa parte di un meccanismo più generale correlato a il concetto di programmazione modulare. Implica l'unificazione del design dei moduli oggetto creati dal compilatore, inclusi quelli di diversi linguaggi di programmazione. Ciò consente di combinare programmi scritti in lingue diverse. Gli operandi nella direttiva SEGMENT hanno lo scopo di implementare varie varianti di tale unione.

2) Direttive di gestione degli elenchi. Le direttive di controllo degli elenchi sono suddivise nei seguenti gruppi:

­ direttive di controllo dell'elenco generale;

­ le direttive di output per l'elenco dei file inclusi;

­ direttive per l'output di blocchi di assemblaggio condizionale;

­ direttive per elencare le macro;

­ direttive per fornire informazioni sui riferimenti incrociati all'elenco;

­ direttive per modificare il formato dell'elenco.

2 Set di istruzioni del processore

Il set di istruzioni del processore è mostrato nella Figura 14.

Consideriamo i principali gruppi di comandi.

­ Figura 14 - Classificazione delle istruzioni dell'assemblatore

Le squadre sono:

1 Comandi di trasferimento dati. Questi comandi sono molto importanti nel set di istruzioni di qualsiasi processore. Svolgono le seguenti funzioni essenziali:

­ memorizzare il contenuto dei registri del processore interno in memoria;

­ copiare il contenuto da un'area di memoria a un'altra;

­ scrittura su dispositivi I / O e lettura da dispositivi I / O.

Su alcuni processori, tutte queste funzioni vengono eseguite da un unico comandoMOV (per trasferimenti di byte -MOVB ) ma con metodi diversi per indirizzare gli operandi.

Su altri processori oltre al comandoMOV ci sono molti altri comandi per eseguire le funzioni elencate. Inoltre, i comandi di trasferimento dati includono comandi di scambio di informazioni (la loro designazione si basa sulla parolaScambio ). Lo scambio di informazioni tra registri interni, tra due metà di un registro (SCAMBIARE ) o tra un registro e una posizione di memoria.

2 comandi aritmetici. Le istruzioni aritmetiche trattano i codici degli operandi come codici numerici binari o BCD. Questi comandi possono essere suddivisi in cinque gruppi principali:

­ comandi di operazioni a punto fisso (addizione, sottrazione, moltiplicazione, divisione);

­ comandi in virgola mobile (addizione, sottrazione, moltiplicazione, divisione);

­ comandi di pulizia;

­ comandi di incremento e decremento;

­ comando di confronto.

3 I comandi di operazioni con un punto fisso funzionano con i codici nei registri del processore o in memoria come con i normali codici binari. Le istruzioni in virgola mobile (punto) utilizzano il formato di rappresentare i numeri con ordine e mantissa (di solito questi numeri occupano due posizioni di memoria consecutive). Nei moderni potenti processori, il set di istruzioni in virgola mobile non è limitato a sole quattro operazioni aritmetiche, ma contiene molte altre istruzioni più complesse, ad esempio il calcolo di funzioni trigonometriche, funzioni logaritmiche e funzioni complesse necessarie per l'elaborazione di suoni e immagini.

4 Le istruzioni di cancellazione sono progettate per scrivere un codice zero in un registro o in una cella di memoria. Questi comandi possono essere sovrascritti con comandi di trasferimento zero, ma i comandi di cancellazione speciali sono generalmente più veloci dei comandi di trasferimento.

5 Comandi per incremento (aumento di uno) e decremento

(decrementi di uno) sono anche molto convenienti. In linea di principio possono essere sostituiti dall'addizione con uno o sottrarre uno comandi, ma l'incremento e il decremento sono più veloci dell'addizione e della sottrazione. Queste istruzioni richiedono un operando di input, che è anche un operando di output.

6 L'istruzione di confronto confronta due operandi di ingresso. Infatti, calcola la differenza tra questi due operandi, ma non forma un operando di uscita, ma cambia solo i bit nel registro di stato del processore in base al risultato di questa sottrazione. L'istruzione successiva che segue l'istruzione di confronto (di solito un'istruzione di ramo) analizzerà i bit nel registro di stato del processore ed eseguirà azioni in base ai loro valori. Alcuni processori forniscono istruzioni per collegare a margherita due sequenze di operandi in memoria.

7 Comandi logici. Le istruzioni logiche eseguono operazioni logiche (bit per bit) sugli operandi, cioè considerano i codici degli operandi non come un singolo numero, ma come un insieme di bit separati. Ecco come differiscono dai comandi aritmetici. I comandi logici eseguono le seguenti operazioni di base:

­ aND logico, OR logico, addizione modulo 2 (OR esclusivo);

­ spostamenti logici, aritmetici e ciclici;

­ controllo di bit e operandi;

­ impostazione e cancellazione di bit (flag) del registro di stato del processore (PSW).

Le istruzioni logiche consentono di calcolare bit per bit le funzioni logiche di base da due operandi di ingresso. Inoltre, l'operazione AND viene utilizzata per cancellare forzatamente i bit specificati (un codice maschera viene utilizzato come uno degli operandi, in cui i bit da cancellare sono impostati su zero). L'operazione OR viene utilizzata per impostare forzatamente i bit specificati (come uno degli operandi, viene utilizzato un codice maschera, in cui le cifre che richiedono l'impostazione a uno sono uguali a uno). L'operazione "OR esclusivo" viene utilizzata per invertire i bit specificati (un codice maschera viene utilizzato come uno degli operandi, in cui i bit da invertire sono impostati a uno). Le istruzioni richiedono due operandi di input e formano un operando di output.

8 I comandi di shift consentono di spostare il codice dell'operando bit per bit a destra (verso i bit di ordine basso) oa sinistra (verso i bit di ordine alto). Il tipo di spostamento (logico, aritmetico o ciclico) determina quale sarà il nuovo valore del bit più significativo (quando si sposta a destra) o del bit meno significativo (quando si sposta a sinistra) e determina anche se il valore precedente del bit più significativo (quando si sposta a sinistra) verrà salvato da qualche parte o il bit meno significativo (se spostato a destra). Gli spostamenti ciclici consentono di spostare i bit di un operando in modo circolare (in senso orario se spostati a destra o in senso antiorario se spostati a sinistra). In questo caso, la bandiera di trasporto può o non può essere inclusa nell'anello del cambio. Il bit del flag di riporto (se utilizzato) memorizza il valore del bit più significativo quando viene spostato a sinistra e del bit meno significativo quando viene eseguito un ciclo a destra. Di conseguenza, il valore del bit del flag di riporto verrà sovrascritto nel bit meno significativo quando si pedala a sinistra e nel bit più significativo quando si pedala a destra.

9 Comandi di transizioni. Le istruzioni di salto sono progettate per organizzare tutti i tipi di cicli, rami, chiamate di subroutine, ecc., Ovvero interrompono il flusso sequenziale del programma. Questi comandi scrivono un nuovo valore nel registro del contatore dei comandi e quindi fanno sì che il processore non salti al comando successivo in ordine, ma a qualsiasi altro comando nella memoria del programma. Alcuni comandi di transizione forniscono un ulteriore ritorno al punto da cui è stata effettuata la transizione, altri non lo prevedono. Se viene fornito return, i parametri del processore corrente vengono memorizzati nello stack. Se non viene fornito alcun ritorno, i parametri correnti del processore non vengono salvati.

I comandi di transizione senza backtracking sono divisi in due gruppi:

­ comandi di salto incondizionati;

­ comandi di salto condizionale.

Questi comandi usano le paroleBranch (branch) e Jump (jump).

Le istruzioni di salto incondizionato causano un salto a un nuovo indirizzo indipendentemente da qualsiasi cosa. Possono causare un salto di una quantità specificata di offset (avanti o indietro) o di un indirizzo di memoria specificato. Il valore di offset o il nuovo valore dell'indirizzo viene specificato come operando di ingresso.

I comandi di salto condizionale non sempre provocano un salto, ma solo quando vengono soddisfatte le condizioni specificate. Queste condizioni sono solitamente i valori dei flag nel registro di stato del processore (PSW ). Cioè, la condizione di transizione è il risultato dell'operazione precedente che modifica i valori del flag. Possono esserci da 4 a 16 di tali condizioni di salto in totale. Diversi esempi di comandi di salto condizionale:

­ transizione se uguale a zero;

­ transizione se non uguale a zero;

­ salta se c'è overflow;

­ salta se non c'è overflow;

­ transizione se maggiore di zero;

­ salta se minore o uguale a zero.

Se la condizione di transizione è soddisfatta, il nuovo valore viene caricato nel registro dei comandi. Se la condizione di salto non viene soddisfatta, il contatore delle istruzioni viene semplicemente incrementato e il processore seleziona ed esegue l'istruzione successiva in ordine.

Il comando di confronto (CMP) che precede il comando di salto condizionale (o anche diversi comandi di salto condizionale) viene utilizzato specificamente per controllare le condizioni di salto. Ma i flag possono essere impostati da qualsiasi altro comando, ad esempio, un comando di trasferimento dati, qualsiasi comando aritmetico o logico. Nota che i comandi di salto in sé non cambiano i flag, il che ti consente solo di inserire diversi comandi di salto uno dopo l'altro.

I comandi di interruzione occupano un posto speciale tra i comandi di salto indietro. Queste istruzioni richiedono un numero di interrupt (indirizzo vettoriale) come operando di ingresso.

Produzione:

Il linguaggio assembly è una rappresentazione simbolica di un linguaggio macchina. Il linguaggio assembly per ogni tipo di computer è diverso. Un programma in linguaggio assembly è una raccolta di blocchi di memoria chiamati segmenti di memoria. Ogni segmento contiene una serie di frasi in lingua, ciascuna delle quali occupa una riga separata di codice di programma. Le frasi di assemblaggio sono di quattro tipi: comandi o istruzioni, macro, direttive, righe di commento.

Tutte le lettere latine sono caratteri validi durante la scrittura del testo del programma: A-Z, a-z... In questo caso, le lettere maiuscole e minuscole sono considerate equivalenti; figure da 0 prima 9 ; segni ? , @ , $ , _ , & ; separatori , . () < > { } + / * % ! " " ? = # ^ .

Si applicano i seguenti tipi di istruzioni assembler e regole sintattiche per la formazione di espressioni assembler. operatori aritmetici, operatori di spostamento, operatori di confronto, operatori logici, operatore di indice, operatore di override di tipo, operatore di override di segmento, operatore di denominazione del tipo di struttura, operatore per ottenere il componente di segmento di un indirizzo di espressione, operatore per ottenere l'offset di un'espressione.

Il sistema di comando è diviso in 8 gruppi principali.

­ Domande di prova:

1 Cos'è il linguaggio assembly?

2 Quali simboli possono essere utilizzati per scrivere comandi in linguaggio assembly?

3 Cosa sono le etichette e il loro scopo?

4 Spiega la struttura dei comandi assembler.

5 Elenca 4 tipi di frasi assembler.

Strutture di assemblaggio

Gli array che abbiamo considerato sopra sono una raccolta di elementi dello stesso tipo. Ma spesso nelle applicazioni diventa necessario considerare una certa raccolta di dati di diversi tipi come un certo tipo unico.

Questo è molto importante, ad esempio, per i programmi di database, dove è necessario associare una raccolta di dati di diverso tipo a un oggetto.

Ad esempio, abbiamo esaminato il Listato 4 in precedenza, in cui abbiamo lavorato con un array di elementi a tre byte. Ogni elemento, a sua volta, rappresentava due elementi di diverso tipo: un campo contatore da un byte e un campo da due byte che poteva trasportare alcune altre informazioni necessarie per la memorizzazione e l'elaborazione. Se il lettore ha familiarità con uno dei linguaggi di alto livello, allora sa che un tale oggetto viene solitamente descritto utilizzando un tipo di dati speciale - strutture.

Per migliorare l'usabilità del linguaggio assembly, è stato introdotto anche questo tipo di dati.

A-priory struttura è un tipo di dati costituito da un numero fisso di elementi di diverso tipo.

Per utilizzare le strutture in un programma, è necessario eseguire tre passaggi:

    Chiedi modello di struttura .

    Per definizione, ciò significa definire un nuovo tipo di dati, che può essere successivamente utilizzato per definire variabili di questo tipo.

    Definire istanza della struttura .

    Questa fase prevede l'inizializzazione di una variabile specifica con una struttura predefinita (utilizzando un modello).

    Organizzare accesso agli elementi della struttura .

È molto importante che tu capisca la differenza tra descrizione struttura nel programma e la sua definizione.

Descrivere la struttura nel programma intende solo indicare il suo schema o modello; nessuna memoria è allocata.

Questo modello può essere considerato solo come informazione per il traduttore sulla posizione dei campi e sui loro valori predefiniti.

Definire struttura significa istruire il traduttore ad allocare memoria e assegnare un nome simbolico a questa area di memoria.

È possibile descrivere la struttura in un programma solo una volta e definirla un numero qualsiasi di volte.

Descrizione del modello di struttura

La descrizione del modello di struttura ha la seguente sintassi:

nome_struttura STRUC

nome_struttura ENDS

Qui è una sequenza di direttive che descrivono i dati db, dw, dd, dq e dt.

I loro operandi determinano la dimensione dei campi e, se necessario, i valori iniziali. Questi valori verranno probabilmente inizializzati nei campi corrispondenti durante la definizione della struttura.

Come abbiamo notato nella descrizione del modello, non viene allocata memoria, poiché si tratta solo di informazioni per il traduttore.

Posizione Il template nel programma può essere arbitrario, ma, seguendo la logica del traduttore one-pass, deve essere posizionato fino al punto in cui è definita la variabile con il tipo di questa struttura. Cioè, quando si descrive una variabile con il tipo di una struttura in un segmento di dati, il suo modello deve essere posizionato all'inizio del segmento di dati o prima di esso.

Consideriamo di lavorare con le strutture usando l'esempio della modellazione di un database di dipendenti di un determinato reparto.

Per semplicità, al fine di allontanarci dai problemi di conversione delle informazioni durante l'inserimento, concorderemo che tutti i campi sono simbolici.

Definiamo la struttura dei record di questo database con il seguente modello:

Definizione dei dati con un tipo di struttura

Per utilizzare la struttura descritta utilizzando il modello nel programma, è necessario definire una variabile con il tipo di questa struttura. Per questo, viene utilizzata la seguente sintassi:

[nome variabile] nome_struttura

    nome della variabile - identificatore di una variabile di questo tipo strutturale.

    Il nome della variabile è facoltativo. Se non lo specifichi, verrà semplicemente allocata un'area di memoria della somma delle lunghezze di tutti gli elementi della struttura.

    elenco di valori - un elenco separato da virgole dei valori iniziali degli elementi della struttura racchiusi tra parentesi angolari.

    Anche il suo incarico è facoltativo.

    Se l'elenco è incompleto, tutti i campi della struttura per questa variabile vengono inizializzati con i valori del modello, se presenti.

    È consentito inizializzare singoli campi, ma in questo caso i campi mancanti devono essere separati da virgole. I campi mancanti verranno inizializzati con i valori del modello di struttura. Se, quando si definisce una nuova variabile con il tipo di questa struttura, siamo d'accordo con tutti i valori di campo nel suo modello (cioè impostati di default), allora è sufficiente scrivere le parentesi angolari.

    Per esempio: lavoratore vincitore.

Ad esempio, definiamo più variabili con il tipo di struttura sopra descritto.

Metodi per lavorare con la struttura

L'idea di introdurre un tipo strutturato in qualsiasi linguaggio di programmazione è combinare variabili di diversi tipi in un unico oggetto.

La lingua deve avere un mezzo per accedere a queste variabili all'interno di una specifica istanza della struttura. Per fare riferimento a un campo di una struttura in un comando, viene utilizzato un operatore speciale: simbolo ". "(punto)... Viene utilizzato nella seguente sintassi:

    address_expression- l'identificativo di una variabile di qualche tipo strutturale o un'espressione tra parentesi secondo le regole sintattiche di seguito indicate (Fig. 1);

    nome_campo_struttura - il nome del campo dal modello di struttura.

    Questo infatti è anche un indirizzo, o meglio, l'offset del campo dall'inizio della struttura.

Pertanto, l'operatore " . "(punto) valuta l'espressione

Figura: cinque. La sintassi di un'espressione di indirizzo in un operatore di accesso ai campi della struttura

Dimostriamo usando l'esempio della struttura che abbiamo definito lavoratore alcune tecniche per lavorare con le strutture.

Ad esempio, estrai in ascia valori di campo con età. Poiché è improbabile che l'età di una persona normodotata abbia più di 99 anni, dopo aver inserito il contenuto di questo campo carattere nel registro ascia sarà conveniente convertirlo in rappresentazione binaria con il comando aad.

Fai attenzione, poiché a causa del principio della memorizzazione dei dati "Byte meno significativo almeno indirizzo significativo" verrà inserita la cifra dell'età più alta al, e il più giovane - in ah.

Per regolare, usa semplicemente il comando xchg al, ah:

mov ax, word ptr sotr1.age; in al age sotr1

oppure puoi farlo:

Ulteriore lavoro con un array di strutture viene eseguito allo stesso modo di un array unidimensionale. Qui sorgono diverse domande:

E la dimensione e come organizzare l'indicizzazione degli elementi dell'array?

Come altri identificatori definiti nel programma, il traduttore assegna il nome del tipo di struttura e il nome della variabile del tipo di struttura all'attributo type. Il valore di questo attributo è la dimensione in byte occupata dai campi di questa struttura. È possibile recuperare questo valore utilizzando l'operatore genere.

Dopo che la dimensione di un'istanza di struttura è diventata nota, non è difficile organizzare l'indicizzazione in una matrice di strutture.

Per esempio:

Come copio un campo da una struttura al campo corrispondente di un'altra struttura? O come copi l'intera struttura? Copiamo il campo nam terzo addetto del settore nam quinto dipendente:

mas_sotr operaio 10 dup ()

mov bx, offset mas_sotr

mov si, (type worker) * 2; si \u003d 77 * 2

mov di, (type worker) * 4; si \u003d 77 * 4

Mi sembra che il mestiere di un programmatore prima o poi faccia sembrare una persona una brava casalinga. Lui, come lei, è costantemente alla ricerca di dove salvare qualcosa, tagliare e preparare una cena meravigliosa con un minimo di prodotti. E se questo ha successo, la soddisfazione morale si ottiene non meno, e forse di più, di una cena meravigliosa con una casalinga. Il grado di questa soddisfazione, mi sembra, dipende dal grado di amore per la propria professione.

D'altra parte, i successi nello sviluppo di software e hardware rilassano in qualche modo il programmatore, e molto spesso si osserva una situazione simile al noto proverbio sulla mosca e l'elefante - per risolvere qualche piccolo problema, vengono utilizzati mezzi pesanti, la cui efficacia, nel caso generale, è significativa solo quando realizzazione di progetti relativamente grandi.

La presenza dei seguenti due tipi di dati nella lingua è probabilmente spiegata dal desiderio della "padrona di casa" di utilizzare l'area di lavoro del tavolo (RAM) nel modo più efficiente possibile durante la preparazione dei cibi o per l'immissione dei prodotti (dati del programma).

Introduzione.

Viene chiamata la lingua in cui è scritto il programma originale entratalingua e la lingua in cui viene tradotto per l'esecuzione da parte del processore è fine settimanalinguaggio. Viene chiamato il processo di conversione di una lingua di input in una lingua di output trasmissione.Poiché i processori sono in grado di eseguire programmi nel linguaggio macchina dei codici binari, che non viene utilizzato per la programmazione, è necessaria la traduzione di tutti i programmi sorgente. Conosciuto due stradetraduzioni: compilazione e interpretazione.

quando compilazioneil programma originale viene prima completamente tradotto in un programma equivalente nella lingua di output, chiamato oggettoprogramma e quindi eseguito. Questo processo viene implementato utilizzando uno speciale programmi,chiamato il compilatore.Viene chiamato un compilatore per il quale il linguaggio di input è una rappresentazione simbolica del linguaggio macchina (output) dei codici binari assemblatore.

quando interpretazioniogni riga di testo nel programma sorgente viene analizzata (interpretata) e il comando specificato in essa viene eseguito immediatamente. L'attuazione di questo metodo è affidata a programma interprete.L'interpretazione richiede molto tempo. Per aumentare la sua efficienza, invece di elaborare ogni riga, l'interprete converte prima tutto squadrastringhe a caratteri (

). La sequenza di simboli generata viene utilizzata per eseguire le funzioni assegnate al programma originale.

Il linguaggio assembly discusso di seguito viene implementato utilizzando la compilazione.

Caratteristiche della lingua.

Caratteristiche principali dell'assemblatore:

● invece dei codici binari, la lingua utilizza nomi simbolici - mnemonici.Ad esempio, per il comando di addizione (

) viene utilizzato lo mnemonico

Sottrazione (

moltiplicazione (

Divisioni (

e così via I nomi simbolici vengono utilizzati anche per indirizzare le posizioni di memoria. Per programmare in linguaggio assembly, invece di codici e indirizzi binari, è necessario conoscere solo nomi simbolici, che l'assemblatore traduce in codici binari;

ogni affermazione corrisponde un comando macchina(codice), cioè c'è una corrispondenza uno-a-uno tra le istruzioni della macchina e gli operatori in un programma in linguaggio assembly;

● la lingua fornisce l'accesso a tutti gli oggettie squadre. Le lingue di alto livello non hanno questa capacità. Ad esempio, il linguaggio assembly consente di controllare il bit di registro dei flag e un linguaggio di alto livello (ad esempio,

) non ha questa capacità. Notare che i linguaggi per la programmazione del sistema (ad esempio, C) spesso occupano una posizione intermedia. In termini di accessibilità, sono più vicini al linguaggio assembly, ma hanno una sintassi di alto livello;

● linguaggio assembly non è una lingua universale.Per ogni specifico gruppo di microprocessori ha il proprio assemblatore. Le lingue di alto livello non presentano questo svantaggio.

A differenza dei linguaggi di alto livello, la scrittura e il debug di un programma in linguaggio assembly richiedono molto tempo. Nonostante questo, il linguaggio assembly ha ricevuto ampio utilizzoa causa delle seguenti circostanze:

● un programma scritto in linguaggio assembly è molto più piccolo e funziona molto più velocemente di un programma scritto in un linguaggio di alto livello. Per alcune applicazioni, questi indicatori svolgono un ruolo primario, ad esempio, molti programmi di sistema (compresi i compilatori), programmi su carte di credito, telefoni cellulari, driver di dispositivo, ecc.;

● alcune procedure richiedono l'accesso completo all'hardware, che di solito non è possibile in un linguaggio di alto livello. Questo caso include interrupt e gestori di interrupt nei sistemi operativi, nonché controller di dispositivo nei sistemi embedded che operano in tempo reale.

Nella maggior parte dei programmi, solo una piccola percentuale del codice totale è responsabile di una grande percentuale del tempo di esecuzione del programma. In genere, l'1% del programma è responsabile del 50% del tempo di esecuzione e il 10% del programma è responsabile del 90% del tempo di esecuzione. Pertanto, per scrivere un programma specifico in condizioni reali, vengono utilizzati sia un assemblatore che uno dei linguaggi di alto livello.

Formato operatore in linguaggio assembly.

Un programma in linguaggio assembly è un elenco di comandi (istruzioni, frasi), ognuno dei quali occupa una riga separata e contiene quattro campi: un campo etichetta, un campo operazione, un campo operando e un campo commento. C'è una colonna separata per ogni campo.

Campo etichetta.

La colonna 1 è assegnata al campo etichetta. L'etichetta è un nome simbolico, o identificatore, indirizzimemoria. È necessario per poter:

● fare un salto condizionale o incondizionato al comando;

● accedere al luogo in cui sono archiviati i dati.

Tali affermazioni sono etichettate. Per designare il nome, vengono utilizzate lettere (maiuscole) dell'alfabeto inglese e numeri. Il nome deve essere preceduto da una lettera e la fine da un separatore di due punti. Un'etichetta con i due punti può essere scritta su una riga separata e un codice operativo sulla riga successiva nella colonna 2, il che semplifica il lavoro del compilatore. L'assenza di due punti non consente di distinguere un'etichetta da un codice operativo se si trovano su righe separate.

In alcune versioni del linguaggio assembly, i due punti vengono inseriti solo dopo le etichette dei comandi, ma non dopo le etichette dei dati e la lunghezza dell'etichetta può essere limitata a 6 o 8 caratteri.

Non dovrebbero esserci nomi identici nel campo dell'etichetta, poiché l'etichetta è associata agli indirizzi dei comandi. Se durante l'esecuzione del programma non è necessario richiamare un comando o dati dalla memoria, il campo dell'etichetta rimane vuoto.

Campo codice operazione.

Questo campo contiene il codice mnemonico del comando o pseudo comando (vedi sotto). Il codice mnemonico dei comandi è scelto dai progettisti del linguaggio. In linguaggio assembly

mnemonico selezionato per caricare il registro dalla memoria

), e per salvare il contenuto del registro in memoria - il mnemonico

). Nelle lingue assembly

per entrambe le operazioni può essere utilizzato un nome, rispettivamente

Se la scelta dei nomi mnemonici può essere arbitraria, la necessità di utilizzare due istruzioni macchina è dovuta all'architettura dei processori

Lo mnemonico del registro dipende anche dalla versione dell'assembler (Tabella 5.2.1).

Campo operando.

È qui che sono necessarie ulteriori informazioni per completare l'operazione. Nel campo degli operandi per le istruzioni di salto, viene indicato l'indirizzo dove si desidera saltare, nonché gli indirizzi e i registri, che sono operandi per un'istruzione di macchina. Come esempio, forniremo operandi che possono essere usati per processori a 8 bit

● dati numerici,

presentato in vari sistemi numerici. Per indicare il sistema numerico utilizzato, la costante è seguita da una delle lettere latine: B,

Di conseguenza, i sistemi numerici binari, ottali, esadecimali e decimali (

non è necessario scriverlo). Se la prima cifra di un numero esadecimale è A, B, C,

Quindi viene aggiunto uno 0 (zero) insignificante davanti;

● codici dei registri interni del microprocessore e delle celle di memoria

M (fonti o destinatari di informazioni) sotto forma di lettere A, B, C,

M oi loro indirizzi in qualsiasi sistema numerico (ad esempio, 10B - indirizzo di registrazione

nel sistema binario);

● identificatori,

per le coppie di registri di aeromobili,

Le prime lettere B,

H; per una coppia di accumulatori e registro di segni -

; per il contatore dei comandi -

; per lo stack pointer -

● etichette che indicano gli indirizzi degli operandi o le istruzioni successive nel condizionale

(se la condizione è soddisfatta) e salti incondizionati.Ad esempio, l'operando M1 nel comando

indica la necessità di andare incondizionatamente al comando, il cui indirizzo nel campo etichetta è contrassegnato con l'identificativo M1;

● espressioni,

che sono costruiti collegando i dati discussi sopra usando operatori aritmetici e logici. Notare che il modo in cui viene riservato lo spazio dati dipende dalla versione della lingua. Sviluppatori di linguaggi Assembly per

Definisci una parola) e successivamente introdusse un'alternativa.

che era nella lingua dei processori dall'inizio

Nella versione in lingua

usato da

Definisci una costante).

I processori elaborano operandi di diverse lunghezze. Per definirlo, gli sviluppatori dell'assemblatore hanno preso decisioni diverse, ad esempio:

II registri di lunghezze diverse hanno nomi diversi: ЕАХ - per posizionare operandi a 32 bit (tipo

); АХ - per 16 bit (tipo

e AH - per 8 bit (tipo

● per i processori

i suffissi vengono aggiunti a ogni codice operativo: suffisso

Per tipo

; suffisso ".B" per il tipo

per operandi di lunghezze diverse, vengono utilizzati codici operativi diversi, ad esempio, per caricare un byte, mezza parola (

) e parole nel registro a 64 bit, vengono utilizzati i codici op

rispettivamente.

Campo commenti.

Questo campo fornisce spiegazioni sulle azioni del programma. I commenti non influiscono sul funzionamento del programma e sono destinati agli esseri umani. Potrebbero essere necessari per modificare il programma, che senza tali commenti potrebbe essere completamente incomprensibile anche per programmatori esperti. Un commento inizia con un simbolo e viene utilizzato per spiegare e documentare i programmi. Il carattere iniziale di un commento può essere:

● punto e virgola (;) nelle lingue per i processori aziendali

● punto esclamativo (!) Nelle lingue per

Ogni riga di commento separata è preceduta da un carattere di inizio.

Pseudo-comandi (direttive).

In linguaggio assembly, ci sono due tipi principali di comandi:

di baseistruzioni che sono equivalenti al codice macchina del processore. Questi comandi eseguono tutte le elaborazioni fornite dal programma;

pseudo comandi,o direttive,progettato per servire il processo di traduzione di un programma nella lingua delle combinazioni di codice. Ad esempio, nella tabella. 5.2.2 vengono forniti alcuni pseudo-comandi dall'ac-sampler

per la famiglia

.

In fase di programmazione ci sono situazioni in cui, secondo l'algoritmo, la stessa catena di comandi deve essere ripetuta più volte. Per uscire da questa situazione, puoi:

● scrivere la sequenza di comandi desiderata ogni volta che si incontra. Questo approccio aumenta la dimensione del programma;

● formare questa sequenza in una procedura (subroutine) e richiamarla se necessario. Questo output ha i suoi svantaggi: ogni volta si deve eseguire un comando di chiamata di procedura speciale e un comando di ritorno, che, con una sequenza breve e di uso frequente, può ridurre notevolmente la velocità del programma.

Il modo più semplice ed efficiente per ripetere più volte una catena di comandi è usare macro,che può essere pensato come uno pseudo-comando progettato per ritrasmettere un gruppo di comandi incontrati frequentemente in un programma.

Una macro, o macro, è caratterizzata da tre aspetti: macrodefinizione, macroreverso e macroestensione.

Definizione macro

Questa è una designazione di una sequenza ripetuta ripetutamente di comandi di programma, utilizzata per i collegamenti nel testo del programma.

La definizione della macro ha la seguente struttura:

Elenco delle espressioni; Definizione macro

Tre parti possono essere distinte nella struttura sopra di una definizione macro:

● titolo

una macro che include un nome

Pseudo-comando

e una serie di parametri;

● contrassegnato con punti corpomacro;

● squadra

finali

macro.

Un insieme di parametri di definizione macro contiene un elenco di tutti i parametri elencati nel campo operando per il gruppo di comandi selezionato. Se questi parametri vengono forniti in precedenza nel programma, possono essere omessi nell'intestazione della definizione della macro.

Per riassemblare il gruppo di comandi selezionato, utilizzare l'indirizzo costituito dal nome

macro e un elenco di parametri con altri valori.

Quando l'assembler incontra una definizione di macro durante la compilazione, la memorizza nella tabella di definizione delle macro. Nelle successive apparizioni nel programma del nome (

) della macro, l'assembler lo sostituisce con il corpo della macro.

Viene chiamato l'utilizzo di un nome macro come codice operativo macro circolazione(da una chiamata macro), e la sua sostituzione con il corpo della macro è espansione macro.

Se il programma viene presentato come una sequenza di caratteri (lettere, numeri, spazi, punteggiatura e ritorno a capo per una nuova riga), l'espansione della macro consiste nel sostituire alcune stringhe di questa sequenza con altre stringhe.

L'espansione delle macro avviene durante il processo di assemblaggio, non durante l'esecuzione del programma. Il modo per manipolare le stringhe di caratteri è responsabilità di fondi macro.

Viene eseguito il processo di assemblaggio in due passaggi:

● al primo passaggio, tutte le definizioni delle macro vengono salvate e le chiamate delle macro vengono espanse. In questo caso, il programma originale viene letto e convertito in un programma in cui vengono rimosse tutte le definizioni di macro e ogni chiamata di macro viene sostituita da un corpo di macro;

● nel secondo passaggio, il programma risultante viene elaborato senza macro.

Macro parametrizzate.

Per lavorare con sequenze ripetute di comandi, i cui parametri possono assumere valori differenti, vengono fornite le seguenti macro definizioni:

● con effettivoparametri che sono posti nel campo degli operandi di chiamata macro;

● con formaleparametri. Nel processo di espansione della macro, ogni parametro formale che appare nel corpo della macro viene sostituito dal parametro effettivo corrispondente.

utilizzando macro con parametri.

Il programma 1 mostra due sequenze di comandi simili, che differiscono per il fatto che la prima scambia P e

E il secondo

Il programma 2 include una macro con due parametri formali P1 e P2. Durante l'espansione della macro, ogni carattere P1 all'interno del corpo della macro viene sostituito dal primo parametro effettivo (P,

) e P2 è sostituito dal secondo parametro effettivo (

) dal programma n. 1. Nella macrozona

il programma 2 è contrassegnato: P,

Il primo parametro effettivo,

Secondo parametro effettivo.

Programma 1

Programma 2

MOV EBX, Q MOV EAX, Pl

MOV Q, EAX MOV EBX, P2

MOV P, EBX MOV P2, EAX

Funzionalità estese.

Consideriamo alcune funzionalità avanzate del linguaggio

Se la macro contenente il comando del ramo condizionale e l'etichetta a cui viene creato il ramo viene chiamata due o più volte, l'etichetta verrà duplicata (il problema delle etichette duplicate), il che causerà un errore. Pertanto, ad ogni chiamata, viene assegnata (dal programmatore) un'etichetta separata come parametro. In lingua

l'etichetta è dichiarata locale (

) e grazie alle sue funzionalità avanzate, l'assembler genera automaticamente un'etichetta diversa ogni volta che viene espansa una macro.

ti permette di definire macro all'interno di altre macro. Questa funzionalità avanzata è molto utile se combinata con il collegamento condizionale. Tener conto di

SE WORDSIZE GT 16 M2 MACRO

La macro M2 può essere definita in entrambe le parti dell'istruzione

Tuttavia, la definizione dipende dal processore su cui è assemblato il programma: 16 bit o 32 bit. Se M1 non viene chiamato, la macro M2 non verrà definita affatto.

Un'altra caratteristica avanzata è che le macro possono chiamare altre macro, comprese se stesse - ricorsivochiamata. In quest'ultimo caso, per non ottenere un loop infinito, la macro deve passare a se stessa un parametro, che cambia ad ogni espansione, e inoltre dai un'occhiataquesto parametro e termina la ricorsione quando il parametro raggiunge un certo valore.

Informazioni sull'utilizzo delle macro in assembler.

Quando si utilizzano le macro, l'assemblatore deve essere in grado di eseguire due funzioni: preservare le macro-definizionie estendere le chiamate macro.

Conservazione delle macro.

Tutti i nomi delle macro vengono memorizzati in una tabella. Ogni nome è seguito da un puntatore alla macro corrispondente in modo che possa essere richiamato se necessario. Alcuni assemblatori hanno una tabella separata per i nomi delle macro, altri hanno una tabella generale, in cui, insieme ai nomi delle macro, si trovano tutte le istruzioni e le direttive della macchina.

Quando si incontra una macro durante l'assemblaggio creato:

nuovo elemento tavolocon il nome della macro, il numero di parametri e un puntatore ad un'altra tabella di definizioni di macro, dove verrà memorizzato il corpo della macro;

● elenco formaleparametri.

Quindi il corpo della macro viene letto e salvato nella tabella delle definizioni delle macro, che è solo una stringa di simboli. I parametri formali trovati nel corpo del loop sono contrassegnati da un simbolo speciale.

Rappresentazione interna di una macro

dall'esempio sopra per il programma 2 (p. 244) è:

MOV EAX, MOV EBX, MOV MOV e

dove un punto e virgola viene utilizzato come carattere di ritorno a capo e la e commerciale & viene utilizzata come carattere di parametro formale.

Estensione delle chiamate macro.

Ogni volta che viene rilevata una macro durante l'assemblaggio, viene memorizzata nella tabella delle macro. Quando la macro viene chiamata, l'assembler sospende temporaneamente la lettura dell'input dal dispositivo di input e inizia a leggere il corpo della macro salvato. I parametri formali estratti dal corpo della macro vengono sostituiti con i parametri effettivi e forniti dal bando. La e commerciale & davanti ai parametri consente al campionatore di riconoscerli.

Nonostante il fatto che ci siano molte versioni di assembler, i processi di assemblaggio hanno caratteristiche comuni e sono simili in molti modi. Il lavoro dell'assemblatore a due passaggi è discusso di seguito.

Assemblatore a due passaggi.

Il programma è composto da una serie di operatori. Pertanto, sembrerebbe che durante il montaggio, sia possibile utilizzare la seguente sequenza di azioni:

● tradurlo in linguaggio macchina;

● trasferire il codice macchina ricevuto in un file e la parte corrispondente dell'elenco - in un altro file;

● ripetere le procedure di cui sopra fino alla traduzione dell'intero programma.

Tuttavia, questo approccio non è efficace. Un esempio è il cosiddetto problema collegamenti di lookahead.Se la prima istruzione è un salto all'istruzione P situata alla fine del programma, l'assembler non può tradurla. Deve prima determinare l'indirizzo dell'operatore P, e per questo è necessario leggere l'intero programma. Viene richiamata ogni lettura completa del programma originale corridoio.Mostriamo come è possibile risolvere il problema del collegamento in avanti utilizzando due passaggi:

segue il primo passaggio raccoglieree salvare nella tabella tutte le definizioni dei simboli (comprese le etichette), e al secondo passaggio leggere e assemblare ogni operatore. Questo metodo è relativamente semplice, ma il secondo passaggio attraverso il programma originale richiede tempo aggiuntivo dedicato alle operazioni di I / O;

● al primo passaggio, trasformareprogramma in una forma intermedia e salvarlo nella tabella, ed eseguire il secondo passaggio non secondo il programma originale, ma secondo la tabella. Questo metodo di assemblaggio consente di risparmiare tempo, poiché al secondo passaggio non viene eseguito alcun I / O.

Primo passaggio.

Obiettivo del primo passaggio- costruire una tabella dei simboli. Come notato sopra, un altro obiettivo del primo passaggio è preservare tutte le macro ed espandere le chiamate man mano che vengono visualizzate. Pertanto, sia la definizione del simbolo che l'espansione della macro avvengono in un unico passaggio. Il simbolo può essere uno dei due etichetta,o valore,a cui viene assegnato un nome specifico utilizzando la direttiva:

; Valore - dimensione del buffer

Assegnando valori ai nomi simbolici nel campo dell'etichetta dell'istruzione, l'assemblatore imposta essenzialmente gli indirizzi che ciascuna istruzione avrà durante l'esecuzione del programma. Per questo, l'assemblatore durante il processo di assemblaggio risparmia contatore indirizzo comando(

) come variabile speciale. All'inizio del primo passaggio, il valore della variabile speciale è impostato a 0 e aumenta dopo ogni comando elaborato della lunghezza di questo comando. Ad esempio, nella tabella. 5.2.3 è un frammento del programma che indica la lunghezza dei comandi e i valori del contatore. Al primo passaggio, vengono formate le tabelle nomi simbolici, direttivee codici operativi,e se necessario letteraletavolo. Un letterale è una costante per la quale l'assemblatore riserva automaticamente la memoria. Immediatamente, notiamo che i processori moderni contengono istruzioni con indirizzi immediati, quindi i loro acsembler non supportano i letterali.

Tabella dei nomi simbolici

contiene un elemento per ogni nome (Tabella 5.2.4). Ogni elemento della tabella dei nomi simbolici contiene il nome stesso (o un puntatore ad esso), il suo valore numerico e talvolta alcune informazioni aggiuntive, che possono includere:

● la lunghezza del campo dati associato al simbolo;

● bit di riallocazione della memoria (che mostrano se il valore del simbolo cambia se il programma viene caricato in un indirizzo diverso da quello previsto dall'assembler);

● informazioni sulla possibilità di accedere al simbolo dall'esterno della procedura.

I nomi simbolici sono etichette. Possono essere specificati utilizzando operatori (ad esempio,

Tabella direttiva.

Questa tabella elenca tutte le direttive, o pseudo-comandi, che si verificano durante l'assemblaggio di un programma.

Tabella dei codici di funzionamento.

Per ogni codice operazione, la tabella fornisce colonne separate: designazione del codice operazione, operando 1, operando 2, valore esadecimale del codice operazione, lunghezza del comando e tipo di comando (Tabella 5.2.5). I codici di operazione sono divisi in gruppi a seconda del numero e del tipo di operandi. Il tipo di comando determina il numero del gruppo e specifica la procedura chiamata per elaborare tutti i comandi in questo gruppo.

Secondo passaggio.

Obiettivo del secondo passaggio- creazione di un programma oggetto e stampa, se necessario, del protocollo di montaggio; output delle informazioni necessarie al linker per collegare le procedure che sono state assemblate in momenti diversi in un file eseguibile.

Nel secondo passaggio (come nel primo), le righe contenenti le istruzioni vengono lette ed elaborate una dopo l'altra. L'operatore originale e l'output risultante in sistema esadecimale oggettoil codice può essere stampato o tamponato per la stampa successiva. Dopo aver resettato il contatore dell'indirizzo di comando, viene chiamata l'istruzione successiva.

Il programma originale potrebbe contenere errori, ad esempio:

il simbolo dato è indefinito o definito più di una volta;

● il codice operativo è rappresentato da un nome non valido (a causa di un errore di battitura), non è fornito con un numero sufficiente di operandi o ha troppi operandi;

● non c'è operatore

Alcuni assemblatori possono prendere un simbolo indefinito e sostituirlo. Tuttavia, nella maggior parte dei casi, quando viene rilevata un'istruzione con un errore, l'assembler visualizza un messaggio di errore sullo schermo e tenta di continuare il processo di assemblaggio.

Articoli dedicati al linguaggio assembly.

Affinché una macchina possa eseguire comandi umani a livello hardware, è necessario impostare una certa sequenza di azioni nel linguaggio di "zeri e uno". L'assemblatore diventerà un assistente in questa materia. È un'utilità che funziona con la traduzione di comandi in linguaggio macchina. Tuttavia, scrivere un programma è un processo molto laborioso e complesso. Questo linguaggio non ha lo scopo di creare azioni facili e semplici. Al momento, qualsiasi linguaggio di programmazione utilizzato (Assembler funziona alla grande) consente di scrivere attività speciali efficienti che influenzano notevolmente il funzionamento dell'hardware. Lo scopo principale è creare microistruzioni e piccoli codici. Questo linguaggio offre più possibilità rispetto, ad esempio, Pascal o C.

Una breve descrizione dei linguaggi assembler

Tutti i linguaggi di programmazione sono suddivisi in livelli: basso e alto. Qualsiasi sistema sintattico della "famiglia" di Assembler differisce in quanto combina alcuni dei vantaggi dei linguaggi più comuni e moderni allo stesso tempo. Hanno in comune con altri che il sistema informatico può essere completamente utilizzato.

Una caratteristica distintiva del compilatore è la sua facilità d'uso. Questo è ciò che lo rende diverso da quelli che funzionano solo con livelli elevati. Se si prende in considerazione tale linguaggio di programmazione, Assembler è due volte più veloce e migliore. Non ci vuole troppo tempo per scrivere un programma leggero al suo interno.

Brevemente sulla struttura della lingua

Se parliamo in generale del lavoro e della struttura del funzionamento del linguaggio, possiamo dire con certezza che i suoi comandi corrispondono pienamente a quelli del processore. Cioè, l'Assemblatore utilizza codici mnemonici che sono più convenienti da scrivere per gli umani.

A differenza di altri linguaggi di programmazione, Assembler utilizza etichette specifiche invece di indirizzi per scrivere posizioni di memoria. Vengono tradotti nelle cosiddette direttive con il processo di esecuzione del codice. Si tratta di indirizzi relativi che non influiscono sul funzionamento del processore (non vengono tradotti in linguaggio macchina), ma sono necessari per il riconoscimento da parte dell'ambiente di programmazione stesso.

Ogni linea di processore ha la sua, in questa situazione qualsiasi processo sarà corretto, compreso quello tradotto

Il linguaggio Assembly ha diverse sintassi, che saranno discusse nell'articolo.

Vantaggi del linguaggio

La caratteristica più importante e conveniente del linguaggio assembly sarà che puoi scrivere qualsiasi programma per il processore al suo interno, che sarà molto compatto. Se il codice risulta essere enorme, alcuni processi vengono reindirizzati alla RAM. Allo stesso tempo, eseguono tutto abbastanza rapidamente e senza errori, a meno che, ovviamente, non siano controllati da un programmatore qualificato.

Driver, sistemi operativi, BIOS, compilatori, interpreti, ecc. Sono tutti programmi in linguaggio assembly.

Quando si utilizza un disassemblatore che si traduce da macchina a macchina, è possibile comprendere facilmente come funziona una particolare attività di sistema, anche se non vi è alcuna spiegazione. Tuttavia, questo è possibile solo se i programmi sono leggeri. Sfortunatamente, è abbastanza difficile capire codici non banali.

Contro del linguaggio

Sfortunatamente, è difficile per i programmatori principianti (e spesso per i professionisti) analizzare il linguaggio. L'assemblatore richiede una descrizione dettagliata del comando richiesto. A causa della necessità di utilizzare le istruzioni della macchina, aumenta la probabilità di azioni errate e la complessità dell'esecuzione.

Per scrivere anche il programma più semplice, un programmatore deve essere qualificato e il suo livello di conoscenza è sufficientemente alto. Lo specialista medio, sfortunatamente, scrive spesso codici errati.

Se la piattaforma per la quale viene creato il programma viene aggiornata, tutti i comandi devono essere riscritti manualmente - ciò è richiesto dalla lingua stessa. L'assemblatore non supporta la funzione di regolazione automatica dello stato di salute dei processi e la sostituzione di eventuali elementi.

Comandi della lingua

Come accennato in precedenza, ogni processore ha il proprio set di istruzioni. Gli elementi più semplici che vengono riconosciuti da qualsiasi tipo sono i seguenti codici:


Utilizzo delle direttive

La programmazione dei microcontrollori nel linguaggio (l'Assembler lo consente e ne affronta il funzionamento perfettamente) di livello più basso nella maggior parte dei casi finisce bene. È preferibile utilizzare processori con risorse limitate. Per la tecnologia a 32 bit, questo linguaggio è eccellente. Spesso puoi vedere le direttive nei codici. Cos'è questo? E a cosa serve?

Innanzitutto, è necessario sottolineare che le direttive non sono tradotte in linguaggio macchina. Governano come funziona il compilatore. A differenza dei comandi, questi parametri, avendo funzioni diverse, differiscono non a causa di processori diversi, ma a causa di un diverso traduttore. Tra le principali direttive ci sono le seguenti:


origine del nome

Perché la lingua ha preso il nome: "Assembler"? Stiamo parlando di un traduttore e di un compilatore, che crittografano i dati. In inglese, Assembler non significa altro che un assemblatore. Il programma non è stato assemblato manualmente, è stata utilizzata una struttura automatica. Inoltre, al momento, la differenza tra i termini è già scomparsa tra utenti e specialisti. Il linguaggio assembly viene spesso definito linguaggi di programmazione, sebbene sia solo un'utilità.

A causa del nome collettivo generalmente accettato, alcune persone prendono la decisione errata che esiste un'unica lingua di basso livello (o norme standard per essa). Affinché il programmatore possa capire di quale struttura stiamo parlando, è necessario chiarire per quale piattaforma viene utilizzato questo o quel linguaggio assembly.

Strumenti macro

I linguaggi di assemblaggio, che sono relativamente recenti, hanno strutture macro. Rendono il programma più facile da scrivere ed eseguire. A causa della loro presenza, il traduttore esegue il codice scritto molte volte più velocemente. Quando crei una selezione condizionale, puoi scrivere un enorme blocco di comandi ed è più facile usare gli strumenti macro. Ti permetteranno di passare rapidamente da un'azione all'altra nel caso in cui una condizione venga soddisfatta o meno.

Quando si utilizzano le direttive del linguaggio macro, il programmatore riceve le macro assembly. A volte può essere ampiamente utilizzato e talvolta la sua funzionalità è ridotta a un comando. La loro presenza nel codice rende più facile lavorare con esso, lo rende più chiaro e più intuitivo. Tuttavia, dovresti comunque fare attenzione: in alcuni casi, le macro, al contrario, peggiorano la situazione.

LA CAMPANA

C'è chi ha letto questa notizia prima di te.
Iscriviti per ricevere gli ultimi articoli.
E-mail
Nome
Cognome
Come vuoi leggere The Bell
Niente spam