1 / 26

Limbaje de asamblare 2.Setul de instructiuni ISA x86

Limbaje de asamblare 2.Setul de instructiuni ISA x86. Sintaxa instructiunilor. <linie_program> := [<eticheta>:] [<prefix>] [<instructiune>|<directiva>] [;<comentar>] <eticheta> - sir de litere si cifre, care incepe cu o litera

wright
Download Presentation

Limbaje de asamblare 2.Setul de instructiuni ISA x86

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Limbaje de asamblare2.Setul de instructiuni ISA x86

  2. 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>

  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

  4. Sintaxa instructiunilor x86 • Exemple: • instructiuni fara operand NOP MOVSB • instructiuni cu un operand PUSH AX ROR DX • instructiuni cu doi operanzi MOV AX, BX • linie cu eticheta instructiune si comentar START: MOV AX,BX ;muta cont. AX in BX • linie de comentar ; aceasta este o linie de comentar • linie cu eticheta ETICHETA:

  5. 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

  6. 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

  7. 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

  8. 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.

  9. 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

  10. 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

  11. 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) !!!!!!!

  12. 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)

  13. 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

  14. 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

  15. 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

  16. Calculul adresei unei variabile (in modul real) 15 0 Adr. offet Adr. fizica Deplasament + + + (16 biti) (20 biti) SI DI BX BP CS DS Adr. segment *16 SS ES

  17. 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 DX ex: IN AL,DX OUT DX,AL

  18. 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,120 MOV AX, 12ABh MOV AL, 260 - eroare

  19. 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,AX MOV BX, AL – eronat MOV DS, 1234H - eronat

  20. Moduri de adresare pt. ISA x86Moduri 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, var1 MOV CX, [1234h] MOV var2, SI

  21. Moduri de adresare pt. ISA x86Moduri 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

  22. A[0] A[1] A[2] A[3] Deplasament + SI=i*lung. = Adresa A[i] Moduri de adresare pt. ISA x86Moduri 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], AL MOV VAR[10H], 1234H

  23. E1 E2 Ei Ei+1 + = BP Depl. Ei Adresa Ei Moduri de adresare pt. ISA x86Moduri 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

  24. Moduri de adresare pt. ISA x86Moduri 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], 1234H MOV VAR[BP][DI], AL MOV [100h][BP][SI], 1234H

  25. Moduri de adresare pt. ISA x86Moduri '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

  26. Moduri de adresare pt. ISA x86Moduri '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]

More Related