Programarea in limbaj de asamblare Setul de instructiuni
Programarea in limbaj de asamblare Setul de instructiuni ISA x 86
Clasificarea instructiunilor • dupa importanta (grad de utilizare): – uzuale, ocazionale, folosite f. rar • dupa tipul de procesor: – 8086 (modul real), '386 (modul protejat), x 87 (instructiuni flotante), Pentium II (MMX) • dupa tipul operanzilor: – 8/16 biti, 32 biti, 64 biti • dupa complexitate: – simple (o singura operatie, mod simplu de adresare, lungime scurta, timp redus de executie) • dupa gradul de cunostere: – cunoscute, de care am auzit, necunoscute
Clasificarea instructiunilor • dupa tipul operatiei efectuate: – Instructiuni de transfer • mov, lea, les , push, pop, pushf, popf – Instructiuni de conversie • cbw, cwd, xlat – Instructiuni aritmetice • add, inc sub, dec, cmp, neg, mul, imul, div, idiv – Instructiuni logice, de rotatie, deplasare (shift) si pe bit • and, or, xor, not, shl, shr, rcl, rcr – Instructiuni de Intrare/Iesire (I/O) • in, out
Clasificarea instructiunilor • dupa tipul operatiei efectuate (continuare): – Instructiuni pe siruri • movs, stos, lods – Instructiuni de control al fluxului de program • jmp, call, ret, salturi conditionate – Instructiuni ale coprocesorului matematic • fmul – Instructiuni MMX • pmad – Alte instructiuni • clc, stc, cmc
Instructiuni de transfer Instructiunea MOV – Transfera o data pe 8, 16, 32 sau 64 biti: intre doua registre, intre un registru si o locatie de memorie sau o data imediata intr-un registru sau locatie de memorie • Sintaxa: Exemple: mov reg, reg mov ax, bx mov mem, reg mov al, ch mov reg, mem mov [100 h], ax mov mem, data_imediata mov var, 1234 h mov reg, data_imediata mov eax, 13 mov reg_segm, mem 16 mov ds, var[esi] mov reg_segm, reg 16 mov es, cx mov mem 16, reg_segm mov ebp, ess mov reg 16, reg_segm mov var, ds obs: mov mem, mem – eroare mov reg_segm, data_imediata - eroare
Instructiuni de transfer Instructiunile LDS, LES, LFS, LGS, si LSS • Sintaxa: Lx. S <reg 16|32>, mem 32|48 unde x Є [D, E, F, G, S] • Semnificatia: - incarcare pointer "far" < reg 16|32 > <= [mem 32|48]16|32 <reg_segm> <=[mem 32|48+2]16 • Exemple: lds esi, p 1 lss ebp, p 2 ; eds<=mem(p 1+4) ; ess<=mem(p 2+4) esi<=mem(p 1) ebp<=mem(p 2)
Instructiuni de transfer Instructiunea LEA • Sintaxa: lea reg 16, mem lea reg 32, mem ; doar pt. '386 si mai noi • Semnificatia: incarca in registru "adresa efectiva" a variabilei de memorie; incarcare pointer pe 16 sau 32 biti <reg 16/32> = adr_offset(mem) • !!! se ia adresa men. si nu continutul • exemple: lea ax, var 1 lea ebx, [ebx+5] lea edi, var[ebx+esi] lea esi, -100[edi] ; ax=offset(var) ; ebx=ebx+5 ; edi=ebx+esi+offset(var) ; esi=edi-100
Instructiuni de transfer Instructiunile PUSH si POP • sintaxa: push <operand> Push/Pop all/alldouble regs pop <operand> Flags pushf pushad popf popad enter <imed>, <imed> leave <operand> - reg 16, reg 32, reg_segm, data_imediata, mem • semnificatia: scriere/citire pe/de pe stiva sp=sp – 2 sau 4 <operand>=ss: [sp]=<operand> sp=sp + 2 sau 4
Instructiuni de transfer Instructiunile XCHG, LAHF, SAHF, BSWAP • XCHG – schimba continutul operanzilor intre ei – sintaxa: xchg <operand 1>, <operand 2> <operand 1/2> - reg 16, reg 32, mem 16, mem 32 • LAHF ah=<flags> SAHF <flags>=ah • BSWAP (numai pt. >'486) – converteste din Little-endian in Big-endian si invers – sintaxa: bswap <reg 32> – ex: bsawp eax ; byte 0 -7 byte 24 -31 si byte 8 -15 byte 16 -23
Instructiuni de conversie MOVZX, MOVSX, CBW, CWDE, and CDQ • MOVZX <dest>, <sursa> – – muta <sursa> in <dest> cu extensie 0 lungime(<dest>)=2*lungime(<sursa>) <sursa> - reg 8, reg 16, mem 8, mem 16 <dest> - reg 16, reg 32 • MOVSX <dest>, <sursa> – muta <sursa> in <dest> cu extensie de semn • • CBW - converteste al (byte) in ax (word) cu extensie de semn CWD - converteste ax (word) in dx: ax (dword) cu extensie de semn CWDE – converteste ax (word) in eax (dword) cu extensie de semn CDQ – converteste eax (dword) in edx: eax (qword) cu extensie de semn
Instructiuni de conversie XLAT • sintaxa: XLAT [<tabel>] – operandul este ignorat • semnificatia: – traduce un codul pe baza unui tabel de conversie (Look-up table); – adresa tabelului trebuie sa se incarce in prealabil in bx al=[bx+al] – util pentru conversii de cod, calcule rapide pe baza de rezultate precalculate (ex: inmultire, impartire)
Instructiuni aritmetice add, adc, sub, sbb • • add <dest>, <src> ; <dest> : = <dest> + <src> adc <dest>, <src> ; <dest> : = <dest> + <src> + C SUB <dest>, <src> ; <dest> : = <dest> - <src> sbb <dest>, <src> ; <dest> : = <dest> - <src> - C <dest> - reg 8/16/32, mem 8/16/32, <src> - reg 8/16/32, mem 8/16/32, , data_imediata operatiile aritmetice si logice afecteaza urmatorii indicatori de conditie: C, AC, Z, S, O, P eventuala depasire a capacitatii se verifica de programator (atentie la forma de reprezentare cu/fara semn) – C – depasire la operatiile fara semn – O – depasire la operatiile cu semn
Instructiuni aritmetice mul, imul • mul – inmultire nr. intregi fara semn • imul – inmultire nr. intregi cu semn mul src ; acc : = acc. LO * src imul dest, src 1, imm_src ; dest : = src 1 * imm_src imul dest, imm_src ; dest : = dest * imm_src imul dest, src ; dest : = dest * src – reg 8/16/32, mem 8/16/32 • acc – ax, dx: ax , edx: eax (dim(src)*2) • dest – reg 16/32 • src 1 –reg 16/32, mem 16/32 • imm_src – data_imediata 8/16/32
Instructiuni aritmetice div, idiv • div – impartire nr. intregi fara semn • idiv – impartire nr. intregi cu semn div src ; acc. LO : = acc / src ; acc. HI : = acc MOD src idiv src ; acc. LO : = acc / src ; acc. HI : = acc MOD src • src – reg 8/16/32, mem 8/16/32 • acc – ax, dx: ax, edx: eax (2*dim(src)) • nu se pot imparti 2 operanzi de aceeasi lungime • !!!! indicatorii de conditie (flags) au continut imprevizibil dupa inmultire si impartire!!!!!
Instructiuni aritmetice neg, inc, dec neg dest ; dest : = - dest inc dest ; dest : = dest + 1 dec dest ; dest : = dest – 1 • dest – reg 16/32, mem 16/32 • instructiuni scurte si rapide • inc si dec : – utile pt. parcurgerea unor siruri prin incrementarea sau decrementarea adresei – utile pentru contorizare (numarare)
Instructiune de comparare CMP • CMP – sintaxa: CMP <operand 1>, <operand 2> – executa o scadere fara a memora rezultatul – se foloseste doar pt. pozitionarea indicatorilor de conditie
Instructiuni logice • AND, OR, XOR, NOT – – operatii logice pe bit sintaxa: <operator> <operand 1>, <operand 2> <operand 1/2> : = <reg 8/16/32>|<mem 8/16/32>|<val_imed> semnificatia: <operand 1>=<operand 1><operator><operand 2> – exemple: and ax, bx or ax, 33 h not var 1 xor si, si mov al, 10101111 b and al, 00100000 b ; in al va fi 00100000 b
Instructiuni logice • Utilizarea operatorilor logici: – pentru extragerea unui bit sau a unui grup de biti dintrun set de valori logice ex: masca equ 101 b . . . and al, masca ; in al se pastreaza bitii D 0 si D 2 restul vor fi 0 – pentru a seta/reseta un bit sau un set de biti ex: masca 1 equ 80 h or al, masca ; D 7 va fi setat (valoare 1) masca 0 equ 7 fh and al, masca ; D 7 va fi resetat (valoare 0)
Instructiuni de deplasare • SHL/SAL, SHR, SAL – instructiuni pentru deplasarea continutului unui operand la stanga si la dreapta cu un numar de pozitii binare – deplasari: • logice: deplasare bit cu bit • "aritmetice": echivalente cu operatiile de inmultire si impartire – sintaxa: <instructiune> <operand>, <contor> <operand>: =<reg>|<mem> <contor>: =1| cl |<val_imediata> (<val_imediata> doar la procesoarele mai noi)
Instructiuni de deplasare SHL SHR SAR CF 0 Dn D 2 D 1 D 0 CF 0 - la procesoarele >286 - SHLD, SHRD - sintaxa: <instr> <destinatie>, <sursa>, <contor> CF Destinatie Copie sursa - <contor>: = cl | <val_imediata> - sursa si destinatia sunt pe 16 sau 32 de biti
Instructiuni de rotatie • RCR, RCL, ROR, ROL – instructiuni de rotatie la stanga si la dreapta, cu si fara CF – sintaxa: <instructiune> <operand>, <contor> <operand>: =<reg>|<mem> <contor>: = 1| cl| <val_imed. > RCL CF Dn D 1 D 0 ROL CF Dn D 1 D 0
Instructiuni pe bit • TEST – sintaxa: TEST <operand 1>, <operand 2> – executa un SI logic fara a memora rezultatul – se foloseste doar pt. pozitionarea indicatorilor de conditie • BT, BTC, BTR, BTS – sintaxa: <instr> <operand>, <index> – copiaza bitul specificat de <index> din <operand> in CF – BTC complementeaza, BTR reseteaza, iar BTS seteaza bitul dupa copiere
Instructiuni pe bit • SETcc – – sintaxa SETcc <reg 8>|<mem 8> – seteaza <reg 8>|<mem 8> daca o conditia este indeplinita – ex: SETC, SETNC, SETZ, SETNZ, . . SETA, SETB, SETE, SETGE, SETBE, . . .
Instructiuni de intrare/iesire • IN, OUT – sintaxa: IN <destinatie>, <port> OUT <port>, <sursa> <destinatie>, <sursa> : = AL| AX|EAX <port>: = <valoare 8>| DX
- Slides: 24