Linguaggio assembly Comandi e fondamentali di Assembler

08/04/2019

L'articolo discuterà le basi del linguaggio assembler in relazione all'architettura win32. È una registrazione simbolica di codici macchina. In qualsiasi computer elettronico, il livello più basso è l'hardware. Qui la gestione dei processi avviene con istruzioni o istruzioni in linguaggio macchina. È in quest'area che l'assemblatore intende funzionare.

Programmazione Assembler

Scrivere un programma in assemblatore è un processo estremamente difficile e costoso. Per creare un algoritmo efficiente, è necessaria una profonda comprensione del funzionamento di un computer, la conoscenza dei dettagli dei comandi, nonché una maggiore attenzione e accuratezza. L'efficienza è un parametro critico per la programmazione in assembler.

Come funziona la programmazione sull'assemblatore

Il vantaggio principale del linguaggio assembler è che consente di creare programmi brevi e veloci. Pertanto, viene utilizzato, di regola, per risolvere problemi specializzati. È necessario un codice che funzioni in modo efficiente con i componenti hardware oppure è necessario un programma che richiede memoria o runtime.

registri

I registri nel linguaggio assemblatore sono chiamati celle di memoria situate direttamente su un chip con un ALU (processore). Una caratteristica di questo tipo di memoria è la velocità di accesso ad esso, che è molto più veloce della RAM di un computer. Si chiama anche ultra-veloce RAM (PopS o SRAM).

Esistono i seguenti tipi di registri:

  1. Registri di scopo generale (RON).
  2. Bandiere.
  3. Puntatore di comando
  4. Registri di segmento.
Registri di assemblaggio

Esistono 8 registri general-purpose, ciascuno di 32 bit.

È possibile accedere ai registri EAX, ECX, EDX, EBX in modalità a 32 bit, 16 bit - AX, BX, CX, DX e anche 8 bit - AH e AL, BH e BL, ecc.

La lettera "E" nei nomi dei registri significa estesa (estesa). I nomi stessi sono correlati ai loro nomi in inglese:

  • Registro accumulatore (AX) - per operazioni aritmetiche.
  • Registro contatore (CX) - per turni e cicli.
  • Registro dati (DX) - per operazioni aritmetiche e I / O.
  • Base register (BX) - per un puntatore ai dati.
  • Stack Pointer register (SP) - per un puntatore in cima alla pila.
  • Registro puntatore base stack (BP) - per l'indicatore della base della pila.
  • Registro indice di origine (SI) - per il puntatore del mittente (sorgente).
  • Registro indice di destinazione (DI) - per il destinatario.

Il linguaggio di assemblaggio RON di specializzazione è condizionale. Possono essere utilizzati in qualsiasi operazione. Tuttavia, alcuni comandi sono in grado di utilizzare solo determinati registri. Ad esempio, i comandi di loop utilizzano ESX per memorizzare il valore del contatore.

Registro delle bandiere. Questo implica un byte, che può assumere i valori 0 e 1. La combinazione di tutti i flag (ce ne sono circa 30) mostra lo stato del processore. Esempi di flag: Carry Flag (CF) - Porta flag, Overflow Flag (OF) - Overflow, Nested Flag (NT) - flag di nidificazione delle attività e molti altri. Le bandiere sono divise in 3 gruppi: stato, gestione e sistema.

Registri flag processore

Comando Indice (EIP - Puntatore di istruzioni). Questo registro contiene l'indirizzo dell'istruzione, che deve essere eseguita successivamente, se non diversamente specificato.

Registri di segmenti (CS, DS, SS, ES, FS, GS). La loro presenza nell'assemblatore è dettata da uno speciale controllo della RAM per aumentarne l'uso nei programmi. Grazie a loro, è stato possibile gestire la memoria fino a 4 GB. Nell'architettura Win32, non sono necessari segmenti, ma i nomi dei registri vengono conservati e utilizzati in modo diverso.

Pila di

