Sunteți pe pagina 1din 13

Curs 9

Programare multimodul în limbaj de asamblare

Contents
1. Programare modulară.............................................................................................................................2
1. Modular Programmierung......................................................................................................................2
1.1 Cum se poate împărți o problemă în sub-probleme?........................................................................2
1.1 Wie können Sie ein Problem in Teilprobleme unterteilen?..............................................................2
1.2 Tehnici și instrumente......................................................................................................................3
1.2 Techniken und Werkzeuge...............................................................................................................3
1.2.1 Includerea statică la compilare/asamblare: directiva %include.................................................3
1.2.1 Statische Einbeziehung bei der Kompilierung / Assemblierung: die Direktive %include........3
1.2.2 Legarea statică la linkeditare.......................................................................................................7
1.2.2 Statische Bindung zu verlinkten..................................................................................................7
1.2.3 Cerințele NASM..........................................................................................................................11
1.2.3 Cerințele NASM..........................................................................................................................11
1.2.4 Folosirea în practică a directivelor global și extern.................................................................11
1.2.4 Anwendung von die Direktiven global und extern in der Praxis.............................................11
1.2.5 Pașii necesari construirii programului executabil final............................................................13
1.2.5 Die zum Erstellen des endgültigen ausführbaren Programms erforderlichen Schritte............13

1
Prezentăm forma generală a unui program Wir präsentieren die allgemeine Form eines
în NASM, însoţită de un scurt exemplu: Programms in NASM, begleitet von einem
kurzen Beispiel:

1. Programare modulară 1. Modular Programmierung

1.1 Cum se poate împărți o problemă 1.1 Wie können Sie ein Problem in
în sub-probleme? Teilprobleme unterteilen?

Modularizarea este un concept care are Modularisierung ist ein Konzept, das je nach
sensuri diferite în funcţie de nivelul de Abstraktionsebene, auf die es angewendet
abstractizare la care este aplicat: wird, unterschiedliche Bedeutungen hat:
• La nivelul programelor, • Auf Programmebene besteht die
modularizarea constă în crearea de Modularisierung in der Erstellung logischer
unități logice; Einheiten;
• La nivelul codului sursă (al • Auf der Quellcode-Ebene (der Einheiten)
unităților), modularizarea constă în besteht die Modularisierung darin, separate
crearea de fișiere distincte; Dateien zu erstellen;
• La nivelul fișierelor, modularizarea • Auf Dateiebene besteht die
constă în crearea de subrutine. Modularisierung aus der Erstellung von
Unterprogrammen.

Figura 1. Conceptul de modularizare, la diferite niveluri de abstractizare (Das Konzept der


Modularisierung auf verschiedenen Abstraktionsebenen)

În momentul creării unei aplicaţii mai Bei der Erstellung einer komplexeren
complexe, trebuie să ne întrebăm care sunt Anwendung müssen wir uns fragen, für
sub-problemele pentru care există deja welche Unterprobleme bereits Lösungen
rezolvări disponibile, astfel încât să nu verfügbar sind, damit wir den Code nicht
rescriem cod în mod nenecesar. unnötig umschreiben.

2
Reutilizarea codului poate să se refere la Die Wiederverwendung des Codes kann sich
următoarele aspecte: auf folgende Aspekte beziehen:
 La nivelul fișierelor sursă, putem  Auf Quelldateiebene können wir
refolosi wiederverwenden
o Cod sursă și date din o Quellcode und Assemblierungsdaten
asamblare o Die Direktive %include
o Directiva %include
 La nivelul fișierelor binare, putem  Auf der Ebene der Binärdateien können
refolosi wir wiederverwenden
o Cod sursă și date din o Quellcode und Assemblierungsdaten
asamblare o Code und Daten auf Hochsprachen
o Cod și date din limbaje de o Bibliotheken
nivel înalt
o Biblioteci Hinweis: Der Begriff „Wiederverwendung“
Observaţie: termenul „a refolosi” nu trebuie ist nicht in dem Sinne zu verstehen, dass
înţeles în sensul reutilizării unor porţiuni de einige von uns geschriebene Codeteile
cod scrise de noi, ci a reutilizării unor wiederverwendet werden, sondern dass
porţiuni de cod în general (chiar şi scrise de einige Codeteile im Allgemeinen
altcineva). wiederverwendet werden (selbst wenn sie
von jemand anderem geschrieben wurden).

