Limbaj de asamblare | limbaj de programare
Un limbaj de asamblare este un limbaj de programare care poate fi utilizat pentru a indica direct calculatorului ce trebuie să facă. Un limbaj de asamblare este aproape exact ca și codul mașinii pe care îl poate înțelege un computer, cu excepția faptului că folosește cuvinte în loc de numere. Un computer nu poate înțelege în mod direct un program de asamblare. Cu toate acestea, el poate transforma cu ușurință programul în cod mașină prin înlocuirea cuvintelor din program cu numerele pe care le reprezintă. Un program care face acest lucru se numește asamblor.
Programele scrise în limbaj de asamblare sunt de obicei formate din instrucțiuni, care sunt mici sarcini pe care calculatorul le execută atunci când rulează programul. Ele se numesc instrucțiuni deoarece programatorul le folosește pentru a indica computerului ce trebuie să facă. Partea calculatorului care urmează instrucțiunile este procesorul.
Limbajul de asamblare al unui calculator este un limbaj de nivel scăzut, ceea ce înseamnă că poate fi utilizat doar pentru a îndeplini sarcini simple pe care un calculator le poate înțelege direct. Pentru a efectua sarcini mai complexe, trebuie să se spună calculatorului fiecare dintre sarcinile simple care fac parte din sarcina complexă. De exemplu, un computer nu înțelege cum să tipărească o propoziție pe ecran. În schimb, un program scris în asamblare trebuie să îi spună cum să facă toți pașii mici care sunt implicați în imprimarea propoziției.
Un astfel de program de asamblare ar fi compus din multe, multe instrucțiuni care, împreună, fac ceva ce pare foarte simplu și de bază pentru un om. Acest lucru face ca oamenilor să le fie greu să citească un program de asamblare. În schimb, un limbaj de programare de nivel înalt poate avea o singură instrucțiune, cum ar fi PRINT "Hello, world!", care îi va spune computerului să îndeplinească toate sarcinile mici pentru dumneavoastră.
Dezvoltarea limbajului de asamblare
Atunci când cercetătorii în domeniul informaticii au construit primele mașini programabile, acestea erau programate direct în codul mașinii, care este o serie de numere care instruiesc calculatorul ce trebuie să facă. Scrierea limbajului de mașină era foarte greu de realizat și dura foarte mult timp, așa că, în cele din urmă, a fost creat un limbaj de asamblare. Limbajul de asamblare este mai ușor de citit pentru un om și poate fi scris mai repede, dar este în continuare mult mai greu de utilizat de către un om decât un limbaj de programare de nivel înalt care încearcă să imite limbajul uman.
Programarea în cod mașină
Pentru a programa în cod mașină, programatorul trebuie să știe cum arată fiecare instrucțiune în binar (sau hexazecimal). Deși este ușor pentru un computer să își dea seama rapid ce înseamnă codul mașină, este greu pentru un programator. Fiecare instrucțiune poate avea mai multe forme, toate acestea semănând doar cu o grămadă de numere pentru oameni. Orice greșeală pe care o face cineva în timp ce scrie codul mașină va fi observată doar atunci când calculatorul face un lucru greșit. Descoperirea greșelii este dificilă deoarece majoritatea oamenilor nu pot spune ce înseamnă codul mașină doar uitându-se la el. Un exemplu de cum arată codul mașină:
05 2A 00
Acest cod mașină hexazecimal îi spune unui procesor de calculator x86 să adauge 42 în acumulator. Este foarte dificil pentru o persoană să îl citească și să îl înțeleagă, chiar dacă aceasta cunoaște codul mașină.
Utilizarea limbajului de asamblare
În limbajul de asamblare, fiecare instrucțiune poate fi scrisă ca un cuvânt scurt, numit mnemonic, urmat de alte elemente, cum ar fi numere sau alte cuvinte scurte. Mnemotehnica este utilizată pentru ca programatorul să nu fie nevoit să rețină numerele exacte din codul mașină necesare pentru a spune computerului să facă ceva. Exemple de mnemotehnici în limbajul de asamblare includ add, care adaugă date, și mov, care mută datele dintr-un loc în altul. Deoarece "mnemotehnică" este un cuvânt neobișnuit, uneori se folosește în schimb, adesea în mod incorect, expresia tip de instrucțiune sau doar instrucțiune. Cuvintele și numerele de după primul cuvânt oferă mai multe informații despre ce trebuie făcut. De exemplu, lucrurile care urmează după o adunare ar putea fi ce două lucruri să se adune împreună, iar lucrurile care urmează după mutare spun ce trebuie mutat și unde trebuie pus.
De exemplu, codul mașină din secțiunea anterioară (05 2A 00) poate fi scris în asamblare sub forma:
adaugă ax,42
De asemenea, limbajul de asamblare le permite programatorilor să scrie mai ușor datele reale pe care le utilizează programul. Majoritatea limbajelor de asamblare au suport pentru a realiza cu ușurință numere și text. În codul mașină, fiecare tip diferit de număr, cum ar fi pozitiv, negativ sau zecimal, ar trebui să fie convertit manual în binar, iar textul ar trebui să fie definit literă cu literă, ca numere.
Limbajul de asamblare oferă ceea ce se numește o abstractizare a codului mașină. Atunci când se utilizează limbajul de asamblare, programatorii nu trebuie să cunoască detaliile legate de semnificația numerelor pentru calculator, ci asamblorul își dă seama de acest lucru. De fapt, limbajul de asamblare îi permite programatorului să utilizeze toate caracteristicile procesorului pe care le-ar putea utiliza cu codul mașină. În acest sens, limbajul de asamblare are o trăsătură foarte bună și rară: are aceeași capacitate de a exprima lucruri ca și lucrul pe care îl abstractizează (codul mașină), fiind în același timp mult mai ușor de utilizat. Din acest motiv, codul mașină nu este aproape niciodată folosit ca limbaj de programare.
Dezasamblare și depanare
Atunci când programele sunt terminate, ele au fost deja transformate în cod mașină, astfel încât procesorul să le poată rula efectiv. Uneori, însă, dacă programul conține o eroare (greșeală), programatorii vor dori să poată spune ce face fiecare parte a codului mașină. Dezasamblatorii sunt programe care îi ajută pe programatori să facă acest lucru, transformând codul mașină al programului înapoi în limbaj de asamblare, care este mult mai ușor de înțeles. Dezasamblatoarele, care transformă codul mașină în limbaj de asamblare, fac opusul asamblatorilor, care transformă limbajul de asamblare în cod mașină.
Organizarea calculatoarelor
Pentru a înțelege cum funcționează un program în limbaj de asamblare, este necesară o înțelegere a modului în care sunt organizate calculatoarele, a modului în care acestea par să funcționeze la un nivel foarte scăzut. La nivelul cel mai simplist, calculatoarele au trei părți principale:
- memoria principală sau RAM care conține date și instrucțiuni,
- un procesor, care prelucrează datele prin executarea instrucțiunilor, și
- intrare și ieșire (uneori prescurtat I/O), care permit calculatorului să comunice cu lumea exterioară și să stocheze date în afara memoriei principale pentru a le putea recupera ulterior.
Memorie principală
În majoritatea computerelor, memoria este împărțită în bytes. Fiecare octet conține 8 biți. Fiecare octet din memorie are, de asemenea, o adresă, care este un număr care indică locul în care se află octetul în memorie. Primul octet din memorie are adresa 0, următorul are adresa 1 și așa mai departe. Împărțirea memoriei în octeți o face adresabilă pe octeți, deoarece fiecare octet primește o adresă unică. Adresele memoriilor de octeți nu pot fi utilizate pentru a se referi la un singur bit al unui octet. Un octet este cea mai mică bucată de memorie care poate fi adresată.
Chiar dacă o adresă se referă la un anumit octet din memorie, procesoarele permit utilizarea mai multor octeți de memorie la rând. Cea mai frecventă utilizare a acestei caracteristici este folosirea a 2 sau 4 octeți într-un rând pentru a reprezenta un număr, de obicei un număr întreg. Uneori se folosesc și octeți unici pentru a reprezenta numere întregi, dar, deoarece au o lungime de numai 8 biți, pot conține numai 28 sau 256 de valori posibile diferite. Utilizarea a 2 sau 4 octeți într-un rând crește numărul de valori posibile diferite la 216 , 65536 sau, respectiv, 232 , 4294967296.
Atunci când un program folosește un octet sau un număr de octeți la rând pentru a reprezenta ceva precum o literă, un număr sau orice altceva, acei octeți sunt numiți un obiect, deoarece toți fac parte din același lucru. Chiar dacă obiectele sunt toate stocate în octeți identici de memorie, ele sunt tratate ca și cum ar avea un "tip", care spune cum ar trebui să fie înțeleși octeții: fie ca un număr întreg, fie ca un caracter sau ca un alt tip (cum ar fi o valoare non-integrală). Codul mașinii poate fi considerat, de asemenea, ca un tip care este interpretat ca instrucțiuni. Noțiunea de tip este foarte, foarte importantă, deoarece definește ce se poate face și ce nu se poate face cu obiectul și cum se interpretează octeții obiectului. De exemplu, nu este validă stocarea unui număr negativ într-un obiect de tip număr pozitiv și nu este validă stocarea unei fracții într-un număr întreg.
O adresă care indică (este adresa unui) obiect multibyte este adresa primului octet al acelui obiect - octetul care are cea mai mică adresă. Ca o paranteză, un lucru important de reținut este faptul că nu se poate spune care este tipul unui obiect - sau chiar dimensiunea acestuia - după adresa sa. De fapt, nu puteți spune ce tip este un obiect nici măcar uitându-vă la el. Un program în limbaj de asamblare trebuie să țină evidența adreselor de memorie care conțin ce obiecte și cât de mari sunt aceste obiecte. Un program care face acest lucru este sigur din punct de vedere al tipului, deoarece face numai lucruri cu obiectele care sunt sigure pentru tipul lor. Un program care nu o face probabil că nu va funcționa corect. Rețineți că majoritatea programelor nu stochează de fapt în mod explicit care este tipul unui obiect, ci doar accesează obiectele în mod consecvent - același obiect este întotdeauna tratat ca fiind de același tip.
Procesorul
Procesorul rulează (execută) instrucțiuni, care sunt stocate ca cod mașină în memoria principală. Pe lângă posibilitatea de a accesa memoria pentru stocare, majoritatea procesoarelor dispun de câteva spații mici, rapide și de dimensiuni fixe pentru păstrarea obiectelor cu care se lucrează în acel moment. Aceste spații se numesc registre. Procesoarele execută de obicei trei tipuri de instrucțiuni, deși unele instrucțiuni pot fi o combinație a acestor tipuri. Mai jos sunt prezentate câteva exemple ale fiecărui tip în limbajul de asamblare x86.
Instrucțiuni care citesc sau scriu în memorie
Următoarea instrucțiune în limbaj de asamblare x86 citește (încarcă) un obiect de 2 octeți din octetul de la adresa 4096 (0x1000 în hexazecimal) într-un registru de 16 biți numit "ax":
mov ax, [1000h]
În acest limbaj de asamblare, parantezele pătrate din jurul unui număr (sau al unui nume de registru) înseamnă că numărul trebuie folosit ca adresă către datele care trebuie utilizate. Utilizarea unei adrese pentru a indica datele se numește indirection. În următorul exemplu, fără parantezele pătrate, un alt registru, bx, primește de fapt valoarea 20 încărcată în el.
mov bx, 20
Deoarece nu a fost folosită nicio indirectă, valoarea reală a fost introdusă în registru.
În cazul în care operanzii (elementele care vin după mnemonic) apar în ordine inversă, o instrucțiune care încarcă ceva din memorie în loc să scrie în memorie:
mov [1000h], bx
Aici, memoria de la adresa 1000h primește valoarea bx. Dacă acest exemplu este executat imediat după cel precedent, cei 2 octeți de la 1000h și 1001h vor fi un întreg de 2 octeți cu valoarea 20.
Instrucțiuni care efectuează operații matematice sau logice
Unele instrucțiuni fac lucruri precum scăderea sau operații logice, cum ar fi nu:
Exemplul de cod mașină de mai devreme din acest articol ar fi acest lucru în limbaj de asamblare:
adaugă ax, 42
Aici, 42 și ax sunt adunate, iar rezultatul este stocat înapoi în ax. În ansamblul x86 este posibilă și combinarea unui acces la memorie și a unei operații matematice în felul următor:
add ax, [1000h]
Această instrucțiune adaugă valoarea numărului întreg de 2 octeți stocat la 1000h la ax și stochează răspunsul în ax.
sau ax, bx
Această instrucțiune calculează or a conținutului registrelor ax și bx și stochează rezultatul în ax.
Instrucțiuni care decid care va fi următoarea instrucțiune
De obicei, instrucțiunile sunt executate în ordinea în care apar în memorie, care este ordinea în care sunt tastate în codul de asamblare. Procesorul pur și simplu le execută una după alta. Cu toate acestea, pentru ca procesoarele să facă lucruri complicate, trebuie să execute instrucțiuni diferite în funcție de datele care le-au fost furnizate. Capacitatea procesoarelor de a executa instrucțiuni diferite în funcție de rezultatul unui lucru se numește ramificare. Instrucțiunile care decid care ar trebui să fie următoarea instrucțiune se numesc instrucțiuni de ramificare.
În acest exemplu, să presupunem că cineva dorește să calculeze cantitatea de vopsea de care va avea nevoie pentru a picta un pătrat cu o anumită lungime a laturii. Cu toate acestea, datorită economiei de scară, magazinul de vopsele nu va vinde mai puțin decât cantitatea de vopsea necesară pentru a picta un pătrat de 100 x 100.
Pentru a-și da seama de cantitatea de vopsea de care vor avea nevoie în funcție de lungimea pătratului pe care vor să-l picteze, au elaborat acest set de pași:
- scădem 100 din lungimea laturii
- dacă răspunsul este mai mic decât zero, se stabilește lungimea laturii la 100
- se înmulțește lungimea laturii cu ea însăși
Acest algoritm poate fi exprimat în următorul cod, unde ax este lungimea laturii.
mov bx, ax sub bx, 100 jge continue mov ax, 100 continue: mul ax
Acest exemplu introduce câteva lucruri noi, dar primele două instrucțiuni sunt cunoscute. Acestea copiază valoarea lui ax în bx și apoi scad 100 din bx.
Unul dintre elementele noi din acest exemplu se numește etichetă, un concept întâlnit în limbajele de asamblare în general. Etichetele pot fi orice dorește programatorul (cu excepția cazului în care este numele unei instrucțiuni, ceea ce ar deruta asamblorul). În acest exemplu, eticheta este "continue". Aceasta este interpretată de asamblor ca fiind adresa unei instrucțiuni. În acest caz, este vorba de adresa mult ax.
Un alt concept nou este cel al steagurilor. Pe procesoarele x86, multe instrucțiuni setează "stegulețe" în procesor, care pot fi folosite de următoarea instrucțiune pentru a decide ce să facă. În acest caz, dacă bx a fost mai mic de 100, sub va seta un indicator care spune că rezultatul a fost mai mic de zero.
Următoarea instrucțiune este jge, care este prescurtarea de la "jump if greater than or equal to". Este o instrucțiune de ramificare. În cazul în care indicatoarele din procesor specifică faptul că rezultatul a fost mai mare sau egal cu zero, în loc să treacă la instrucțiunea următoare, procesorul va trece la instrucțiunea de la eticheta continue, care este mul ax.
Acest exemplu funcționează bine, dar nu este ceea ce ar scrie majoritatea programatorilor. Instrucțiunea subtract a setat corect flag-ul, dar modifică și valoarea pe care operează, ceea ce a necesitat copierea ax-ului în bx. Cele mai multe limbaje de asamblare permit instrucțiuni de comparație care nu modifică niciunul dintre argumentele care le sunt transmise, dar care, totuși, setează corect stegulețele, iar asamblarea x86 nu face excepție.
cmp ax, 100 jge continue mov ax, 100 continue: mul ax
Acum, în loc să scădem 100 din ax, să vedem dacă acel număr este mai mic decât zero și să îl atribuim înapoi la ax, ax rămâne neschimbat. Stegulețele sunt în continuare setate în același mod, iar saltul este în continuare efectuat în aceleași situații.
Intrare și ieșire
În timp ce intrările și ieșirile reprezintă o parte fundamentală a calculului, nu există un singur mod de a le realiza în limbajul de asamblare. Acest lucru se datorează faptului că modul în care funcționează I/O depinde de configurația calculatorului și de sistemul de operare pe care îl rulează, nu doar de tipul de procesor pe care îl are. În secțiunea de exemple de mai jos, exemplul Hello World utilizează apeluri ale sistemului de operare MS-DOS, iar exemplul următor utilizează apeluri BIOS.
Este posibil să se facă I/O în limbajul de asamblare. Într-adevăr, limbajul de asamblare poate exprima, în general, tot ceea ce poate face un calculator. Cu toate acestea, chiar dacă există instrucțiuni de adăugare și de ramificare în limbajul de asamblare care vor face întotdeauna același lucru, nu există instrucțiuni în limbajul de asamblare care să facă întotdeauna I/O.
Este important de reținut faptul că modul în care funcționează I/O nu face parte din niciun limbaj de asamblare, deoarece nu face parte din modul de funcționare al procesorului.
Limbaje de asamblare și portabilitate
Chiar dacă limbajul de asamblare nu este rulat direct de procesor, așa cum este codul mașinii, are totuși multe de a face cu acesta. Fiecare familie de procesoare suportă diferite caracteristici, instrucțiuni, reguli privind ceea ce pot face instrucțiunile și reguli privind combinațiile de instrucțiuni permise și unde sunt permise. Din acest motiv, diferitele tipuri de procesoare au nevoie de limbaje de asamblare diferite.
Deoarece fiecare versiune a limbajului de asamblare este legată de o familie de procesoare, îi lipsește ceea ce se numește portabilitate. Un lucru care are portabilitate sau este portabil poate fi transferat cu ușurință de la un tip de calculator la altul. În timp ce alte tipuri de limbaje de programare sunt portabile, limbajul de asamblare, în general, nu este.
Limbaj de asamblare și limbaje de nivel înalt
Deși limbajul de asamblare permite o utilizare ușoară a tuturor funcțiilor procesorului, acesta nu este utilizat în proiectele moderne de software din mai multe motive:
- Este nevoie de mult efort pentru a exprima un program simplu în asamblare.
- Deși nu este la fel de predispus la erori ca și codul mașină, limbajul de asamblare oferă totuși o protecție foarte mică împotriva erorilor. Aproape toate limbajele de asamblare nu impun siguranța tipurilor.
- Limbajul de asamblare nu promovează bunele practici de programare, cum ar fi modularitatea.
- În timp ce fiecare instrucțiune individuală în limbaj de asamblare este ușor de înțeles, este greu de spus care a fost intenția programatorului care a scris-o. De fapt, limbajul de asamblare al unui program este atât de greu de înțeles încât companiile nu își fac griji cu privire la faptul că oamenii dezasamblează (obțin limbajul de asamblare al) programelor lor.
Ca urmare a acestor dezavantaje, pentru majoritatea proiectelor se folosesc în schimb limbaje de nivel înalt precum Pascal, C și C++. Acestea permit programatorilor să își exprime ideile mai direct, în loc să fie nevoiți să se preocupe să spună procesorului ce să facă la fiecare pas. Ele sunt numite de nivel înalt deoarece ideile pe care programatorul le poate exprima în aceeași cantitate de cod sunt mai complicate.
Programatorii care scriu cod în limbaje compilate de nivel înalt folosesc un program numit compilator pentru a-și transforma codul în limbaj de asamblare. Compilatoarele sunt mult mai greu de scris decât asamblatoarele. De asemenea, limbajele de nivel înalt nu permit întotdeauna programatorilor să utilizeze toate caracteristicile procesorului. Acest lucru se datorează faptului că limbajele de nivel înalt sunt concepute pentru a suporta toate familiile de procesoare. Spre deosebire de limbajele de asamblare, care suportă doar un singur tip de procesor, limbajele de nivel înalt sunt portabile.
Chiar dacă compilatoarele sunt mai complicate decât asamblatoarele, zeci de ani de realizare și cercetare a compilatoarelor au făcut ca acestea să fie foarte bune. În prezent, nu mai există prea multe motive pentru a utiliza limbajul de asamblare pentru majoritatea proiectelor, deoarece compilatoarele pot, de obicei, să descopere cum să exprime programele în limbaj de asamblare la fel de bine sau mai bine decât programatorii.
Exemple de programe
Un program Hello, world! scris în asamblare x86:
adosseg .model small .stack 100h .data hello_message db 'Hello, World! ',0dh,0ah,'$' .code main proc mov ax,@data mov ds,ax mov ah,9 mov dx,offset hello_message int 21h mov ax,4C00h int 21h main endp end main.
O funcție care tipărește un număr pe ecran folosind întreruperi BIOS scrise în ansamblul NASM x86. Este posibil să se scrie cod modular în assembly, dar necesită un efort suplimentar. Rețineți că tot ceea ce vine după un punct și virgulă pe o linie este un comentariu și este ignorat de asamblor. Punerea de comentarii în codul în limbaj de asamblare este foarte importantă deoarece programele mari în limbaj de asamblare sunt foarte greu de înțeles.
; void printn(int number, int base); printn: push bp mov bp, sp push ax push bx push cx push dx push si mov si, 0 mov ax, [bp + 4] ; number mov cx, [bp + 6] ; base gloop: inc si ; lungimea șirului mov dx, 0 ; zero dx div cx ; divide cu baza cmp dx, 10 ; este ge 10? jge num add dx, '0' ; adaugă zero la dx jmp anum num: add dx, ('A'- 10) ; valoare hexagonală, adăugați 'A' la dx - 10. anum: push dx ; puneți dx pe stivă. cmp ax, 0 ; trebuie să continuăm? jne gloop mov bx, 7h ; pentru întrerupere tloop: pop ax ; obțineți valoarea sa mov ah, 0eh ; pentru întrerupere int 10h ; scrieți caracterul dec si ; scăpați de caracter jnz tloop pop si pop dx pop cx pop bx pop bx pop ax pop bp ret 4
Cărți
- Michael Singer, PDP-11. Assembler Language Programming and Machine Organization, John Wiley & Sons, NY: 1980.
- Peter Norton, John Socha, Peter Norton's Assembly Language Book for the IBM PC, Brady Books, NY: 1986.
- Dominic Sweetman: A se vedea MIPS Run. Morgan Kaufmann Publishers, 1999. ISBN 1-55860-410-3
- John Waldron: Introducere în programarea în limbaj de asamblare RISC. Addison Wesley, 1998. ISBN 0-201-3982828-1
- Jeff Duntemann: Limbajul de asamblare pas cu pas. Wiley, 2000. ISBN 0-471-37523-3
- Paul Carter: PC Assembly Language. Carte electronică gratuită, 2001.
Site web - Robert Britton: Programarea în limbaj de asamblare MIPS. Prentice Hall, 2003. ISBN 0-13-14-142044-5
- Randall Hyde: The Art of Assembly Language. No Starch Press, 2003. ISBN 1-886411-97-2
Versiuni preliminare disponibile online Arhivat 2011-01-28 la Wayback Machine în format PDF și HTML - Jonathan Bartlett: Programarea de la zero. Bartlett Publishing, 2004. ISBN 0-975282838-4-7
Disponibil online în format PDF și HTML - ASM Community Book "O carte online plină de informații utile despre ASM, tutoriale și exemple de cod" de către comunitatea ASM
Software
- MenuetOS - Sistem de operare scris în întregime în limbaj de asamblare pe 64 de biți
- SB-Assembler pentru majoritatea procesoarelor/controlerelor pe 8 biți
- GNU lightning, o bibliotecă care generează cod în limbaj de asamblare în timp de execuție, utilă pentru compilatoarele Just-In-Time.
- WinAsm Studio, The Assembly IDE - Free Downloads, Source Code , un IDE Assembly gratuit, o mulțime de programe open source de descărcat și un forum popular Archived 2008-08-05 at the Wayback Machine
- Asamblatorul Netwide
- GoAsm - o componentă gratuită de instrumente "Go": suportă programarea pe 32 de biți și 64 de biți pentru Windows
Întrebări și răspunsuri
Î: Ce este un limbaj de asamblare?
R: Un limbaj de asamblare este un limbaj de programare care poate fi utilizat pentru a spune direct calculatorului ce trebuie să facă. Este aproape exact ca și codul mașină pe care îl poate înțelege un computer, cu excepția faptului că folosește cuvinte în loc de numere.
Î: Cum înțelege un calculator un program de asamblare?
R: Un computer nu poate înțelege direct un program de asamblare, dar poate transforma cu ușurință programul în cod mașină prin înlocuirea cuvintelor din program cu numerele pe care le reprezintă. Acest proces se realizează cu ajutorul unui asamblor.
Î: Ce sunt instrucțiunile într-un limbaj de asamblare?
R: Instrucțiunile într-un limbaj de asamblare sunt sarcini mici pe care calculatorul le execută atunci când rulează programul. Ele se numesc instrucțiuni pentru că instruiesc calculatorul ce trebuie să facă. Partea calculatorului responsabilă cu respectarea acestor instrucțiuni se numește procesor.
Î: Ce tip de limbaj de programare este limbajul de asamblare?
R: Limbajul de asamblare este un limbaj de programare de nivel scăzut, ceea ce înseamnă că poate fi utilizat doar pentru a efectua sarcini simple pe care un computer le poate înțelege direct. Pentru a efectua sarcini mai complexe, trebuie să se descompună fiecare sarcină în componente individuale și să se furnizeze instrucțiuni pentru fiecare componentă în parte.
Î: Care este diferența față de limbajele de nivel înalt?
R: Limbajele de nivel înalt pot avea comenzi unice, cum ar fi PRINT "Hello, world!", care îi vor spune calculatorului să efectueze toate aceste sarcini mici în mod automat, fără a fi nevoie să le specificați individual, așa cum ar trebui să faceți cu un program de asamblare. Acest lucru face ca limbajele de nivel înalt să fie mai ușor de citit și de înțeles pentru oameni decât programele de asamblare compuse din multe instrucțiuni individuale.
Î: De ce ar putea fi dificil pentru oameni să citească un program de asamblare?
R: Pentru că trebuie specificate multe instrucțiuni individuale pentru a îndeplini o sarcină complexă, cum ar fi imprimarea unui lucru pe ecran sau efectuarea de calcule pe seturi de date - lucruri care par foarte simple și de bază atunci când sunt exprimate în limbajul uman natural - astfel încât pot exista multe linii de cod care alcătuiesc o singură instrucțiune, ceea ce face ca oamenilor care nu cunosc modul de funcționare internă a calculatoarelor la un nivel atât de scăzut să le fie greu să le urmărească și să interpreteze ce se întâmplă în cadrul acestora.