%include "rw32.inc" section .text main: ; Rozdíl mezi NOT a NEG - ukázka v debuggeru mov eax, 0 mov ah, byte 5 neg ah mov al, byte 5 not al mov ax, 0x00AA ; Převeď 0xAA -> 0xAC jen pomocí NOT a NEG ; Zapni si v debbugeru náhled HEX a BIN formátu ;) ret
; ukázka TEST, AND, OR, XOR %include "rw32.inc" section .text main: mov al, 0b11010101 mov bl, 0b10010001 nop test al, bl ; TEST == AND nop ; maskovani, jen spolecne jednickove bity and al, bl nop mov al, 0b01010101 or al, bl ; aspon jedna jednicka xor al, 5 ; 0b00000101 nop xor eax, eax ; vynulovani ret
; Úkol - Zašifrování zprávy ; * Definuj si proměnnou klíč (číslo) ; * Načti od uživatele číslo, proveď zašifrování a vypiš ; * Následně zašifrované číslo dešifruj a opět vypiš %include "rw32.inc" section .data ; your key section .text main: ; your code ret
; Shifty ukázka %include "rw32.inc" section .text main: mov eax, 0xE555 ; SHR - posun v rámci paměťového místa/registru dopRava shr ax, 1 shr ax, 1 shr ax, 1 shr ax, 3 nop ; SHL - posun v rámci paměťového místa/registru doLeva shl ax, 1 shl ax, 1 shl ax, 1 shl ax, 3 nop mov ax, 0xF5F5 ; SAR - aritmetický posun v rámci paměťového místa/registru dopRava sar ax, 1 sar ax, 1 sar ax, 1 sar ax, 3 nop ; SAL - aritmetický posun v rámci paměťového místa/registru doLeva sal ax, 1 sal ax, 1 sal ax, 1 sal ax, 3 nop xor eax, eax ; 128 / 2^3 = 128 / 8 = 16 mov ax, 128 shr ax, 3 nop ; 8 * 2^5 = 8 * 32 = 256 mov ax, 8 shl ax, 5 nop ret
; Využíj instrukce posuvu pro násobení a dělení ; 0) Definuj 16b pole 'res' se třemi prvky (všechny hodnoty nastav 0) ; 1) Nahraj do 16b registru konstantu 100 ; 2) Číslo vyděl 2 pomocí logické instrukce posuvu (100/2) ; 3) Výsledek ulož do res[0] ; 4) Získané číslo vynásob 8 pomocí logické instrukce ; 5) Výsledek ulož do res[1] ; 6) Ziskané číslo zneguj a vyděl číslem 4 - pozor na zachovaní znaménka! ; 7) Výsledek ulož do res[2] ; 8) Všechny čísla z res sečti a výsledek vypiš do terminálu ; x) (Až po rotacích) Výsledek vynásob číslem 1234 (MUL) a znova vypiš
; ukázka rotace %include "rw32.inc" section .text main: xor eax, eax mov ecx, 6 ; počet cyklů mov al, 0b00110111 ; výchozí číslo .cyklusL: rol al, 1 loop .cyklusL nop mov ecx, 6 ; počet cyklů mov al, 0b00110111 ; výchozí číslo .cyklusR: ror al, 1 loop .cyklusR nop ret ; modifikuj ROL -> RCL a ROR -> RCR
%include "rw32.inc" section .text main: mov eax, 0xAABBCCDD ; Přesun 8-bitových bloků (pomocí rotace), vypiš s WriteHex32 ; EAX |a0|a1|a2|a3| ; EAX |a3|a1|a0|a2| ; 0xDDBBAACC ret
; ukázka JUMPu %include "rw32.inc" section .data print_nop db "Bez preteceni", 0 print_cf db "Preteceni!", 0 section .text main: ; ukazka - jump if carry mov al, 255 ; 255 -> 2 add al, 5 jc preteceni pokracuj: mov esi, print_nop jmp konec konec: call WriteString call WriteNewLine ret preteceni: mov esi, print_cf jmp konec
; Definuj pole 'pole' o velikosti byte s více jak 5 prvky (libovolné hodnoty) ; Definuj proměnnou s počtem prvků (musíš ručně spočítat/zadat) ; Výpočítej průměrnou hodnotu pole 'pole' ; Využí skákání na návěští, v ECX dekrementuj počet cyklů