%include "rw32-2015.inc" section .data ; delka vstupu delka dd 16 ; vstupni data data dw 0x9c01,0xfd25,0xc121,0xaaa0,0x9f2F,0x6acc,0x6955,0x2175,0x2d1a,0xc9fb,0x6b25,0x2e3c,0xd429,0xc2f7,0x7fc6,0x0000 ; retezce pro vypis r_vysl db "Kontrolni soucet: ",0 r_ok db "Kontrola probehla v poradku.",13,10,0 r_chyba db "Pri kontrole doslo k chybe!",13,10,0 section .text main: ; cast 1: spoctete kontrolni soucet dat a ulozte jej na posledni pozici ; ; algoritmus: jednickovy doplnek souctu cisel v jednickovem doplnku ; v pripade, ze je vysledek 0, nahradi se -0 (0xFFFF) ; ; potrebne instrukce: mov, adc, not,... ; mozne pristupy k problemu: ; a) kombinace add, adc: ; add r16,[adresa] ; adc r16,0 ; b) ciste adc r16,[adresa] ale (!) pozor na ; * inicializaci CF (clc) ; * logika smycky nesmi ovlivnit CF (loop, lea) ; * po ukonceni smycky nezapomenout na posledni CF (adc r16,0) ; c) akumulovat do r32: ; movzx r32,[adresa] ; add r32,r32 ; ; po ukonceni smycky 2x secist vrchnich 16 bitu do spodnich 16 bitu pouziteho registru ; zde doplnte vas kod (smycka, [delka] - 1 opakovani, soucet v jednickovem doplnku podle navodu vyse) ; vysledek akumulujte a ponechte v ax ; osetreni nuly, v pripade, ze je vysledek 0xFFFF tak jej nebudeme negovat (dostali bychom 0) cmp ax,0xFFFF je hotovo ; zde doplnte vas kod (finalni jednickovy doplnek) ; idea: jestlize je soucet vsech polozek x a kontrolni soucet bude -x, pri kontrole secteme vsechno a dostaneme 0 ; vysledek prosim ponechte v ax hotovo: ; zapis vysledku na posledni pozici mov ecx,[delka] dec ecx mov [esi+ecx*2],ax ; vypis vysledku pro kontrolu mov esi,r_vysl call WriteString call WriteHex16 call WriteNewLine ; cast 2: skontrolujte, jestlize kontrolni soucet sedi ; ; algoritmus: soucet cisel v jednickovem doplnku vcetne kontrolneho souctu ; vysledek by mel byt 0 ; zde doplnte vas kod (smycka, [delka] opakovani, soucet v jednickovem doplnku podle navodu vyse) ; doporucujeme zkusit vyuzit jiny z nabizenych postupu ; vysledek akumulujte a ponechte v ax ; testovani vysledku na 0 nebo -0, vypis a ukonceni test ax,ax jz vysl_ok cmp ax,0xFFFF jz vysl_ok ; vysledek neni 0 (doslo k chybe) mov esi,r_chyba call WriteString mov eax,1 ret vysl_ok: ; vysledek je 0 (-0), vysledek je v poradku mov esi,r_ok call WriteString mov eax,0 ret