26
Limbaje de asamblare 2.Setul de instructiuni ISA x86

Curs asm 3

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Curs asm 3

Limbaje de asamblare2.Setul de instructiuni ISA x86

Page 2: Curs asm 3

Sintaxa instructiunilor • <linie_program>:= [<eticheta>:] [<prefix>] [<instructiune>|

<directiva>] [;<comentar>]

• <eticheta> - sir de litere si cifre, care incepe cu o litera

• <prefix> - cuvant cheie care modifica regimul de executie al instructiunii care urmeaza (ex: REP – repeta instructiunea urmatoare de un nr. de ori)

• <instructiune>:= <mnemonica> [<operand1> [,<operand2>]]

• <mnemonica> - grup de litere care simbolizeaza o instructiune

• <operand1>:= <registru>|<variabila>• <operand2>:= <val_imediata>|<operand1>

Page 3: Curs asm 3

Sintaxa instructiunilor (continuare)

• <registru> := EAX|EBX|...AX|BX| .. |AH|BH|.. |AL|BL| ...|CS|DS, ...|GS => nume de registru

• <variabila>:= <nume_var>|<adresa_var>• <adresa_var>:=[<nume_var>]'['[reg_index]

[+<reg_baza>] [+<deplasament>]']'• <val_imediata>:=<numar>|<expresie>

– un numar sau o expresie aritmetico-logica care se poate evalua in momentul compilarii; se poate exprima in zecimal, hexazecimal (indicativul H) sau binar (indicativul B)

• <deplasament> := <val_pe_16biti>|<val_pe_32biti>– valoare exprimabila pe 16 sau 32 biti

• <comentar> - text (cu caracter explicativ) ignorat de compilator

Page 4: Curs asm 3

Sintaxa instructiunilor x86

• Exemple:– instructiuni fara operand

NOPMOVSB

– instructiuni cu un operandPUSH AXROR DX

– instructiuni cu doi operanziMOV AX, BX

– linie cu eticheta instructiune si comentarSTART: MOV AX,BX ;muta cont. AX in BX

– linie de comentar; aceasta este o linie de comentar

– linie cu etichetaETICHETA:

Page 5: Curs asm 3

Reguli sintactice

• o linie de program poate contine maxim o instructiune (mnemonica + operanzi) sau o directiva

• o linie poate contine:– nici o entitate de instructiune (camp) – linie goala– numai etichet– numai comentar– combinatii de eticheta, instructiune, directiva si comentar

• un comentar incepe cu ';' si se incheie la sfarsitul liniei• o instructiune x86 poate contine maxim 2 campuri de

operanzi: – operand1 – indica destinatia sau rezultat si primul termen al unei

operatii unare sau binare– operand2 – indica sursa sau al doilea termen al unei operatii

binare

Page 6: Curs asm 3

Reguli sintactice - Exemple

NOP • instructiune fara operanzi

MOVSB• instructiune cu operanzi impliciti

MUL CL• instructiune cu primul operand implicit (AX=AL*CL)

MOV AX, BX• AX – destinatia , BX sursa transferului

INC SI• SI – termenul incrementat si destinatia rezultatului

ADD CX,DX• CX – primul termen al sumei si destinatia rezultatului, DX – al

doilea termen

ADD AX,BX,CX• instructiune incorecta, prea multi operanzi

Page 7: Curs asm 3

Reguli sintactice

• pt. scrierea programului pot fi folosite litere mici si mari, insa asamblorul nu face distinctie intre literele mici si mai

• separarea campurilor dintr-o instructiune se poate face cu un numar arbitrar de caractere <spatiu> si <tab>

• pt. lizibilitate se recomanda aranjarea campurilor pe coloane distincte, separate prin <tab>: – eticheta: mnemonica operanzi ;comentar

• se recomanda utilizarea de nume simbolice in locul unor valori numerice ex: adrese de variabila => nume_variabila,

• adrese de instructiune => eticheta, • valori de constante numerice=>nume_constanta

Page 8: Curs asm 3

Reguli sintactice- simboluri

• Simboluri, identificatori, etichete:– secventa de litere, cifre si unele caractere speciale (ex: _, $, @), ?),

care nu incepe cu o cifra– lungimea simbolului este arbitrara, dar se considera primele 31

