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äťouMOVZX
,MOVSX
- presun a zároveň rozšírenie na väčší typ, doplnenie nulami alebo znamienkomCMOVcc
- podmienené priradenieLEA
- výpočet adresyPUSH
,POP
- uloženie a vyzdvihnutie hodnoty zo zásobníkaPUSHA
,POPA
- uloženie všetkých registrov na zásobníkXCHG
- prehodenie dvoch hodnôt
Vetvenie programu
Nasledujúce inštrukcie súvisia s vetvením programu:
JMP
- bezpodmienečný skokJcc
- podmienený skok (cc je príznak alebo podmienka, napr.C
,Z
,G
,LE
)CALL
- volanie funkcieRET
,RETN
- návrat z funkcie a prípadne tiež odstránenie parametrov zo zásobníkaINT
- vyvolanie prerušeniaIRET
- návrat z prerušeniaSYSCALL
- volanie funkcie operačného systémuSYSRET
- 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íkLAHF
,SAHF
- uloženie príznakovSF
,ZF
,AF
,PF
,CF
do registraAH
SETcc
- uloženie jedného príznaku do ľubovoľného registra alebo do pamäteCLC
,STC
,CMC
- vynulovanie, nastavenie alebo zmenaCF
(Carry)CLD
,STD
- vynulovanie alebo nastavenieDF
(Direction)
Aritmetické operácie
Pre aritmetické operácie máme k dispozícii inštrukcie:
ADD
,ADC
,SUB
,SBB
- sčítanie, odčítanieINC
,DEC
- zväčšenie o jedna, zmenšenie o jednaMUL
,IMUL
,DIV
,IDIV
- násobenie, delenie, bez znamienka alebo so znamienkomCMP
- nákupnýNEG
- zmena znamienkaCBW
,CWD
,CWDE
,CDQ
- konverziaAL
naAX
,AX
naDX:AX
,AX
naEAX
,EAX
naEDX: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áciaTEST
- podobné akoAND
, 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íznakCF
SHL
,SHR
,SAL
,SAR
- posuny vľavo / vpravo, logické / aritmetickéSHLD
,SHRD
- posuny cez dva registreBSF
,BSR
- hľadanie bitu dopredu / dozaduBT
,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ťazcaREPE CMPS
- porovnanie dvoch reťazcovREPNE 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äteFSTP
,FISTP
- uloženie výsledkuFXCH
- prehodenie dvoch registrovFLDZ
,FLD1
,FLDPI
- konštanty0
,1
, PiFADD
,FSUB
,FMUL
,FDIV
,FDIVR
,FSQRT
- sčítanie, odčítanie, násobenie, delenie, inverzný delenie, druhá odmocninaFSIN
,FCOS
,FPTAN
- goniometrické funkcieFABS
,FCHS
,FRNDINT
- absolútna hodnota, zmena znamienka, zaokrúhlenieFCOM
,FCOMI
,FTST
- nákupný
MMX (Multi Media Extension)
MMX inštrukcie vykonávajú výpočty s 64-bitovými registrami
MM0
až MM7
, 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
- presunyPADD
,PADDS
,PADDUS
,PMADD
,PMULH
,PMULL
,PSUB
,PSUBS
,PSUBUS
- aritmetické operáciePAND
,PANDN
,POR
,PXOR
- logické operáciePCMPEQ
,PCMPGT
- nákupnýPACKSSDW
,PACKSSWB
,PACKUSWB
,PUNPCKH
,PUNPCKL
- konverziePSLL
,PSRA
,PSRL
- bitové posunyEMMS
- prepnutie z MMX na X87 FPU
SSE (Streaming SIMD Extensions)
SSE inštrukcie vykonávajú výpočty sa 128-bitovými registrami
XMM0
až XMM15
. 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
- presunyADDSS
,SUBSS
,MULSS
,DIVSS
,RCPSS
,MAXSS
,MINSS
,SQRTSS
,RSQRTSS
- aritmetické operácieCMPSS
,COMISS
,UCOMISS
- nákupnýCVTSI2SS
,CVTSS2SI
,CVTTSS2SI
- konverzieSHUFPS
,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 segmentovIN
,OUT
- vstup a výstup (komunikácia s hardvérom)HLT
- zastavenie programuINVD
- 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 intervaleBSWAP
- konverzie medzi little endian a big endianCPUID
- detekcia typu procesoraRDTSC
- 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 0
až
9
, alebo hodnoty 30h
až 39h
, čo v ASCII
tabuľke náleží znakom '0'
až '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štrukciuADD
vo formáte packedDAS
(Decimal Adjust after Subtraction) - použije sa po inštrukciuSUB
vo formáte packedAAA
(ASCII Adjust after Addition) - použije sa po inštrukciuADD
vo formáte unpackedAAS
(ASCII Adjust after Subtraction) - použije sa po inštrukciuSUB
vo formáte unpackedAAM
(ASCII Adjust for Multiplication) - použije sa po inštrukciuMUL
vo formáte unpacked, ale je možné takto vynásobiť iba jednociferné číslaAAD
(ASCII Adjust before Division) - použije sa pred inštrukciíDIV
vo formáte unpacked, ale operandmi musí byť menšia ako 100FBLD
- z pamäte načíta10
bajtov, ktoré obsahujú 18 číslic. V poslednom bajtu je v najvyššom bitu znamienko. Hodnotu uloží do FPU registraST(0)
.FBSTP
- reálne číslo z registraST(0)
zaokrúhli a do pamäti zapíše10
bajtov v rovnakom formáte ako inštrukcieFBLD
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.