1.2 Tehnici și instrumente 1.2 Techniken und Werkzeuge


1.2.1 Includerea statică la 1.2.1 Statische Einbeziehung bei der
compilare/asamblare: directiva Kompilierung / Assemblierung: die
%include Direktive %include

Această directivă este specifică limbajului de Diese Direktive ist spezifisch für die
asamblare, dar are echivalent și în alte Assemblersprache, hat jedoch eine
limbaje. Entsprechung in anderen Sprachen.
Este foarte important de subliniat faptul că Es ist sehr wichtig zu betonen, dass die
modularizarea permite doar divizarea Modularisierung nur die Aufteilung des
codului scris în limbajul respectiv (nu se pot geschriebenen Codes in die jeweilige
combina coduri sursă scrise în mai multe Sprache ermöglicht (es ist nicht möglich, in
limbaje). mehreren Sprachen geschriebene Quellcodes
zu kombinieren).
Prin definiție, fiecare modul este o unitate de Per Definition ist jedes Modul eine
sine stătătoare şi grupează mai multe funcţii eigenständige Einheit und gruppiert mehrere
şi variabile înrudite. Funktionen und zugehörige Variablen.
Principalele avantaje ale programării Die Hauptvorteile der modularen
modulare sunt: Programmierung sind:
 Abstractizare: de exemplu, în C  Abstraktion: Beispielsweise enthält
fiecare modul conține o interfaţă (un in C jedes Modul eine Schnittstelle
header, extensia .h, .hpp sau fără nici (ein header, eine Erweiterung mit der
o extensie cum e cazul header-ului Endung .h, .hpp oder ohne eine
din biblioteca standard cpp) şi o Erweiterung wie die header der CPP-
implementare (fişierul sursă). În Bibliothek) und eine

3
interfaţă doar se declară funcţiile, iar Implementierung (Quelldatei). In der
definirea lor propriu zisă se Schnittstelle werden nur die
realizează în fişierul sursă. Astfel, se Funktionen deklariert und in der
asigură abstractizarea: se pune Quelldatei eine eigene Definition
accentul pe elementele esenţiale (CE realisiert. Somit ist die Abstraktion
face modulul) şi se ignoră detaliile gewährleistet: Es wird Wert auf das
(CUM sunt implementate aceste Wesentliche gelegt (WAS stellt das
funcţii). Modul) und Details werden ignoriert
(WIE diese Funktionen
implementiert werden).
 Prin această ascundere a  Diese Verschleierung der
implementării în fişierul sursă se Implementierung in der Quelldatei
asigură corectitudinea modulului stellt die Korrektheit des Moduls (der
(utilizatorul nu poate să modifice Benutzer kann den Quellcode nicht
codul sursă) şi transparenţa (se pot ändern) und die Transparenz sicher
face modificări ulterioare asupra (spätere Änderungen am Quellcode
codului sursă şi utilizatorul să nu fie können vorgenommen werden, und
conştient de acestea dacă nu se der Benutzer ist sich dessen nicht
modifică interfaţa funcţiilor). În plus, bewusst, wenn die
dacă eventual codul din Funktionsschnittstelle nicht geändert
implementare este furnizat în mod wird). Wenn der Code in der
binar (de exemplu, o bibliotecă Implementierung in binärer Form
statică, fişier obiect etc.), utilizatorii bereitgestellt wird (z. B. eine
(sau eventuali atacatori ai aplicaţiei) statische Bibliothek, eine Objektdatei
nu pot face reverse engineering ca să usw.), können Benutzer (oder
vadă codul sursă. În plus, utilizatorul mögliche Angreifer der Anwendung)
modulului poate să utilizeze doar den Quellcode nicht rückentwickeln
funcţiile expuse în interfaţă. (reverse engineering). Außerdem
kann der Modulbenutzer nur die
Funktionen verwenden, die in der
Schnittstelle verfügbar sind.

Totuși, utilizarea directivei include nu este Die Verwendung der Direktive include
programare multimodul autentică! DE CE? jedoch keine authentische
Această metodă implică anumite riscuri Multimodulprogrammierung! WARUM?
importante. Diese Methode birgt bestimmte wichtige
Risiken.

