Sunteți pe pagina 1din 31

SISTEME CU

MICROPROCESOARE
2014
CURS 3 PROGRAMAREA N LIMBAJ DE ASAMBLARE
.l. dr. ing. Radu PIETRARU

radu.pietraru@aii.pub.ro

LIMBAJUL DE ASAMBLARE
Este un limbaj de programare apropiat de maina
de calcul destinat calculatoarelor,
microprocesoarelor, microcontrolerelor sau altor
dispozitive programabile.
Fiecare declaraie corespunde unei singure
instruciuni n limbaj main.
Este specific unei anume arhitecturi.
Permite programatorului utilizarea unor
reprezentri simbolice (mnemonici instruciuni,
alias-uri registre, locaii de memorie)
echivalente cu codurile operaiilor n limbaj
main.

DEZAVANTAJE (?)
(IDEI PRECONCEPUTE)

Greu de nvat
Cod greu de parcurs i de neles
Greu de depanat i de meninut
Timp de dezvoltare mare
Noile compilatoare fac inutil programarea n limbaj
de asamblare
La ora actual mainile de calcul sunt suficient de
rapide a. . programarea n limbaj de asamblare este
inutil (idem resurse, de exemplu memorie)
Pentru o vitez mai bun de rulare este suficient s
optimizm algoritmii
Nu este portabil

AVANTAJE (!)
Vitez
Dimensiune

executabile (cod binar)


Capabiliti anumite lucruri sunt
extrem de dificile sau imposibil de
implementat n limbajele de nivel nalt
(drivere, anumite seciuni ale SO,
virtualizare)
Formare n conceperea programelor
conduce la scrierea de programe mai bune
n final

COD MAIN LIMBAJ ASAMBLARE

CODIFICAREA GENERIC A
INSTRUCIUNILOR

EXEMPLU DE CODIFICARE
INSTRUCIUNEA MOV

EXEMPLU DE CODIFICARE
INSTRUCIUNEA MOV (CONTINUARE)
MOV SP, BX
Aceast instruciune copiaz un word din registrul BX n registrul SP.
Codul operaiei de 6 bii este: 100010.
Bitul W=1 deoarece este un word.
Bitul D=1 i cmpul REG=100 atta timp ct identific registrul
destinaie SP.
Cmpul MOD=11 pentru a reprezenta modul de ADRESARE PRIN
REGISTRU.
Cmpul R/M=011 pentru a reprezenta cellalt registru BX.

EXEMPLU DE CODIFICARE
INSTRUCIUNEA MOV (CONTINUARE)
MOV CS:[BX],DL
Aceast instruciune copiaz un octet din registrul DL ntr-o adres de
memorie.
Adresa efectiv a locaiei de memorie este coninut in registrul BX.
n mod normal adresa efectiv este adugat la registrul DS pentru a forma
adresa fizic a memoriei. n acest caz notaia CS:[BX] indic faptul ca registrul
CS este folosit n locul registrului DS.
CS reprezint prefixul de suprascriere a segmentului.
Atunci cnd o instruciune conine un prefix de suprascriere a segmentului este
necesar de a aduga un cod de 8 bii naintea instruciunii. Acest cod trebuie s
aib formatul 001XX110 unde XX reprezint codul registrului segment utilizat.
n cazul de faa CS=01 i prefixul de suprascriere a segmentului devine
00101110.

10

PROCESUL DE DEZASAMBLARE
Nu este o problem trivial i nici nu exist o
soluie universal sau exact.
ine de reverse-engineering
Nu se pot reface variabilele, constantele,
comentariile, etichetele, macro-urile, apelurile de
funcii i proceduri.
Cu siguran nu se poate obine codul original.
De multe ori se utilizeaz pe post de
depanatoare, de exemplu: SoftICE

11

CINE SE OCUP CU TRANSLATAREA N COD


MAIN?

Asamblorul - Utilitar care transpune


limbajul de asamblare n cod main.

12

CUM FUNCIONEAZ UN ASAMBLOR?


Genereaz cod obiect nlocuind instruciunile de
asamblare (mnemonici) n coduri main i
rezolvnd numele simbolice pentru calculul
adreselor utilizate n program.
Acest lucru se poate face ntr-un pas sau n mai
muli pai se face mai nti o list de simboluri
coninute n program i apoi se genereaz binarul
sau se face acest lucru ntr-o singur trecere.
Plecnd de la fiierul .asm se obine .obj (fiierul
obiect relocabil), .lst (fiierul surs codurile
instruciunilor), .exe - .bin (fiiere binare,
executabile).

13

EXEMPLE DE ASAMBLOARE
Denumire

Productor

Descriere

SO

Flat assembler
(fasm)

Privalov