Questa è un'area di memoria allocata per le procedure in esecuzione. La particolarità della pila è che gli ultimi dati scritti sono disponibili per la lettura. O in altre parole: le prime voci dello stack vengono recuperate per ultime. Puoi immaginare questo processo come una torre di bozze. Per ottenere una pedina (pedina in basso alla base della torre o qualcuna nel mezzo) devi prima rimuovere tutto ciò che si trova in cima. E, di conseguenza, l'ultimo pezzo messo sulla torre, viene rimosso per primo quando si analizza la torre. Questo principio di organizzazione della memoria e di lavoro con esso è dettato dalla sua economia. Lo stack viene costantemente cancellato e in ogni momento viene utilizzato da una sola procedura.

Impila il lavoro in assemblatore

Identificatori, numeri interi, simboli, commenti, equivalenza

L'identificatore nell'assembler del linguaggio di programmazione ha lo stesso significato di un altro. Sono consentiti lettere latine, numeri e simboli "_", ".", "?", "@", "$". In questo caso, le lettere maiuscole e minuscole sono equivalenti e un punto può essere solo il primo carattere dell'identificatore.

I numeri interi nell'assemblatore possono essere specificati in sistemi di riferimento con basi 2, 8, 10 e 16. Qualsiasi altra immissione di numeri sarà considerata dall'assemblatore come un identificatore.

È consentito utilizzare sia gli apostrofi che le virgolette nella scrittura dei dati dei caratteri. Se è necessario specificarne uno nella stringa di caratteri, le regole sono le seguenti:

  • nella linea racchiusa tra gli apostrofi, le virgolette sono indicate una volta, l'apostrofo - due volte: "impossibile", "ha detto" essere o non essere ";
  • per una stringa racchiusa tra virgolette, la regola è l'opposto: le virgolette doppie sono duplicate, gli apostrofi sono indicati così: "impossibile", "La mia barra preferita è" "Gatto nero" "".

Per indicare i commenti nella lingua assembler, viene utilizzato il simbolo punto e virgola - ";". È consentito utilizzare commenti sia all'inizio delle righe che dopo il comando. Il commento termina con una nuova riga.

La direttiva di equivalenza è utilizzata in modo simile ad altre espressioni costanti. L'equivalenza è indicata come segue:

  EQU  

Quindi nel programma tutte le occorrenze sarà sostituito da al posto del quale è possibile indicare un numero intero, indirizzo, stringa o altro nome. La direttiva EQU è simile nel suo lavoro a #define in C ++.

Direttive sui dati

I linguaggi di alto livello (C ++, Pascal) vengono digitati. Cioè, usano dati che hanno un certo tipo, ci sono funzioni per elaborarli, ecc. Nell'assembler del linguaggio di programmazione, non esiste una cosa del genere. Ci sono solo 5 direttive per la definizione dei dati:

  1. DB - Byte: alloca 1 byte per una variabile.
  2. DW - Word: selezionare 2 byte.
  3. DD - Doppia parola: seleziona 4 byte.
  4. DQ - Quad parola: selezionare 8 byte.
  5. DT: dieci byte: allocare 10 byte per una variabile.

La lettera D significa Definisci.

Qualsiasi direttiva può essere utilizzata per dichiarare qualsiasi dato e array. Tuttavia, per le stringhe, si consiglia DB.

sintassi:

  DQ [, ]   DQ [, ]   DQ [, ] 

Come operando, è consentito utilizzare numeri, simboli e un punto interrogativo - "?", Che indica una variabile senza inizializzazione. Considera esempi:

 real1 DD 12.34char db 'c'ar2 db '123456',0 ; массив из 7 байтnum1 db 11001001b ; двоичное числоnum2 dw 7777o ; восьмеричное числоnum3 dd -890d ; десятичное числоnum4 dd 0beah ; шестнадцатеричное числоvar1 dd ? ; переменная без начального значенияar3 dd 50 dup (0) ; массив из 50 инициализированных эл-товar4 dq 5 dup (0, 1, 1.25) ; массив из 15 эл-тов, инициализированный повторами 0, 1 и 1.25 

Comandi (istruzioni)

La sintassi dei comandi assembler o istruzioni assembler è la seguente:

    

Un'etichetta (etichetta :) deve terminare con due punti e può essere posizionata su una riga separata. Le etichette sono usate per riferirsi a comandi all'interno di un programma.

Le istruzioni indicano l'operazione da eseguire. Nell'assembler le operazioni sono presentate sotto forma di abbreviazioni di lettere per facilitare la comprensione. Le istruzioni possono anche essere chiamate mnemoniche.