1. Prin utilizarea ei se expune codul sursă! 1. Durch die Verwendung wird der
Quellcode verfügbar gemacht!

Obţinerea unui fişier executabil trece prin 3 Das Abrufen einer ausführbaren Datei
etape principale: preprocesare, compilare erfolgt in drei Hauptschritten:
(asamblare) şi linkeditare. Vorverarbeitung, Kompilieren
(Assemblierung) und Verknüpfen
(linkediting).

4
Figura 2. Fazele obţinerii unui fişier executabil (Die Schritte zum Abrufen einer ausführbaren
Datei)

Mecanismul de preprocesare implică o Der Vorverarbeitungsmechanismus


concatenare textuală a fișierelor, astfel că se beinhaltet die Verkettung von Dateien in
poate obţine un fişier sursă mult mai mare Textform, sodass eine viel größere
decât cel iniţial (care poate fi relativ scurt, Quelldatei als die ursprüngliche Datei
dar care poate conţine multe „include”-uri). erhalten werden kann (die relativ kurz sein
După etapa de preprocesare, un atacator are kann, aber viele „include“ enthalten kann).
deja acces la tot codul sursă! În schimb, dacă Ein Angreifer hat nach der Vorverarbeitung
am împărţi codul sursă în module care să fie bereits Zugriff auf den gesamten Quellcode!
asamblate separat, putem „transporta” cu noi Wenn wir stattdessen den Quellcode in
doar fişierele .obj, pe care doar noi ştim cum Module aufteilen, die separat assemblieren
se leagă de fişierul principal (deci putem de werden sollen, können wir nur die .obj
pildă transporta mai multe fişiere .obj, dintre Dateien „mitnehmen“, die wir nur mit der
care nu toate sunt utile aplicaţiei noastre). Hauptdatei verknüpfen können (sodass wir
Este mult mai greu de făcut reverse beispielsweise mehr .obj-Dateien führen
engineering pe un fişier .obj decât pe un können, von denen nicht alle für unsere
fişier sursă. Anwendung nützlich sind). Reverse
Engineering ist für eine .obj-Datei viel
schwieriger als für eine Quelldatei.

2. Expune cu vizibilitate globală toate 2. Es macht mit globaler Sichtbarkeit alle


denumirile de variabile, constante etc. Astfel Namen von Variablen, Konstanten usw.
apar conflicte la redefiniții / redeclarări. De verfügbar. Somit ergeben sich Konflikte in
exemplu, dacă avem două variabile cu den Redefinitionen / Redeklarationen. Wenn
acelaşi nume declarate în două module beispielsweise zwei Variablen mit
diferite, dacă includem aceste variabile în demselben Namen in zwei verschiedenen
acelaşi fişier vom avea un conflict de nume. Modulen deklariert sind und diese Variablen
În schimb, dacă folosim variabile într-un in derselben Datei enthalten sind, liegt ein
context multi-modul, atunci nu va fi nici o Namenskonflikt vor. Im Gegensatz dazu gibt

5
problemă. es kein Problem, wenn wir Variablen in
einem Kontext mit mehreren Modulen
verwenden.

Prin directiva include, includem fișierul în Durch die include-Direktive wird die
întregime – și ce este util, și ce nu! gesamte Datei eingeschlossen – und was ist
nützlich und was nicht!

Figura 3. Obţinerea fişierului executabil: faza de preprocesare (Erhalten der ausführbaren


Datei: Vorverarbeitungsphase)

1) Exemplu de folosire %include 1) Anwendungsbeispiel %include

; fișierul constante.inc
; gardă dublă-includere

%ifndef _CONSTANTE_INC_ ; la prima includere, _CONSTANTE_INC_ nu este definit


; Beim ersten Einschluss ist _CONSTANTE_INC_ nicht definiert
%define _CONSTANTE_INC_ ; definim _CONSTANTE_INC_ -> condiție falsă la viitoare includeri
; wir definieren _CONSTANTE_INC_ -> falsche Bedingung für zukünftige Aufnahme

; se recomandă ca astfel de fișiere (incluse de către altele) să conțină (doar) declarații!