Linie de comand

Windows, Linux

Lazy Assembler
(LZASM)

Stepan Polovnikov

Clon a fasm

Windows

MASM 5.1

Microsoft

Cea mai utilizat


versiune

Windows

MASM 6.1

Microsoft

Linie de comand

Windows

Netwide
Assembler
(NASM)

Julian Hall et al.

Extrem de modular

Windows, Linux

Turbo
Assembler
(TASM)

Borland

Linie de comand

Windows

14

FORMATUL UNUI PROGRAM N LIMBAJ


DE ASAMBLARE

Caracteristici generale:
Caracterele ce sunt precedate de semnul ; sunt
considerate comentarii (adugarea comentariilor
n interiorul programului este o modalitate bun
pentru a mbunti eligibilitatea codului).
n afar de aceste instruciuni, exist alte iruri
de caractere ce nu au legtur cu instruciunile
microprocesorului, ci servesc asamblorului;
acestea poart numele de directive.
Numerele din interiorul programului pot fi
exprimate n diferite forme: zecimal (2, 45, ..),
hexazecimal (12H,..), etc.

15

FORMATUL UNEI INSTRUCIUNI


{Label} {Mnemonic {Operand}} {;Comment}
Cmpul Label este n general opional i
reprezint o etichet simbolic pentru
instruciunea curent. Anumite mnemonici
necesit un Label altele nu accept unul.
Cmpul Mnemonic este reprezentat de o
instruciune de asamblare (din setul de
instruciuni al microprocesorului, o directiv de
asamblare sau pseudo-instruciune. Acestea din
urm sunt destinate asamblorului diferena
dintre ele constnd n generarea de cod main
sau nu.

16

ALTE PARTICULARITI ALE


ASAMBLORULUI

Fiecare linie poate conine cte o instruciune, nu sunt


admise instruciuni multiple pe o linie.
Nu conteaz spaierea i liniile goale:

mov ax, 0
mov bx, ax
add ax, dx
mov cx, ax
__________________________________________________
mov ax, 0
mov
bx, ax
add ax, dx
mov cx,
ax

17

LABELS, ETICHETE SAU IDENTIFICATORI

Nu pot ncepe cu o cifr.


Litere mari i mici sunt echivalente.
Sunt utilizate doar primele 31 de caractere.
Se pot utiliza _, $, ? i @ dar nu pot forma singure o
etichet.
Exist etichete rezervate:
.UNTIL .UNTILCXZ .WHILE .XALL
.XCREF .XLIST ALIGN ASSUME
BYTE CATSTR COMM COMMENT
DB DD DF DOSSEG
DQ DT DW DWORD
ECHO ELSE ELSEIF ELSEIF1
ELSEIF2 ELSEIFB ELSEIFDEF ELSEIFDEF
ELSEIFE ELSEIFIDN ELSEIFNB ELSEIFNDEF

18

DIRECTIVE DE PROCESOR
n mod implicit asamblorul va permite doar
instruciuni valabile pentru ntreaga familie de
microprocesoare.
Directivele de procesor permit activarea
(utilizarea) de instruciuni care apar la
microprocesoare mai noi. Exemple:
.8086 .8087 .186 .286 .287
.286P .386 .387 .386P .486
.486P .586 .586P

19

PROCEDURI
NProc

NProc
FProc

FProc

proc near
mov ax, 0
ret
endp
proc far
mov ax, 0FFFFH
ret
endp

call NPROC ; trei octei


call FPROC ; cinci octei

20

MODELE DE MEMORIE
.tiny codul, datele i stiva sunt ntr-un
segment de 64k
.small codul i datele sunt n segmente
separate (2 segmente)
.medium datele se afl ntr-un singur
segment
.compact codul se afl ntr-un singur
segment
.large sau .huge nu exist limitri
.flat nu este folosit mecanismul de
segmentare

21

DIRECTIVE DE ASAMBLARE

Directivele sunt utilizate pentru a indica


asamblorului informaii despre cum s efectueze
transformrile instruciunilor n cod main.

DIRECTIVELE SEGMENT I ENDS


Aceste directive sunt utilizate pentru identificarea
unui grup de date sau unui grup de instruciuni pe
care dorim s la grupm n cadrul aceluiai segment.
De exemplu:
PROG SEGMENT
..
PROG ENDS
22

DECLARAREA DE CONSTANTE
DIRECTIVELE EQU, DB,DW,DD
n cadrul unui program exist n mod normal 3
categorii de date: constante, variabile i adrese.
Este permis asocierea unor nume variabilelor,
constantelor i adreselor pentru a putea face referina
la ele prin intermediul unui nume, n loc de a folosi
un numr.

Directiva EQU este utilizat pentru asignarea de


nume constantelor unui program. Exemple:
One equ 1
Minus1 equ -1
TryAgain equ 'Y'
StringEqu equ Hello there

23

DECLARAREA DE VARIABILE

Directivele DB, DW, DD sunt folosite pentru a asigna nume variabilelor din
program. Exemplu:

DATA_1
DATA_2
DATA_3
DATA_4

DB
DW
DD
DB

04H
?
1,2,3,4,5,6
4 DUP(0)

Utiliznd aceast sintax se declar o variabil de tip octet (DB), creia i se


asigneaz numele DATA_1 i este iniializat cu valoarea 04H.

MOV AL,DATA_1

Valoarea variabilei cu numele DATA_1 este ncrcat n registrul AL.


DATA_1 nu este nici mai mult nici mai puin dect o locaie de memorie unde
este memorat octetul. Asamblorul calculeaz aceast adres n funcie de
segmentul unde a fost declarat.
Directivele DW i DD sunt asemntoare cu directiva DB, doar c ele definesc
variabile de tip Word, respectiv Double Word.

24

CUM ACCESM ELEMENTELE UNEI


MATRICE?
suma elementelor
LEA
MOV
MOV
MOV
MOV

BX, matrice
matrice[0], 3
matrice[1], 6
2[BX],4
[BX+3],9

MOV DI,4
MOV DI[BX],12
INC
MOV
MOV
MOV

DI
matrice[DI], 32
matrice[6], 23
matrice[7], 18

MOV matrice[8], 2
MOV CX,9
MOV AX,0
MOV DI,0
ETI: ADD AL,[BX+DI]
INC DI
LOOP ETI

25
matrice db 9 DUP(0)

CUM ACCESM ELEMENTELE UNEI


MATRICE? (2)
i i j
START:MOV AL,i
MOV BL,3
MUL BL
ADD AL,j
MOV DI,AX
MOV matrice[DI],
INC j
CMP j,3
JE INCJ
JMP START
INCJ: MOV j,0
INC i
CMP i,3
JE STOP
JMP START
STOP:
matrice db 0,0,0,0,0,0,0,0,0
i db 0
j db 0

26

DIRECTIVE DE ASAMBLARE
DIRECTIVA ASSUME
Directiva ASSUME informeaz asamblorul asupra segmentului logic ce trebuie
folosit pentru fiecare segment fizic al microprocesorului (segment de cod,
segment de date, segment de stiv, segment extra).
n exemplul de mai jos se informeaz asamblorul c segmentul logic PROG va
trebui folosit ca i segment de cod i segment de date:
ASSUME CS:PROG, DS:PROG

Toate adresele aferente codului i datelor vor fi calculate relativ la acest


segment. Directiva ASSUME servete doar ca referin a asamblorului, ci nu
schimb valoarea registrelor de segment. Modificarea valorilor registrelor de
segment cu valorile dorite intr n atribuiile programatorului. Programul de
mai jos ncarc segmentul de date DS cu valoarea 0200H, prin intermediul
celor dou instruciuni.

START: MOV AX,0200H


MOV DS,AX
DIRECTIVA END
Directiva END informeaz asamblorul c programul s-a ncheiat.

27

DIRECTIVE CONDIIONALE - IF
Processor EQU 80386
...
if Processor eq 80386
shl ax, 4
else
mov cl, 4
shl ax, cl
endif
Alte directive similare: IFE, IFDEF, IFB, IFIDN,
IFDIF

28

MACRO-URI
COPY macro Dest, Source
mov ax, Source
mov Dest, ax
endm

copy X,Y

Spre deosebire de proceduri nu este necesar


utilizarea instruciunii CALL
Probleme cu etichete i cu salturile.
Exist o serie de macro-uri predefinite: @substr,
@sizestr, @catstri variabile: @Date, @Time,
@CPU

29

DIRECTIVE REPETITIVE

Sunt considerate tot macro-uri:

; Code sequence using a run-time loop:


mov cx, 10
AddLp:
add ax, [bx]
add bx, 2
loop AddLp
; Code sequence using an assembly-time loop:
repeat 10
add ax, [bx]
add bx, 2
endm

30

DIRECTIVE REPETITIVE
for value,<0,1,2,3,4,5>
byte value
endm
echivalent cu
byte 0
byte 1
byte 2
byte 3
byte 4
byte 5

while expression
<Statements>
endm

31

UTILIZAREA DE PARAMETRII PENTRU


MACRO-URI
Needs2Parms macro parm1:req, parm2:req
.
.
.
endm
.
.
.
Needs2Parms ax
;Generates an error.
Needs2Parms
;Generates an error.
Needs2Parms ax, bx
;Works fine.

32

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