IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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
Inými slovami, jednotka bude na výslednom bitu len vtedy, ak ju mala obe čísla na týchto vstupných bitoch.

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
Ak je aspoň jeden z bitov na danej pozícii 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
Rovnako ako u 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
Príklad

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.


 

Všetky články v sekcii
Základy assembleri
Preskočiť článok
(neodporúčame)
Assembler - Kombinácia skokov a príznaky
Článok pre vás napísal Jakub Verner
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje programování v x86 Assembleru.
Aktivity