; Es wird empfohlen, dass solche Dateien (von anderen eingeschlossen) (nur) Deklarationen enthalten!

MAX_BYTE equ 0xFF


MAX_WORD equ 0xFFFF
MAX_DWORD equ 0xFFFFFFFF
MAX_QWORD equ 0xFFFFFFFFFFFFFFFF

%endif ; _CONSTANTE_INC_

2) Exemplu folosire %include – 2) Anwendungsbeispiel %include - EAX-


împachetare EAX într-un BYTE / WORD / Packung in einem BYTE / WORD /
DWORD, conform magnitudinii valorii DWORD, abhängig von der Größe seines
acestuia Wertes
; fișierul program.asm

%include "constante.inc"

6
cmp EAX, MAX_BYTE
ja .nu_incape_in_octet ; încape valoarea din EAX într-un byte?
; Passt der Wert in EAX in ein Byte?

.incape_in_octet:
mov [rezultat_octet], AL ; dacă da, salvăm AL în rezultat_octet
jmp .gata ; Wenn ja, speichern wir AL in rezultat_octet

.nu_incape_in_octet:
cmp EAX, MAX_WORD
ja .nu_incape_in_cuvant ; altfel verificăm dacă este suficient un WORD
; ansonsten prüfen wir, ob ein WORD ausreicht

.incape_in_cuvant:
mov [rezultat_word], AX ; dacă da, salvăm AX în rezultat_word
jmp .gata ; Wenn ja, speichern wir AX in rezultat_word

.nu_incape_in_cuvant:
mov [rezultat_dword], EAX ; dacă nu este suficient un WORD, salvăm întregul EAX
.gata: ; Wenn ein WORT nicht ausreicht, speichern wir den gesamten EAX

1.2.2 Legarea statică la linkeditare 1.2.2 Statische Bindung zu verlinkten

Acesta este un pas realizat de către un Dies ist ein Schritt, den ein Linker nach der
linkeditor după asamblare/compilare. Assemblierung / Kompilierung ausführt.

Figura 4. Obţinerea fişierului executabil: faza de compilare sau asamblare (Erhalten der
ausführbaren Datei: Kompilierungs- oder Assemblierungsphase)

7
Figura 5. Obţinerea fişierului executabil: faza de linkeditare (Erhalten der ausführbaren Datei:
Verlinktensphase)

Preprocesorul: transformă text în text. Präprozessor: Konvertiert Text in Text.

Efectuează prelucrări asupra textului sursă, Es Führt eine Verarbeitung des Quelltextes
rezultând un text sursă intermediar. Se poate durch, was zu einem Zwischenquelltext
imagina ca fiind o componentă a führt. Es kann als eine Komponente des
compilatorului sau asamblorului. Compilers oder Assemblers vorgestellt
werden.
Poate lipsi, multe limbaje nu au un Es kann fehlen, viele Sprachen haben keinen
preprocesor! Präprozessor!

Asamblorul: transformă instrucțiunile (text) Assemblierer (Assembler): wandelt


în codificare binară (fișier obiect). Anweisungen (Text) in binäre Codierung
(Objektdatei) um.

Codifică instrucțiunile și datele (variabilele) Es codiert Anweisungen und Daten


din textul sursă preprocesat și construiește un (Variablen) im vorverarbeiteten Quelltext
fișier obiect care conține cod mașină și valori und erstellt eine Objektdatei, die
de variabile, alături de informații despre Maschinencode und Variablenwerte sowie
conținut (denumiri de variabile, subrutine, Inhaltsinformationen (Variablennamen,
informații despre tipul și vizibilitatea Unterprogramme, Informationen zu Typ und
acestora etc.). Sichtbarkeit usw.) enthält.

Compilatorul: transformă instrucțiunile (text) Compiler: wandelt Anweisungen (Text) in


în codificare binară (fișier obiect) binäre Codierung (Objektdatei) um.

Identifică secvențe de instrucțiuni de Identifiziert Sequenzen von


procesor prin care se pot obține Prozessoranweisungen, über die die im
funcționalitățile descrise în textul sursă iar Quelltext beschriebenen Funktionalitäten
apoi, precum un asamblor, generează un abgerufen werden können, und generiert
fișier obiect care conține codificarea binară a dann als Assembler eine Objektdatei, die

