IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

12. diel - Assembler - Register inštrukcií procesora

V minulej lekcii, Assembler - Registre procesora , sme si ukázali skoro všetky registre procesorov x86 a x64.

Procesor má veľké množstvo inštrukcií, v ktorých sa nie je ľahké vyznať. Preto si dnes ukážeme ich stručný prehľad, aby sme mali predstavu, čo všetko procesor dokáže. Ani zďaleka to nie je kompletný zoznam. Jednotlivé inštrukcie budú podrobnejšie vysvetlené v ďalších lekciách.

Táto lekcia slúži na zopakovanie inštrukcií, ktoré už poznáme, ako ochutnávka inštrukcií nových, a ako záchytný bod, ku ktorému sa môžete kedykoľvek vrátiť a inštrukcie si zopakovať.

Presun dát

Pre presun dát môžeme použiť:

  • MOV - priradenie hodnoty do registra, presun hodnôt medzi dvoma registrami alebo medzi registrom a pamäťou
  • MOVZX, MOVSX - presun a zároveň rozšírenie na väčší typ, doplnenie nulami alebo znamienkom
  • CMOVcc - podmienené priradenie
  • LEA - výpočet adresy
  • PUSH, POP - uloženie a vyzdvihnutie hodnoty zo zásobníka
  • PUSHA, POPA - uloženie všetkých registrov na zásobník
  • XCHG - prehodenie dvoch hodnôt

Vetvenie programu

Nasledujúce inštrukcie súvisia s vetvením programu:

  • JMP - bezpodmienečný skok
  • Jcc - podmienený skok (cc je príznak alebo podmienka, napr. C, Z, G, LE)
  • CALL - volanie funkcie
  • RET, RETN - návrat z funkcie a prípadne tiež odstránenie parametrov zo zásobníka
  • INT - vyvolanie prerušenia
  • IRET - návrat z prerušenia
  • SYSCALL - volanie funkcie operačného systému
  • SYSRET - návrat z funkcie operačného systému

Príznaky

S príznakmi pracujeme nasledujúcimi inštrukciami:

  • PUSHF, POPF - uloženie všetkých príznakov na zásobník
  • LAHF, SAHF - uloženie príznakov SF, ZF, AF, PF, CF do registra AH
  • SETcc - uloženie jedného príznaku do ľubovoľného registra alebo do pamäte
  • CLC, STC, CMC - vynulovanie, nastavenie alebo zmena CF (Carry)
  • CLD, STD - vynulovanie alebo nastavenie DF (Direction)

Aritmetické operácie

Pre aritmetické operácie máme k dispozícii inštrukcie:

  • ADD, ADC, SUB, SBB - sčítanie, odčítanie
  • INC, DEC - zväčšenie o jedna, zmenšenie o jedna
  • MUL, IMUL, DIV, IDIV - násobenie, delenie, bez znamienka alebo so znamienkom
  • CMP - nákupný
  • NEG - zmena znamienka
  • CBW, CWD, CWDE, CDQ - konverzia AL na AX, AX na DX:AX, AX na EAX, EAX na EDX:EAX
  • XADD, CMPXCHG - súčet s výmenou, porovnanie s výmenou

Logické operácie

Teraz si ukážme, ako voláme logické operácie:

  • AND, OR, XOR, NOT - logický súčin, súčet, exkluzívne súčet, negácia
  • TEST - podobné ako AND, ale iba nastaví príznaky

Bitové operácie

Pracovať môžeme is jednotlivými bity:

  • ROL, ROR, RCL, RCR - rotácia vľavo / vpravo, cez príznak CF
  • SHL, SHR, SAL, SAR - posuny vľavo / vpravo, logické / aritmetické
  • SHLD, SHRD - posuny cez dva registre
  • BSF, BSR - hľadanie bitu dopredu / dozadu
  • BT, BTC, BTR, BTS - testovanie jedného bitu, so zmenou / vynulovaním / nastavením

Práca s reťazcami