Nel ruolo degli operandi i comandi possono essere:

  • registri accessibili con il loro nome;
  • costanti;
  • indirizzi.

Ulteriori informazioni sugli indirizzi

L'indirizzo può essere trasmesso in diversi modi:

  1. Sotto forma di nome di variabile, che nell'assemblatore è sinonimo di indirizzo.
  2. Se la variabile è una matrice, l'accesso all'elemento array avviene tramite il nome della sua variabile e offset. Ci sono 2 moduli per questo: [<nome> + <offset>] e <nome> [<offset>]. Si noti che l'offset non è un indice nell'array, ma una dimensione in byte. Lo stesso programmatore deve capire quanto deve essere eseguito un offset in byte per ottenere l'elemento desiderato dell'array.
  3. Puoi usare i registri. Per accedere alla memoria in cui è memorizzato il registro, è necessario utilizzare parentesi quadre: [ebx], [edi].
  4. [] - le parentesi consentono l'uso di espressioni complesse dentro di sé per calcolare l'indirizzo: [esi + 2 * eax].

Nell'assemblatore, l'indirizzo viene trasmesso attraverso parentesi quadre. Poiché la variabile è anche un indirizzo, può essere utilizzata con o senza parentesi quadre.

Indirizzo in assembler

Inoltre, nell'assembler ci sono le abbreviazioni: r per i registri, m per la memoria e i per l'operando. Queste abbreviazioni vengono utilizzate con i numeri 8, 16 e 32 per indicare la dimensione dell'operando: r8, m16, i32, ecc.

 add i8/i16/i32, m8/m16/m32 ;суммирование операнда с ячейкой памяти 

Comando di movimento o avanti

Questa istruzione è la principale tra i comandi dell'assemblatore. Permette di scrivere sul registro il valore di un altro registro, una cella di memoria o una costante. Scrive anche il valore di un registro o una costante in una cella di memoria. Sintassi del comando:

 MOV ,  MOV ,  

Ci sono altri comandi nel processore per implementare il trasferimento. Ad esempio, XCHG è un comando per lo scambio di operandi in base ai valori. Ma dal punto di vista del programmatore, sono tutti implementati attraverso il comando MOV di base. Considera esempi:

 MOV i, 0 ; Записать в i значение 0MOV ECX, EBX ; Пересылка значения EBX в ECX 

Nella forma di un operando può agire come un registro e una cella di memoria. Tuttavia, se il contenuto dei due registri può essere riorganizzato, non ci sono due celle di memoria. Bisogna fare attenzione per garantire che gli operandi abbiano le stesse dimensioni. Si noti inoltre che il comando MOV non modifica il valore dei flag.

Comando MOV in assembler

strumenti

Un ulteriore studio teorico dell'assemblatore può essere difficile, quindi dovresti pensare agli strumenti utilizzati per sviluppare programmi con esso. Qui vedrai solo una breve lista di strumenti popolari:

  • Borland Turbo Assembler (TASM) è uno degli strumenti più popolari. Buono per lo sviluppo sotto DOS e cattivo per Windows.
  • Microsoft Macro Assembler (MASM) è un pacchetto per lo sviluppo in linguaggio assembly in ambiente Windows. Esiste sia separatamente che come funzione integrata nell'ambiente di Visual Studio. Assembler e linguaggi di alto livello sono spesso compatibili. Nel senso che quest'ultimo può usare direttamente l'assemblatore. Ad esempio, C ++.
  • Netwide Assembler (NASM) è un popolare assemblatore gratuito per l'architettura Intel.
Programmazione Assembler

Ci sono molti strumenti In questo caso, dovresti fare una nota speciale che non esiste uno standard uniforme per la sintassi dell'assemblatore. Ci sono 2 più applicabili: sintassi AT & T, focalizzata su processori di produzione non Intel e, di conseguenza, sintassi Intel.

Nonostante l'apparente complessità, l'assemblatore è un semplice linguaggio di programmazione, che è facile da capire. Pertanto, puoi tranquillamente usare la letteratura educativa sulla somiglianza di "assemblatore per manichini" e imparare questa meravigliosa lingua.