8
acestora și a variabilelor din program. ihre binäre Codierung und
Programmvariablen enthält.

Asamblarea este un caz special de Assemblierung ist ein spezieller


compilare, unde instrucţiunile de procesor Kompilierungsfall, bei dem
sunt gata oferite direct în textul programului Prozessoranweisungen direkt im
și ca atare nu necesită să fie alese de către Programmtext bereitgestellt werden und als
compilator! solche nicht vom Compiler ausgewählt
werden müssen!

Linkeditor: fișiere obiect => bibliotecă sau Linkeditor: Objektdateien => Bibliothek
program oder Programm

Construiește rezultatul final, adică un Erstellt das Endergebnis, deshalb ein


program (.exe) sau bibliotecă (.dll sau .lib) în Programm (.exe) oder eine Bibliothek (.dll
care leagă împreună (include) codul și datele oder .lib), die den in den Objektdateien
binare prezente în fișierele obiect. vorhandenen Binärcode und die darin
enthaltenen Daten verknüpft (enthält).

Nu contează ce compilatoare sau ce limbaje Es ist egal, welche Compiler oder


de programare au fost folosite! Legarea Programmiersprachen verwendet wurden!
necesită doar ca fișierele de intrare să Das Binden setzt nur voraus, dass die
respecte formatul standard al fișierelor Eingabedateien dem Standardformat der
obiect! Objektdateien entsprechen!

Legarea statică la linkeditare permite unirea Durch die statische Bindung an einen Link
mai multor module binare (fișiere obiect sau können Sie mehrere Binärmodule
biblioteci statice) într-un singur fișier. (Objektdateien oder statische Bibliotheken)
in einer einzigen Datei zusammenführen.

La intrări putem avea oricâte fișiere obiect Bei Einträgen können wir beliebige
(.OBJ) și / sau biblioteci statice (.LIB). Objektdateien (.OBJ) und / oder statische
Bibliotheken (.LIB) haben.

Atenție, nu toate fișierele .LIB sunt biblioteci Achtung, nicht alle .LIB-Dateien sind
statice! statische Bibliotheken!

La ieșiri se obţin fişiere .EXE sau .LIB Die Ausgaben erhalten .EXE- oder .LIB-
sau .DLL (Dynamic-Link Library). oder .DLL-Dateien (Dynamic Link Library).

Programarea multimodul înseamnă că Multimodale Programmierung bedeutet, dass


oricâte fișiere pot fi compilate separat și jede Datei separat kompiliert und
linkeditate împreună. Este un pas realizat de miteinander verknüpft werden kann. Dies ist
către linkeditor, după compilare / asamblare, ein Schritt, den der Link nach dem
deci nu depinde de limbaj! Kompilierung / Assemblierung ausführt, es
kommt also nicht auf die Sprache an!

9
Reutilizarea codului: Wiederverwendung von Code:

1. În formatul binar nu este expus codul 1. Der Quellcode wird nicht im


sursă. Binärformat angezeigt.
2. Permite inter-operabilitate între 2. Ermöglicht die Interoperabilität
limbaje diferite! zwischen verschiedenen Sprachen!

Alte avantaje și dezavantaje: Andere Vor- und Nachteile:

1. Editorul de legături poate identifica și 1. Der Link-Editor kann nicht verwendete


elimina resurse neutilizate sau Ressourcen identifizieren und beseitigen
efectua alte optimizări; oder andere Optimierungen durchführen.
2. Dimensiune mare a programului: 2. Große Programmgröße: Das Programm
programul înglobează resursele enthält wiederverwendete externe
externe reutilizate; Ressourcen
3. Dimensiune mare a programelor: 3. Große Programmgröße: Beliebte
bibliotecile populare duplicate în Bibliotheken, die in vielen Programmen
multe programe. doppelt vorhanden sind.

În NASM avem directivele global In NASM gibt es global


(mecanism export) și extern (mecanism (Exportmechanismus) und extern
import) (Importmechanismus) Direktiven
 global nume – oferă posibilitatea de  global Name – bietet die
utilizare din exterior a resursei Möglichkeit der externen
respective, specificate prin nume Verwendung der jeweiligen
Ressource, angegeben durch den
Namen
 extern nume – solicitare de acces la  extern Name – Anforderung des
