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ť.
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:
#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, . . .).
| <= | => |