Assembler procesorov x86
V tomto dokumente nájdete výber inštrukcií aj s popisom, ktoré budete potrebovať na riešenie úloh 2.1 a – d. Zoznam nie je ani zďaleka kompletný, záujemcovia o hlbšie štúdium môžu čerpať napríklad z knihy Rudolf Marek: Učíme se programovat v jazyce Assembler pro PC. Vydavateľstvo Computer Press, Brno, 2005.
MOV ciel,zdroj ; ciel <- zdroj
Operandy:
reg, reg
reg, mem
mem, reg
reg, imm
mem, imm
Príznaky:
O D I T S Z A P C
Príklad:
MOV eax, 22 ; do registra EAX vlozime cislo 22
MOV ecx, 8 ; do registra ECX vlozime cislo 8
ADD eax, ecx ; vypocitame EAX = EAX + ECX
ADD ciel,zdroj ; ciel = ciel + zdroj
Operandy:
reg, reg
reg, mem
mem, reg
reg, imm
mem, imm
Príznaky:
O D I T S Z A P C
+ – – – + + + + +
Príklad:
MOV eax, 22 ; do registra EAX vlozime cislo 22
MOV ecx, 8 ; do registra ECX vlozime cislo 8
ADD eax, ecx ; vypocitame EAX = EAX + ECX
SUB ciel,zdroj ; ciel = ciel – zdroj
Operandy:
reg, reg
reg, mem
mem, reg
reg, imm
mem, imm
Príznaky:
O D I T S Z A P C
+ + + + + +
Príklad:
MOV eax, 22 ; do registra EAX vlozime cislo 22
MOV ecx, 8 ; do registra ECX vlozime cislo 8
SUB eax, ecx ; vypocitame EAX = EAX – ECX
INC zdroj ; zdroj = zdroj + 1
Operandy:
reg
mem
Príznaky:
O D I T S Z A P C
+ + + + +
Popis: Inštrukcia zväčší obsah operandu o jednotku. Je to rýchlejšie ako ADD zdroj,1.
Príklad:
MOV eax, 22 ; do registra EAX vlozime cislo 22
INC eax ; teraz EAX = 22 + 1
DEC zdroj ; zdroj = zdroj – 1
Operandy:
reg
mem
Príznaky:
O D I T S Z A P C
+ + + + +
Príklad:
MOV eax, 22 ; do registra EAX vlozime cislo 22
SUB eax ; teraz EAX = 22 – 1
SHL zdroj,pocet ; zdroj = zdroj<<pocet
Operandy:
reg,CL
mem,CL
Príznaky:
O D I T S Z A P C
+ + +
Príklad:
MOV eax, 22 ; do registra EAX vlozime cislo 22
SHL eax, 1 ; teraz EAX = 22<<1, teda 44.
SHR zdroj,pocet ; zdroj = zdroj>>pocet
Operandy:
reg,CL
mem,CL
Príznaky:
O D I T S Z A P C
+ + +
Príklad:
MOV eax, 22 ; do registra EAX vlozime cislo 22
SHR eax, 1 ; teraz EAX = 22>>1, teda 11.
CMP ciel,zdroj ; ciel – zdroj
Operandy:
reg, reg
reg, mem
mem, reg
reg, imm
mem, imm
Príznaky:
O D I T S Z A P C
+ + + + + +
Príklad:
MOV eax, 22 ; do registra EAX vlozime cislo 22
MOV ecx, 8 ; do registra ECX vlozime cislo 8
CMP eax,ecx ; porovnaj EAX a ECX
JZ niekam ; ak su rovnake, skoc niekam
JZ/JE Jump if Zero / Jump if Equal
Popis: Inštrukcia vykoná skok na návestie ak je výsledok predošlej operácie nula. Presnejšie povedané, ak ZF je nastavený skok sa vykoná. Nemusí to byť výsledok bezprostredne predošlej inštrukcie. Obvykle sa používa v kombinácii s inštrukciou CMP. Vtedy to znamená, že oba jej operandy boli rovnaké. Preto sa táto inštrukcia používa aj ako JE. Vygenerovaný kód je však rovnaký. Skok samotný procesor zrealizuje veľmi jednoducho — presunie novú adresu do registra IP (instruction pointer).JZ navestie ; if (ZF==1) goto navestie
JE navestie ; if (ZF==1) goto navestie
Operandy:
lab
Príznaky:
O D I T S Z A P C
Príklad:
MOV eax, 22 ; do registra EAX vlozime cislo 22
MOV ecx, 8 ; do registra ECX vlozime cislo 8
CMP eax,ecx ; porovnaj EAX a ECX
JE niekam ; ak su rovnake, skoc niekam
… ; tu pokracuje program ak EAX != ECX
niekam: … ; tu pokracuje program ak EAX == ECX
JG/JNLE Jump if Greater Than / Jump if Not Less Or Equal
Popis: Inštrukcia vykoná skok na návestie ak výsledok niektorej predošlej operácie nastaví príznaky SF a OF na rovnakú hodnotu a nie je to nula. Obvykle sa používa v kombinácii s inštrukciou CMP. Vtedy to znamená, že prvý jej operand je väčší (preto JG). To ale môžeme interpretovať aj tak, že nie je menší alebo rovný a preto sa táto inštrukcia používa aj ako JNLE. Vygenerovaný kód je však rovnaký.
JG navestie ; if (SF==OF && ZF==0) goto navestie
JNLE navestie ; if (SF==OF && ZF==0) goto navestie
Operandy:
lab
Príznaky:
O D I T S Z A P C
Príklad:
MOV eax, 22 ; do registra EAX vlozime cislo 22
MOV ecx, 8 ; do registra ECX vlozime cislo 8
CMP eax,ecx ; porovnaj EAX a ECX
JG niekam ; ak je EAX > ECX, skoc niekam
… ; tu pokracuje program ak EAX <= ECX
niekam: … ; tu pokracuje program ak EAX > ECX
JMP ciel ; goto ciel
Operandy:
ciel
Príznaky:
O D I T S Z A P C
Príklad:
JMP niekam ; skoc niekam
… ; toto preskocime
niekam: … ; tu pokracuje program
CPUID CPU Identification
Popis: Inštrukcia uloží do registrov xxx, xxx a xxx 12 znakový reťazec, jednoznačne identifikujúci výrobcu procesora. Podrobnejšie o inštrukcii CPUID…CPUID ; ebx,ecx,edx = VendorString
Operandy:
Príznaky:
O D I T S Z A P C
Príklad:
MOV eax, 0 ; do registra EAX vlozime 0
CPUID ; volanie funkcie CPUid
NOP ; nerobim nic
Operandy:
žiadne
Príznaky:
O D I T S Z A P C
– – – – – – – – –
Príklad:
OUT 44, AX ; na port 44 zapisem obsah registra AX
NOP ; chvilu pockam, lebo viem, ze je pomaly
OUT 44, BX ; na port 44 zapisem druhe cislo z registra BX