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.
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.
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.
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).
Ad
Esistono i seguenti tipi di registri:
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:
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.
Ad
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.
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.
Ad
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:
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
Ad
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:
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
La sintassi dei comandi assembler o istruzioni assembler è la seguente:
Ad
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:
L'indirizzo può essere trasmesso in diversi modi:
Nell'assemblatore, l'indirizzo viene trasmesso attraverso parentesi quadre. Poiché la variabile è anche un indirizzo, può essere utilizzata con o senza parentesi quadre.
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 ;суммирование операнда с ячейкой памяти
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.
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:
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.