9. diel - Assembler - Inštrukcie pre prácu s číslami
V dnešnej lekcii sa budeme venovať inštrukciám pre výpočty s celými číslami.
Aritmetické operácie
Asi nie je nutné zmieňovať, že aritmetické inštrukcie pracujú s hodnotou v registri alebo premenné ako s jedným číslom. Počítajú teda podobne, ako sme to robili my treba v škole.
Všetky inštrukcie sa dajú použiť v kombinácii s 8-bitovými, 16-bitovými, 32-bitovými alebo 64-bitovými registre. Vo 32-bitové aplikáciu samozrejme nemôžeme používať 64-bitové registre. V 16-bitové aplikáciu nemáme prístup nielen k 64-bitovým registrom, ale ani k 32-bitovým registrom.
Inštrukcie INC
a
DEC
Inštrukcie INC
(INCrement) a DEC
(DECrement)
slúžia na pripočítanie alebo k odpočítaní hodnoty
1
v registri, či v nami vytvorené premennej. Inštrukcie
majú iba jeden operand (sú teda unárne).
Príklad
Ako jednoduchý príklad si môžeme uviesť kód:
xor ax, ax ; Vynuluj registr AX inc ax ; Přičti k registru AX hodnotu 1 mov bx, 1 ; Přesuň hodnotu 1 do registru BX dec bx ; Odečti z registru BX hodnotu 1 inc y ; Přičti 1 k proměnné y (kompilátor MASM) inc word [y] ; Přičti 1 k proměnné y (kompilátor NASM) dec i ; Odečti 1 od proměnné i (kompilátor MASM) dec word [i] ; Odečti 1 od proměnné i (kompilátor NASM)
U kompilátora NASM sa musí pred premennou písať jej typ. Kompilátor MASM je múdrejší a typ si zistí z definície premennej.
Akumulačné register AX
sa často používa pre vstupy /
výstupy a aritmetické operácie.
Všimnite si vynulovanie registra pomocou inštrukcie
XOR
.
Inštrukcie ADD
a
SUB
Oproti inštrukciám INC
a DEC
majú inštrukcie
ADD
(ADD) a SUB
(Subtract) dva operandy. Prvým
operandom je register alebo nami vytvorená premenná a druhým je register,
premenná alebo hodnota, ktorú chceme pripísať, alebo ktorú
chceme odpočítať. Nie je povolené, aby oba dva operandy
boli premenné. Ak chceme k jednej premennej pripočítať hodnotu inej
premennej, musíme si jednu z premenných najskôr načítať do registra.
Príklad
Ukážme si príklad:
xor ax, ax ; Vynuluj registr AX add ax, 5 ; Přičti k registru AX hodnotu 5 mov bx, 5 ; Přesuň hodnotu 5 do registru BX sub bx, 5 ; Odečti z registru BX hodnotu 5 add bx,cx ; Přičti registr CX k registru BX add dx,m ; Přičti proměnnou m k registru DX (kompilátor MASM) add dx,[m] ; Přičti proměnnou m k registru DX (kompilátor NASM) add j,ax ; Přičti registr AX k proměnné j (kompilátor MASM) add [j],ax ; Přičti registr AX k proměnné j (kompilátor NASM) add i,5 ; Přičti 5 k proměnné i (kompilátor MASM) add word [i],5 ; Přičti 5 k proměnné i (kompilátor NASM)
Ďalšie aritmetické inštrukcie (ADC
,
SBB
, MUL
, DIV
, IMUL
,
IDIV
) zatiaľ vynecháme.
Logické operácie
Teraz prejdeme k inštrukciám pracujúcim s číslami na úrovni jednotlivých bitov, teda núl a jednotiek, z ktorých sú poskladaná. Použiť môžeme zas registre alebo nami vytvorenú premennú.
Inštrukcie AND
Inštrukcie AND
má dva parametre, medzi ktorými vykoná
logický súčin. Výsledok sa ukladá do prvého operandu.
Tabuľka hodnôt
Hodnoty na jednotlivých bitoch sa spracujú nasledujúcim spôsobom:
A | B | Y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
Príklad
Ukážme si príklad:
mov al, 1100b ; Do registru AL přesuň hodnotu 1100b (sufix b znamená, že číslo je ve dvojkové soustavě) mov bl, 1010b ; Do registru BL přesuň hodnotu 1010b and al, bl ; Proveď logický součin - AL = 1000b
Inštrukcie OR
Inštrukcie pre logický súčet - OR
má
opäť dva operandy. Výsledok sa ukladá do prvého operandu.
Tabuľka hodnôt
Nižšie je vidieť tabuľka hodnôt logického súčtu:
A | B | Y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
1
, bude vo výslednom
čísle tento bit tiež 1
.
Príklad
Skúsme si to:
mov al, 1100b ; Do registru AL přesuň hodnotu 1100b mov bl, 1010b ; Do registru BL přesuň hodnotu 1010b or al, bl ; Proveď logický součet - AL = 1110b
Inštrukcie XOR
Inštrukcie XOR
má dva operandy, medzi ktorými vykoná
logickú non-ekvivalenciu - vráti 1
iba vtedy,
keď každý operand nadobúda unikátny hodnoty - a výsledok uloží opäť do
prvého operandu. Inštrukciu môžeme využiť na vynulovanie registrov, ako
sme si už ukazovali vyššie. Register sa vynuluje, pretože obaja operandy
majú rovnakú hodnotu, a teda je navrátená 0
.
Tabuľka hodnôt
Nasleduje tabuľka logické non-ekvivalencie:
A | B | Y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
OR
, ak je aspoň jeden z bitov na danej pozícii
1
, bude vo výslednom čísle tento bit tiež 1
. Ak
sú však obaja 1
, výsledok je 0
.
Príklad
Inštrukciu si vyskúšajme:
mov al, 1100b ; Do registru AL přesuň hodnotu 1100b mov bl, 1010b ; Do registru BL přesuň hodnotu 1010b xor al, bl ; Proveď logickou non-ekvivalenci - AL = 0110b xor al, al ; Vynuluj registr AL / Proveď logickou non-ekvivalenci - AL = 0 (1 ⊕ 1)
Inštrukcie NEG
Ako už napovedá názov, inštrukcie NEG
(Negation) slúži na
negovanie (invertovanie hodnoty z kladnej na zápornú a
naopak, teda ako znamienko -
). Funguje takmer rovnako ako
inštrukcie NOT
, s tým rozdielom, že po invertovanie všetkých
bitov pripočíta jedničku (možno ju poznáte pod pojmom "dvojkový
doplnok").
Inštrukcie má len jeden operand a tým je register alebo nami vytvorená premenná.
Príklad
Opäť si ukážme príklad:
mov al, 00000010b ; Do registru AL přesuň hodnotu 2 neg al ; Proveď negaci - AL = -2 (00000010⌝ + 00000001 = 11111110)
Inštrukcie NOT
Inštrukcie NOT
má iba jediný operand a rovnako ako
inštrukcie NEG
neguje (invertuje jednotlivé
bity). Použiť môžeme register alebo nami vytvorenú premennú. Inštrukciu
NOT
sa často hovorí "jednotkový doplnok".
Tabuľka logické negácia:
A | Y |
---|---|
0 | 1 |
1 | 0 |
Skúsme si NOT
:
mov al, 00000010b ; Přesuň do registru AL hodnotu 2 not al ; Proveď negaci - AL = -3 (00000010⌝ = 11111101)
Tento článok bol skôr teoretický, ale poznať tieto inštrukcie je nevyhnutné pri programovaní v Assemblera. Vývoju zdar!
V budúcej lekcii, Assembler - Kombinácia skokov a príznaky , sa naučíme kombinovať podmienené a nepodmienené skoky, zistíme, ako skokové inštrukcie získajú výsledok z CMP a ako porovnávať signed čísla.