caractere– exista simboluri rezervate, predefinite in limbaj (cuvinte cheie pt.

instructiuni, directive, macrodefinitii)– exemple:

• L1 Bletch RightHere Right_Here Item1 __Special

• $1234 @Home $_1 Dollar$ WhereAmI? @1234

• erori:• 1TooMany – incepe cu o cifra• Hello.There – contine punct• $ - $ sau ? nu poate sa apara singur• LABEL – cuvant rezervat.

Page 9: Curs asm 3

Reguli sintactice - constante

• Constante:– intregi: 12, 21d, 123h, 0fffh, 1011b

– reale (flotant): 1.5, 1.0e10, 23.1e-12

– sir de caractere: "text", 'Text', 'TEXT''TEXT'

– constante simbolice: - nume simbolic dat pentru o secventa de caractere (text); ex:

unu equ 1

numar = 26

var textequ <5[bx]> ; 5[bx] – constanta textuala

Page 10: Curs asm 3

Reguli sintactice - operanzi

• operanzii unei instructiuni trebuie sa fie de aceeasi lungime: octet, cuvant, dublu-cuvant (exceptii: operatii de inmultire si impartire)

• o instructiune poate contine cel mult un operand de tip locatie de memorie – formatul instructiunilor x86 permite exprimarea adresei unei singure

locatii de memorie– pentru o operatie aritmetica sau logica intre doua variabile (locatii de

memorie) unul dintre operanzi trebuie sa se transfere temporar intr-un registru intern

– aceasta restrictie favorizeaza operatiile pe registre – pt. cresterea eficientei de executie

• instructiunile sunt echivalente ca nivel de structurare si sunt independente intre ele– nu exista forme de programare structurata– structurarea programului se poate face la nivel logic (formal) prin

directive

Page 11: Curs asm 3

Semnificatia entitatilor unei linii de program

• Eticheta: – nume simbolic dat unei adrese de memorie unde incepe

instructiunea care urmeaza dupa eticheta– util pentru instructiuni de salt si apel de rutine– se exprima prin : <adresa_segment>: <adresa_offset>

• Mnemonica (numele) instructiuii:– nume simbolic dat unui cod de instructiune (2, 3, 4 sau 5 litere)– semnifica un anumit tip de operatie elementara direct executabila

de UCP– aceeasi mnemonica poate simboliza mai multe coduri cu

semnificatie apropiata (ex: MOV, ADD, ...)– acelasi cod de instructiune se poate exprima prin mnemonici

diferite (ex: JZ si JE)– fiecarei instructiuni in L.A. ii corespunde strict o instructiune in

cod masina (relatie biunivoca) !!!!!!!

Page 12: Curs asm 3

Semnificatia entitatilor unei linii de program

• Operand:– camp care exprima un termen al operatiei elementare

exprimata prin mnemonica

– indica locul si modul de regasire al operandului (modul de adresare folosit)

– tipuri de operanzi:

• registre interne ale UCP:

• date imediate (constante numerice)

• locatii de memorie (variabile)

• porturi de intrare sau de iesire (registre de I/E)

Page 13: Curs asm 3

Semnificatia entitatilor unei linii de program(operanzi)

• Registre interne: – registre generale:

• (8 biti) AH,AL,BH,BL,CH,CL,DH,DL• (16 biti) AX, BX,CX,DX, SI,,DI,SP, BP• (32 biti) EAX, EBX,ECX,EDX, ESI,EDI,ESP, EBP

– registre speciale: CS,DS, SS, ES, FS,GS, GDTR, LDTR , CR0,..CR4, PSW

• Date imediate (constante): – numar sau expresie aritmetico-logica evaluabila la un numar =>

expresia trebuie sa contina numai constante– valoarea este continuta in codul instructiunii– lungimea constantei – in acord cu lungimea celui de al doilea

operand (octet, cuvant sau dublu-cuvant)– ex: 0, -5, 1234h, 0ABCDh, 11001010b, 1b, 8* 4 - 3

Page 14: Curs asm 3

Semnificatia entitatilor unei linii de program(operanzi)

• Locatii de memorie (variabile):– expresie care exprima adresa unei locatii de memorie de o

anumita lungime

– lungimea variabilei:

