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.

Podľa funkcie:

Presuny
Aritmeticko-logické
Posuny
Skoky
Špeciálne

MOV Move

Popis: Inštrukcia presunie obsah z jedného miesta na druhé. Najčastejšie sa vyskytujúca inštrukcia. Procesor vlastne stále len niečo niekam presúva.

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 Addition

Popis: Inštrukcia spočíta oba operandy a výsledok uloží do prvého z nich.

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 Subtraction

Popis: Inštrukcia odpočíta druhý operand od prvého a výsledok uloží do prvého z nich.

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 Increment by 1

Popis: Inštrukcia zväčší obsah operandu o jednotku. Je to rýchlejšie ako ADD zdroj,1.

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 Decrement by 1

Popis: Inštrukcia zmenší obsah operandu o jednotku. Je to rýchlejšie ako SUB zdroj,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 Shift Logical Left

Popis: Inštrukcia posunie register, alebo obsah pamäti o pocet miest doľava. Sprava sa doplní nula a najvyšší bit “prepadne” do príznakového bitu CF (carry flag). Pozn.: pocet sa uloží v registri CL.

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 Shift Logical Right

Popis: Inštrukcia posunie register, alebo obsah pamäti o pocet miest doprava. Na najvyšší bit príde nula a najnižší bit “prepadne” do príznakového bitu CF (carry flag). Pozn.: pocet sa uloží v registri CL.

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 Compare

Popis: Inštrukcia odpočíta druhý operand od prvého ale výsledok neuloží nikam, iba nastaví príznaky podobne ako inštrukcia SUB. Používa sa pri rozhodovaní, obvykle nasleduje inštrukcia podmieneného skoku.

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 Jump

Popis: Inštrukcia vykoná skok na návestie. Skok samotný procesor zrealizuje veľmi jednoducho — presunie novú adresu do registra IP (instruction pointer).

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 No Operation

Popis: Inštrukcia, ktorá nerobí nič. Používa sa ako malé oneskorenie, doladenie časových slučiek a pod.

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 

Close Menu