Pomocou inštrukcií môžeme pracovať s textovými reťazcami:

  • REP MOVS - kópia reťazca
  • REPE CMPS - porovnanie dvoch reťazcov
  • REPNE SCAS - vyhľadanie znaku v reťazci

Výpočty s reálnymi číslami

S desatinnými číslami pracujeme týmito inštrukciami:

  • FLD, FILD - načítanie reálneho alebo celého čísla z pamäte
  • FSTP, FISTP - uloženie výsledku
  • FXCH - prehodenie dvoch registrov
  • FLDZ, FLD1, FLDPI - konštanty 0, 1, Pi
  • FADD, FSUB, FMUL, FDIV, FDIVR, FSQRT - sčítanie, odčítanie, násobenie, delenie, inverzný delenie, druhá odmocnina
  • FSIN, FCOS, FPTAN - goniometrické funkcie
  • FABS, FCHS, FRNDINT - absolútna hodnota, zmena znamienka, zaokrúhlenie
  • FCOM, FCOMI, FTST - nákupný

MMX (Multi Media Extension)

MMX inštrukcie vykonávajú výpočty s 64-bitovými registrami MM0MM7, z ktorých každý môže obsahovať niekoľko celých čísel. Pracujeme teda s niekoľkými číslami súčasne. Tieto registre sme si už popísali v lekcii Assembler - Registry procesora.

Aritmetické inštrukcie majú sufixy D, W, B podľa toho, či počítajú s dvoma 32-bitovými číslami, štyrmi 16-bitovými číslami, alebo ôsmich 8-bitovými číslami:

  • MOVD, MOVQ - presuny
  • PADD, PADDS, PADDUS, PMADD, PMULH, PMULL, PSUB, PSUBS, PSUBUS - aritmetické operácie
  • PAND, PANDN, POR, PXOR - logické operácie
  • PCMPEQ, PCMPGT - nákupný
  • PACKSSDW, PACKSSWB, PACKUSWB, PUNPCKH, PUNPCKL - konverzie
  • PSLL, PSRA, PSRL - bitové posuny
  • EMMS - prepnutie z MMX na X87 FPU

SSE (Streaming SIMD Extensions)

SSE inštrukcie vykonávajú výpočty sa 128-bitovými registrami XMM0XMM15. Na rozdiel od MMX môžu obsahovať nielen celé čísla, ale aj reálne čísla.

Posledné písmeno názvu väčšiny inštrukcií je D alebo S podľa toho, či počítajú s dvoma 64-bitovými reálnymi číslami (Double) alebo so štyrmi 32-bitovými reálnymi číslami (Single). Predposledný písmeno je P alebo S podľa toho, či sa počíta s vektorom (Packed) alebo s jedinou hodnotou (Single):

  • MOVSS, MOVAPS, MOVUPS, MOVLPS, MOVHPS, MOVLHPS, MOVHLPS - presuny
  • ADDSS, SUBSS, MULSS, DIVSS, RCPSS, MAXSS, MINSS, SQRTSS, RSQRTSS - aritmetické operácie
  • CMPSS, COMISS, UCOMISS - nákupný
  • CVTSI2SS, CVTSS2SI, CVTTSS2SI - konverzie
  • SHUFPS, UNPCKHPS, UNPCKLPS - zamiešanie

AVX (Advanced Vector Extensions)

AVX inštrukcie pracujú s 256-bitovými registrami YMM0 - YMM15 alebo s 512-bitovými registrami ZMM0 - ZMM15. Inštrukcie sú podobné ako u SSE, ale začínajú písmenom V.

Privilegované inštrukcie

Tieto inštrukcie môže používať len operačný systém:

  • STI, CLI - povolenie a zakázanie hardvérových prerušení
  • LIDT, LGDT, LLDT - nastavenie adresy tabuľky prerušenia, globálnych segmentov alebo lokálnych segmentov
  • IN, OUT - vstup a výstup (komunikácia s hardvérom)
  • HLT - zastavenie programu
  • INVD - vymazanie cache