• in acord cu al doilea operand (daca exista)

• se deduce din declaratia numelui de variabila

• se indica in mod explicit ('byte', 'word', 'dword')

– adresa variabilei:

• adresa de segment: – specificata in mod implicit – continutul registrului DS

– exprimata in mod explicit: <reg_segment>:<variabila>

ex: CS: Var1, ES: [100h]

• adresa de offset - adresa relativa in cadrul segmentului

Page 15: Curs asm 3

Semnificatia entitatilor unei linii de program(operanzi; variabile)

• adresa de offset – adresa poate sa fie pe 16 biti (modul real) sau pe 32 biti (modul

protejat)

– exprimabila in mai multe moduri:• adresa fizica: valoare concreta de adresa

– '['<adresa_offset>']', ex: MOV AX, [100h]– '[ '[<reg_baza>] [+<reg_index>] [<deplasament>']'

ex: MOV AX, [BX+SI+100h]

• adresa simbolica: - nume simbolic dat unei variabile– VAR1, TEXT, VAR+5– VAR[BX], VAR[BX+SI]

<reg_baza>:= BX|BP|EBX|EBP<reg_index>:=SI|DI|ESI|EDI

Page 16: Curs asm 3

Calculul adresei unei variabile (in modul real)

Deplasament15 0

SI

DI

BX

BP

CS

DS

SS

ES

*16

+ + +Adr. offet Adr. fizica

Adr. segment

(16 biti) (20 biti)

Page 17: Curs asm 3

Semnificatia entitatilor unei linii de program(operanzi)

• Porturi de Intrare/Iesire – registre continute in interfetele de intrare/iesire– spatiul de adresare maxim: 64Ko (adr. maxima 0FFFFH)– la PC-uri spatiul este limitat la 1ko (adr. maxima 3FFH) (?)– pe aceeasi adresa pot fi 2 registre:

• un reg. de intrare si unul de iesire– porturile apar doar in instructiunile IN si OUT– specificare:

• direct, prin adresa fizica (daca adresa este exprimabila pe un octet) sau nume simbolic

ex: IN AL, 12h OUT 33h, AL

• indirect, prin adresa continuta in registrul DXex: IN AL,DX OUT DX,AL

Page 18: Curs asm 3

Moduri de adresare pt. ISA x86

• Moduri 8086• Adresarea imediata:

– operandul este o constanta – operandul este continut in codul instructiunii– operandul este citit o data cu instructiunea– instr. poate lucra cu o singura valoare– lungimea constantei este in acord cu celalalt operand– flexibilitate limitata – exemple:

MOV AL, 12h MOV AL,120MOV AX, 12ABh MOV AL, 260 - eroare

Page 19: Curs asm 3

Moduri de adresare pt. ISA x86Moduri 8086

• Adresarea de tip registru:– operandul este continut intr-un registru al UCP– timp de acces foarte mic; nu necesita ciclu de transfer

pe magistrala– instructiune scurta (nr. mic de biti pt. specificare

operand)– numar limitat de registre interne => nu toate

variabilele pot fi pastrate in registre– exista limitari in privinta registrelor speciale (ex:

registrele segment)– exemple:MOV AX,BX MOV DS,AXMOV BX, AL – eronat MOV DS, 1234H - eronat

Page 20: Curs asm 3

Moduri de adresare pt. ISA x86 Moduri 8086

• Adresarea directa (cu deplasament):– operanul este specificat printr-o adresa de memorie

(adresa relativa fata de inceputul unui segment)– adresa operandului este continuta in codul instructiunii– instructiunea poate lucra cu o singura locatie de

memorie (octet, cuvant sau dublu-cuvand)– necesita ciclu suplimentar de transfer cu memoria

=>timp de executie mai mare– adresarea directa se foloseste pt. variabile simple (date

nestructurate)– exemple:MOV AL, [100h] MOV BX, var1MOV CX, [1234h] MOV var2, SI

Page 21: Curs asm 3

Moduri de adresare pt. ISA x86 Moduri 8086

• Moduri indirecte de adresare: • Adresarea indirecta prin registru:

• adresa operandului se specifica intr-un registru

• registrele folosite pt. adresare: SI, DI, BX, BP

• instructiunea contine adresa registrului

• mod flexibil de adresare

• exemple:

MOV AL, [SI]

MOV [BX], CX

Page 22: Curs asm 3

Moduri de adresare pt. ISA x86 Moduri 8086

• Adresarea (indirecta) indexata:– adresa operandului se exprima printr-o adresa de baza, data de

<deplasament> si un index dat de continutul unui registru

– mod de adresare folosit pentru structuri de date de tip sir, vector, tablou

– sintaxa: <nume_var>'['<reg_index>']' <reg_index>:=SI|DI

'['<reg_index>+<deplasament>']'

– exemple:

MOV AX, VAR[BX] MOV CX, [SI+100H]

MOV VAR[DI], ALMOV VAR[10H], 1234HA[0] A[1] A[2] A[3]

Deplasament + SI=i*lung. = Adresa A[i]

Page 23: Curs asm 3

Moduri de adresare pt. ISA x86 Moduri 8086

• Adresarea (indirecta) bazata:– adresa operandului se exprima printr-o adresa de baza, data de un

registru si o adresa relativa data de <deplasament>– mod de adresare folosit pentru structuri de date de tip inregistrare– formal este identica cu adresarea indexata, dar alta interpretare– sintaxa: <nume_var>'['<reg_index>']' <reg_baza>:=BX|

BP'['<reg_baza>+<deplasament>']'

– exemple:MOV AX, VAR[BX] MOV CX, [SI+100H]MOV VAR[DI], AL MOV [SI][100h], 1234H

E1 Ei+1E2 Ei

Depl. Ei+ BP = Adresa Ei

Page 24: Curs asm 3

Moduri de adresare pt. ISA x86 Moduri 8086

• Adresarea mixta (bazat indexata):– adresa operandului se exprima printr-o adresa de baza, data de un

registru, un index dat de un registru si o adresa relativa data de <deplasament>

– mod de adresare folosit pentru structuri complexe de date de tip inregistrare de vectori sau vector de inregistrari

– modul cel mai flexibil de adresare, dar necesita 2 adunari– sintaxa: <nume_var>'['<reg_baza>+<reg_index>']'

'['<reg_baza>+<reg_index>+<deplasament>']'

'['<reg_baza>']''['<reg_index>']''['<deplasament>']'exemple:MOV AX, VAR[BX+SI] MOV CX, [BX+SI+100H]MOV VAR[BP+DI], AL MOV VAR[BP+SI], 1234HMOV VAR[BP][DI], AL MOV [100h][BP][SI], 1234H

Page 25: Curs asm 3

Moduri de adresare pt. ISA x86 Moduri '386, .. Pentium

• modificari fata de 8086:– extensia registrelor generale la 32 biti: EAX, EBX, ...– toate registrele generale pot fi folosite pentru adresarea indirecta

prin registru, indexata, bazata si mixta; – ex: [EAX], [ECX], VAR[EAX+ECX], [DX+AX+100h]– la adresarea mixta primul registru se considera registru de baza iar

al doilea registru index – !!!!! modurile '386 sunt mai putin eficiente decat cele 8086 !!!!!obs:1. In modul real adresa de offset nu poate depasi limita de 64ko,

chiar daca registrele sunt de 32 biti; in modul protejat adresa de offset se calculeaza pe 32 biti

2. Registrul SP nu poate fi folosit ca registru index 3. Daca se foloseste SP sau BP atunci implicit se lucreaza cu reg.

segment SS

Page 26: Curs asm 3

Moduri de adresare pt. ISA x86 Moduri '386, .. Pentium

• Adresarea indexata, scalata:– permite multiplicarea registrului index cu un factor egal cu

lungimea unui element din sir: • 1 pt. octet, 2 pt. cuvant, 4 pt. dcuvant si 8 pt. qcuvant

– simplifica parcurgerea tablourilor a caror elemente sunt mai mari de 1 octet

– sintaxa: (in loc de '+' se poate folosi '][')'['<reg_index>*n']''['<reg_index>*n + <deplasament> ']''[' <reg_baza> + <reg_index>*n']''[' <reg_baza> + <reg_index>*n + <deplasament> ']'ex: MOV AX, [SI*2] MOV DX, [AX*4+12h] MOV CX, 100h[BX][AX*1]