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_1.asm jedno z mnoha řešení

cv5_1.asm jedno z mnoha řešení

cv5_1.asm
%include "rw32.inc"
 
section .text
main:
    mov eax, 0
    mov al, 0xAA
    ; Převeď 0xAA -> 0xAC jen pomocí NOT a NEG
    ; Zapni si v debbugeru náhled HEX a BIN formátu ;)
    not al    ; invertování bitů
    neg al    ; invertování + 1 (protože doplňkový kód)
    nop       ; instrukce NOT + NEG => INC
    not al
    neg al
    call WriteHex16NewLine
    ret


cv5_A.asm ukázka

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

cv5_2.asm

cv5_2.asm
; Ú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

cv5_2.asm jedno z mnoha řešení

cv5_2.asm jedno z mnoha řešení

cv5_2.asm
; Ú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
    key db 240
 
section .text
main:
    xor eax, eax
 
    call ReadUInt8NewLine
    xor eax, [key]
    call WriteUInt8NewLine
    xor eax, [key]
    call WriteUInt8NewLine
 
    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) 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š

cv5_3.asm jedno z mnoha řešení

cv5_3.asm jedno z mnoha řešení

cv5_3.asm
%include "rw32.inc"
; Využíj instrukce posuvu pro násobení a dělení
 
section .data
    ; 0) Definuj 16b pole 'res' se třemi prvky (všechny hodnoty nuly)
    res  dw  0,0,0
 
section .text
main:
 
    ; 1) Nahraj do 16b registru konstantu 100
    mov ax, word 100
    ; 2) Číslo vyděl 2 pomocí logické instrukce posuvu (100/2)
    shr ax, 1      ; 2=2^1
    ; 3) Výsledek ulož do res[0]
    mov [res + 0], ax
 
    ; 4) Získané číslo vynásob 8 pomocí logické instrukce
    ; vynasobeni 8 (=2^3) pomoci posuvu
    shl ax, 3
    ; 5) Výsledek ulož do res[1]
    mov [res + 2], ax
 
    ; 6) Ziskané číslo zneguj a vyděl číslem 4 - pozor na zachovaní znaménka!
    neg ax
    sar ax, 2          ; zachova znamenko
    ; 7) Výsledek ulož do res[2]
    mov [res + 4], ax
 
    ; 8) Všechny čísla z res sečti a výsledek vypiš do terminálu
    mov ax, [res + 0]
    add ax, [res + 2]
    add ax, [res + 4]
    call WriteInt16NewLine ; = 350
 
    ; x) Výsledek vynásob číslem 1234 (MUL) a znova vypiš
    mov bx, 1234
    mul bx      ; vysledek v DX:AX
    rol eax, 16  ; nebo shl
    mov ax, dx
    rol eax, 16
    call WriteInt32NewLine ; = 431900
 
    ret

cv5_C.asm ukázka

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

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|    ; 0xDDBBAACC
 
    ret

cv5_4.asm jedno z mnoha řešení

cv5_4.asm jedno z mnoha řešení

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|
    rol eax,16  ; |a2|a3|a0|a1|  ; CCDDAABB
    ror ax,8    ; |a2|a3|a1|a0|  ; CCDDBBAA
    rol eax,8   ; |a3|a1|a0|a2|  ; DDBBAACC
    nop
    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

  • Podmínky a skokové instrukce budeme řádně probírat na 8. cvičení
cv5_5.asm
; 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: 2024/03/16 15:56 by sakin