User Tools

Site Tools


isu:cv05

[ISU] 5. Logické instrukce

cv5_1.asm

cv5_1.asm
%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

cv5_A.asm ukázka

cv5_A.asm
; ukázka TEST, AND, OR, XOR
%include "rw32.inc"
 
section .text
main:
    xor eax, eax
    xor ebx, ebx
 
    mov al, 0b11100101
    mov bl, 0b10011001
    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

cv5_2.asm

cv5_2.asm
; Úkol - Zašifrování zprávy
;  * Definuj si proměnnou klíč (číslo) a krátký text (4 symboly)
;  * Krátký text načti z paměti do registru (nebo pracuj přímo v paměti)
;  * Proveď zašifrování (xor), ulož/přepiš proměnnou a vypiš
;  * Následně zašifrovaný text dešifruj a opět vypiš
;  Libovolně můžete přidat další instukce pro větší zabezpečení
 
%include "rw32.inc"
 
section .data
    key XX XXX      ; your key
    txt db "AHOJ",0 ; 4 symbols text + 0
 
section .text
main:
    ; your code
 
    mov esi, txt
    call WriteStringASCIIZNewLine
    ret

cv5_B.asm ukázka

cv5_B.asm
; 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

cv5_3.asm

cv5_3.asm
; 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) Získané čí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

cv5_C.asm ukázka

cv5_C.asm
; ukázka rotace (v cyklu)
%include "rw32.inc"
 
section .text
main:
    xor eax, eax
    mov ecx, 6  ; počet cyklů
    mov al, 0b00010111
 
.cyklusL:
    rol al, 1   ; change ROL -> RCL
    loop .cyklusL
    nop
 
    mov ecx, 6  ; počet cyklů
    mov al, 0b00010111
 
.cyklusR:
    ror al, 1   ; change ROR -> RCR
    loop .cyklusR
    nop
 
    ret

cv5_4.asm

cv5_4.asm
%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|
 
 
    ret

cv5_D.asm ukázka

cv5_D.asm
; 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

cv5_5.asm

cv5_5.asm
; Úkol 5 - Zašifrování zprávy - vylepšení úkolu 2
;  * Definuj si proměnnou klíč (číslo)
;  * Definuj si proměnnou s řetězcem
;  * Nastav ukazatel na řetězec do ESI
;  * Zašifruj řetězec symbol po symbolu (můžeš přepsat originál)
;  * Využí nějaký způsob cyklu na průchod symboly
 
%include "rw32.inc"
 
section .data
    key db 240
    st  db "ILoveISU",0
    n   db 8
 
section .text
main:
    xor eax, eax
    ; your code
 
    ret

cv5_6.asm

cv5_6.asm
; Úkol 6
; 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ů

isu/cv05.txt · Last modified: 2025/03/13 10:43 by sakin