Ostatné inštrukcie

Ukážme si ešte niekoľko ďalších užitočných inštrukcií:

  • BOUND - test či je číslo v danom intervale
  • BSWAP - konverzie medzi little endian a big endian
  • CPUID - detekcia typu procesora
  • RDTSC - počítadlo cyklov (Time-Stamp Counter)
  • NOP - táto inštrukcia znamená no operation a nerobí vôbec nič

Nepoužívané inštrukcie

Nasledujúce inštrukcie sú v procesore len kvôli kompatibilite so staršími aplikáciami.

V dnešnej dobe sa prakticky nepoužívajú, pretože sú pomalé.

Tu si iba ukážeme, akými inými inštrukciami ich môžeme nahradiť:

  • ENTER - push rbp; mov rbp,rsp; sub rsp,n
  • LEAVE - mov rsp,rbp; pop rbp
  • LOOP - dec rcx; jnz label
  • LOOPZ - jnz label2; dec rcx; jnz label; label2:
  • LOOPNZ - jz label2; dec rcx; jnz label; label2:
  • XLATB - mov al,[rbx+rax]
  • LODSB - mov al,[rsi]; inc rsi
  • LODSW - mov ax,[rsi]; inc rsi
  • LODSD - mov eax,[rsi]; inc rsi
  • LODSQ - mov rax,[rsi]; inc rsi
  • STOSB - mov [rdi],al; inc rdi
  • STOSW - mov [rdi],ax; inc rdi
  • STOSD - mov [rdi],eax; inc rdi
  • STOSQ - mov [rdi],rax; inc rdi

BCD aritmetika

Skratka BCD (Binary Coded Decimal) znamená binárne kódovanie čísel v desiatkovej sústave. Vo formáte packed sú v každom bajtu dve číslice. Vo formáte ASCII čiže unpacked je v každom bajtu iba jedna číslica (buď hodnota 09, alebo hodnoty 30h39h, čo v ASCII tabuľke náleží znakom '0''9').

Tieto inštrukcie v dnešnej dobe nikto nepoužíva. Prvých šesť z nich už dokonca ani nefungujú v 64-bitových aplikáciách (spôsobujú výnimku illegal instruction).

Inštrukcie sú:

  • DAA (Decimal Adjust after Addition) - použije sa po inštrukciu ADD vo formáte packed
  • DAS (Decimal Adjust after Subtraction) - použije sa po inštrukciu SUB vo formáte packed
  • AAA (ASCII Adjust after Addition) - použije sa po inštrukciu ADD vo formáte unpacked
  • AAS (ASCII Adjust after Subtraction) - použije sa po inštrukciu SUB vo formáte unpacked
  • AAM (ASCII Adjust for Multiplication) - použije sa po inštrukciu MUL vo formáte unpacked, ale je možné takto vynásobiť iba jednociferné čísla
  • AAD (ASCII Adjust before Division) - použije sa pred inštrukcií DIV vo formáte unpacked, ale operandmi musí byť menšia ako 100
  • FBLD - z pamäte načíta 10 bajtov, ktoré obsahujú 18 číslic. V poslednom bajtu je v najvyššom bitu znamienko. Hodnotu uloží do FPU registra ST(0).
  • FBSTP - reálne číslo z registra ST(0) zaokrúhli a do pamäti zapíše 10 bajtov v rovnakom formáte ako inštrukcie FBLD

V budúcej lekcii, Assembler - Výpočty s reálnymi číslami , sa naučíme SSE inštrukcie pre prácu s reálnymi číslami.


 

Predchádzajúci článok
Assembler - Registre procesora
Všetky články v sekcii
Základy assembleri
Preskočiť článok
(neodporúčame)
Assembler - Výpočty s reálnymi číslami
Článok pre vás napísal Petr Laštovička
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje vývoji webových aplikací v ASP.NET a aplikací pro Windows v C++ nebo C#.
Aktivity