MS Office week
Pouze tento týden sleva až 80 % na e-learning týkající se MS Office
50 % bodů zdarma na online výuku díky naší Slevové akci!

Lekce 6 - Assembler - Instrukce pro práci s čísly

V minulé lekci, Assembler - Datové typy a proměnné, jsme si řekli o datových typech, které se používají při programování v Assembleru, a o práci s řetězci.

V dnešní lekci se budeme věnovat instrukcím pro práci s číselnými hodnotami.

Aritmetické operace

Asi není nutné zmiňovat, že aritmetické instrukce pracují s hodnotou v registru nebo proměnné jako s jedním číslem. Počítají tedy podobně, jako jsme to dělali my třeba ve škole.

Všechny instrukce se dají použít v kombinaci s 8bitovými nebo 16bitovými registry.

Instrukce INC a DEC

Instrukce INC (INCrement) a DEC (DECrement) slouží k přičtení nebo k odečtení hodnoty 1 v registru, či v námi vytvořené proměnné. Instrukce mají pouze jeden operand (jsou tedy unární).

Příklad

Jako jednoduchý příklad si můžeme uvést kód:

xor al, al ; Vynuluj registr AL
inc al ; Přičti k registru AL hodnotu 1

mov bl, 1 ; Přesuň hodnotu 1 do registru BL
dec bl ; Odečti z registru BL hodnotu 1

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

Pracujeme zde s registrem AL (akumulační registr, který se právě často používá pro vstupy/výstupy a aritmetické operace, používáme registr L pro nízké hodnoty). Hodnotu v něm zvýšíme o 1 a pak ji přesuneme do registru BL, kde ji zas o 1 snížíme.

Všimněte si vynulování registru pomocí instrukce XOR.

Instrukce ADD a SUB

Oproti instrukcím INC a DEC mají instrukce ADD (ADD) a SUB (SUBtract) dva operandy. Jedním může být registr nebo námi vytvořená proměnná a druhým je hodnota, kterou chceme přičíst, nebo kterou chceme odečíst.

Příklad

Ukažme si příklad:

xor al, al ; Vynuluj registr AL
add al, 5 ; Přičti k registru AL hodnotu 5

mov bl, 5 ; Přesuň hodnotu 5 do registru BL
sub bl, 5 ; Odečti z registru BL hodnotu 5

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

Příklad je podobný jako u INC a DEC, jen již nepřičítáme, neodčítáme jen jedničku, ale pětku.

Instrukce (kromě instrukce NEG) pro práci se zápornými čísly a další aritmetické instrukce (MUL) zatím vynecháme.

Logické operace

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Nyní přejdeme k instrukcím pracujícím s čísly na úrovni jednotlivých bitů, tedy nul a jedniček, ze kterých jsou poskládaná. Použít můžeme zas 8bitové i 16bitové registry nebo námi vytvořenou proměnnou.

Instrukce AND

Instrukce AND má dva parametry, mezi kterými provede logický součin. Výsledek se ukládá do prvního operandu.

Tabulka hodnot

Hodnoty na jednotlivých bitech se zpracují následujícím způsobem:

A B Y
0 0 0
0 1 0
1 0 0
1 1 1

Jinými slovy, jednička bude na výsledném bitu jen tehdy, pokud ji měla obě čísla na těchto vstupních bitech.

Příklad

Ukažme si příklad:

mov al, 0 ; Do registru AL přesuň hodnotu 0
mov bl, 1 ; Do registru BL přesuň hodnotu 1
and al, bl ; Proveď logický součin - AL = 0 (0 ∧ 1 = 0)

Instrukce OR

Instrukce pro logický součet - OR má opět dva operandy. Výsledek se ukládá do prvního operandu.

Tabulka hodnot

Níže je vidět tabulka hodnot logického součtu:

A B Y
0 0 0
0 1 1
1 0 1
1 1 1

Pokud je alespoň jeden z bitů na dané pozici 1, bude ve výsledném čísle tento bit také 1.

Příklad

Zkusme si to:

xor al, al ; Vynuluj registr AL
or al, 1 ; Proveď logický součet - AL = 1 (0 ∨ 1 = 1)

Instrukce XOR

Instrukce XOR má dva operandy, mezi kterými provede logickou non-ekvivalenci a výsledek uloží opět do prvního operandu. Instrukci můžeme využít k vynulování registrů, jak jsme si již ukazovali výše.

Tabulka hodnot

Následuje tabulka logické non-ekvivalence:

A B Y
0 0 0
0 1 1
1 0 1
1 1 0

Stejně jako u OR, pokud je alespoň jeden z bitů na dané pozici 1, bude ve výsledném čísle tento bit také 1. Pokud jsou ovšem oba 1, výsledek je 0.

Příklad

Instrukci si vyzkoušejme:

mov al, 1 ; Přesuň do registru AL hodnotu 1
xor al, al ; Vynuluj registr AL / Proveď logickou non-ekvivalenci - AL = 0 (1 ⊕ 1)

Instrukce NEG

Jak už napovídá název, instrukce NEG (NEGation) slouží k negování (invertování hodnoty, např. z kladné na zápornou a naopak, tedy jako znaménko -). Funguje téměř stejně jako instrukce NOT, s tím rozdílem, že po invertování všech bitů přičte jedničku (možná ji znáte pod pojmem "dvojkový doplněk").

Instrukce má jen jeden operand a tím je registr nebo námi vytvořená proměnná.

Příklad

Opět si ukažme příklad:

mov al, 00000010b ; Do registru AL přesuň hodnotu 2
neg al ; Proveď negaci - AL = -2 (00000010⌝ + 00000001 = 11111110)

Instrukce NOT

Instrukce NOT má pouze jediný operand a stejně jako instrukce NEG neguje (invertuje jednotlivé bity). Použít můžeme 8bitové i 16bitové registry nebo námi vytvořenou proměnnou. Instrukci NOT se často říká "jedničkový doplněk".

Tabulka logické negace:

A Y
0 1
1 0

Příklad

Zkusme si NOT:

mov al, 00000010b ; Přesuň do registru AL hodnotu 2
not al ; Proveď negaci - AL = -3 (00000010⌝ = 11111101)

Tento článek byl spíše teoretický, ale znát tyto instrukce je nezbytné při programování v Assembleru. Vývoji zdar!


 

Předchozí článek
Assembler - Datové typy a proměnné
Všechny články v sekci
Assembler
Článek pro vás napsal Jakub Verner
Avatar
Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!
Autor se věnuje programování v Assembleru a v C#. Rád se zlepšuje, rozšiřuje si znalosti a věří, že když člověk chce, dokáže cokoliv.
Aktivity (3)

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!