resursa specificată; necesită să fie Zugriffs auf die angegebene
publică! Ressource; muss öffentlich sein!

10
1.2.3 Cerințele NASM 1.2.3 Cerințele NASM

Este foarte important de reţinut că resursele Es ist sehr wichtig, sich daran zu erinnern,
sunt partajate de comun acord. dass die Ressourcen in gegenseitigem
Einvernehmen geteilt werden.

Exportul se realizează prin directiva global Der Export erfolgt über die Direktive global
nume1, nume2, ... Prin aceasta resursele name1, name2, ... Hierdurch werden die
respective se pun la dispoziţia oricărui fișier jeweiligen Ressourcen für jede interessierte
ar fi interesat. Datei zur Verfügung gestellt.
Importul se realizează prin directiva extern Der Import erfolgt über die Direktive extern
nume1, nume2, ... Prin aceasta se solicită name1, name2, ... Damit wird der Zugriff
accesul la resursele respective, indiferent din auf die jeweiligen Ressourcen angefordert,
ce fișier vor fi oferite. unabhängig davon, welche Datei angeboten
wird.

Solicitare fără disponibilitate = eroare! Anfrage ohne Verfügbarkeit = Fehler!

Nu se pot importa decât resurse care sunt Es können nur exportierte Ressourcen
exportate undeva. Însă disponibilitate fără importiert werden. Eine Verfügbarkeit ohne
solicitare este caz permis, deoarece chiar Anfrage ist jedoch zulässig, da selbst wenn
dacă nici un modul din program nu solicită / kein Modul im Programm die
folosește resursele respective, poate ele vor fi entsprechenden Ressourcen anfordert /
utilizate într-o versiune viitoare sau de către verwendet, diese möglicherweise in einer
un alt program. zukünftigen Version oder von einem
anderen Programm verwendet werden.

Limbajele de programare de nivel mai înalt Höhere Programmiersprachen bieten auch


oferă și ele la rândul lor construcții sintactice syntaktische Konstruktionen mit gleicher
cu rol echivalent (exemplu: în limbajul C, Funktion (z. B. in der Sprache C ist die
disponibilitatea este automată / implicită, Verfügbarkeit automatisch / standardmäßig,
putându-se însă opta pentru a bloca accesul Sie können den Zugriff jedoch mithilfe des
prin folosirea cuvântului cheie static. Schlüsselworts static blockieren. Die
Solicitarea de acces se face (tot) prin Anforderung für den Zugriff lautet mache
intermediul cuvântului cheie extern). (alles) durch das extern Schlüsselwort).

1.2.4 Folosirea în practică a 1.2.4 Anwendung von die Direktiven


directivelor global și extern global und extern in der Praxis

11
Exemplu de program multimodul NASM + Beispiel eines multimodul Programms
NASM NASM + NASM

12
1.2.5 Pașii necesari construirii 1.2.5 Die zum Erstellen des
programului executabil final endgültigen ausführbaren Programms
erforderlichen Schritte

1. Se asamblează fișierul main.asm 1. Assemblieren Sie die Datei main.asm

nasm.exe -fobj main.asm

2. Se asamblează fișierul sub.asm 2. Assemblieren Sie die Datei sub.asm

nasm.exe -fobj sub.asm

3. Se editează legăturile dintre cele două 3. Die Verbindungen zwischen den beiden
module Modulen werden bearbeitet

alink.exe main.obj sub.obj –oPE –entry:start –subsys:console

Observații: cele două module pot fi Anmerkungen: Die beiden Module können
asamblate în orice ordine! Abia în timpul in beliebiger Reihenfolge assemblieren
linkeditării este necesar ca simbolurile werden! Nur während der Verlinkung ist es
referite să aibă, toate, implementare erforderlich, dass die referenzierten Symbole
disponibilă în unul dintre fișierele obiect alle in einer der dem Verlinker angebotenen
oferite linkeditorului. Objektdateien implementierbar sind.

Linkeditarea, în mod evident, este posibilă Eine Verknüpfung ist natürlich nur nach
doar după asamblare / compilare! Assemblierung / Kompilierung möglich!

13

S-ar putea să vă placă și