Inštrukcie logických operácií


<= =>


Logické inštrukcie sú jednou z dobrých pomôcok programátorov. ASM86 je schopný prevádzať všetky bežné logické operácie, a to so slovom alebo slabikou. Chýba tu teda inštrukcia pre jednotlivé bity. Tie však voľbou vhodných algoritmov môžeme ľahko nahradiť.

Koľkobitová operácia je, určuje opäť špecifikácia zdroja a cieľa. Inštrukciu TEST použijeme na nastavenie príznakového registra, a tak môžeme vetviť program, bez ovplyvnenia hodnoty zdroja a cieľa.

Použitie logických operácií

Vymaskovanie slabiky alebo slova
Často potrebuje programátor nastaviť niektoré bity slabiky, alebo slova do hodnoty log. 1, alebo 0. K tomu mu veľmi dobre poslúžia práve logické operácie AND alebo OR. Ak máme slabiku v tvare XXXXAXXX v registri AL a chceme, aby bity X mali hodnotu 0 a hodnota bitu A zostala zachovaná, prevedieme inštrukciu AND AL, 0x08 (=00001000). Ak máme slabiku v tvare XXXXAXXX v registri AL a chceme, aby bity X mali hodnotu 1 a hodnota bitu A zostala zachovaná, prevedieme inštrukciu OR AL, 0xF7 (=11110111).

Nulovanie registra
Zaujímavejšie ako inštrukcia MOV register,0 je nulovať pomocou XOR register, register. Efekt je rovnaký, doba vykonania operácie je kratšia.

Zistenie zvyšku po celočíselnom delení mocninami 2
Ak by sme vždy, keď chceme zistiť zvyšok po delení mocninami 2 (a ten často potrebujeme) používali inštrukciu DIV, program by sme zdržovali. Stačí si len uvedomiť, že môžeme zistiť hodnotu bitov v rádoch za log. 1 v binárnom tvaru delenca. Ak chceme zistiť zvyšok po celočíselnom delení 2 (párne, nepárne číslo) čísla v registri AL, stačí len použiť inštrukciu AND AL,1. V registri AL je potom len buď 1 (nepárne), alebo 0 (párne číslo). Pre lepšiu orientáciu poslúži prehľad:

Prevod čísla v nezhustenom BCD na ASCII
Veľmi jednoduchým prostriedkom, jak previesť číslo v rozsahu 0-9 do hodnoty jeho znaku v tabuľke ASCII, je logický súčet s číslom 0x30 (to je rovnaké ako pričítanie 48). Použitím tejto úpravy čísel v kódu BCD je zobrazenie i veľkých čísiel jednoduché.
#include <stdio.h>
unsigned char slabika;
char znak;
main() {
  scanf(”%1d”,&slabika);  // načíta jednociferné číslo
  asm {
    MOV AL, slabika       // do registra AL pridaj hodnotu slabiky
    OR  AL, 0x30          // preveď ju na ASCII
    MOV znak, al          // do premennej znak predaj ASCII hodnotu čísla
  }
  printf(“%c”,znak);
}

V príklade je načítané číslo z intervalu 0..9 prevedené do ASCII s pomocou log. inštrukcie OR.

Pred ďalším príkladom si musíme vysvetliť, ako ukladá C++ reťazce (typu char). Za reťazec je tu považované pole slabík, ktoré sú zapísané kódmi ASCII zapísaných znakov, a ktorý má za posledným znakom reťazca ukončovací znak nula (ASCII hodnota je rovná 0).

#include <stdio.h>
char slovo[254];
unsigned char i;
void main() {
  for (i=0; i<=9; i++)
  asm {
    MOV DI, offset slovo    // do registra DI ulož adresu premennej slovo
    XOR AH,AH               // nuluj AH
    MOV AL,i                // do AL vlož krok i
    ADD DI,AX               // pričítaj krok k adrese (posuv po reťazci)
    OR AL,0x30              // preveď obsah AL na ASCII znak
    MOV [DI],AL             // presuň znak do reťazca
    MOV BYTE PTR [DI+1], 0  // ukonči reťazec
  }
  printf("\n%s", slovo);
  getchar();
}

Tento príklad vytvorí reťazec s číslami od 0 do 9. To, že zatiaľ nevieme, ako sa v ASM86 tvoria cykly, nieje na závadu. Proste si pomôžeme vedomosťami z C++.

Kódovanie
Každý rád chráni svoje dáta pred neoprávneným prístupom kódovaním. K tomu dobre slúži logická operácia XOR. Postup kódovania naznačuje postup. Ak prevedieme operáciu XOR s konštantou a kódovaným číslom, získame kódované číslo. Pokiaľ s kódovaným číslom prevedieme opäť XOR s rovnakou konštantou, získame späť pôvodné číslo. Čísla kódované pridáme do EXE súboru programu. Pred ich použitím ich dekódujeme. Pretože tieto čísla môžu niesť napr. meno autora (v ASCII), je meno pre bežného užívateľa po zakódovaní nečitateľné (a teda ľahko neprepísateľné v súbore EXE). Pozor! Hodnota konštanty musí byť pri kódovaní i dekódovaní rovnaká. Tento postup môžeme ľubovolne pozmeňovať podľa úrovne našich znalostí (napr. xorovať prvý znak s druhým, druhý s tretím, . . .).


<= =>