%include "rw32-2018.inc"
; Autor: Ing. Marta Jaros

section .data
    string1 db "ahoj, ja jsem tvuj bozacky testovaci retezec!", 0

section .bss  
    string2 resb 50
    
section .text
_main:
    push ebp
    mov ebp, esp
    
    xor eax, eax
    
    mov esi, string1 ; adresa string1 predavana funkci ReverseCopy pres registr ESI
    call ReverseCopy
    mov esi, string2
    call WriteString
    call WriteNewLine

    pop ebp
    ret

CountLength:
; Implementujete proceduru EAX CountLength(ESI), ktera na vstupu ocekava ukazatel na retezec 
; ukonceny nulou. Tento ukazatel ji predejete pomoci registru ESI. Funkce vraci vysledek v EAX. 
; Procedura vypocte delku retezce (ukazatel na nej je predany pres ESI) - ukoncovaci nula se nepocita
; do delky retezce. 
; Pouzijte vhodnou retezovou instrukci a instrukci rep.
; Provedte zalohu a obnovu registru, ktere pouzivate (az na eax - proc?) pomoci push a pop.
    
    ; ZDE DOPLNTE SVUJ KOD
    push ebp
    mov ebp, esp
    push edi
    push ecx
    
    mov edi, esi
    xor ecx, ecx
    not ecx
    xor al, al
    cld
    repne scasb
    not ecx
    lea eax, [ecx-1]
    
    pop ecx
    pop edi
    pop ebp
    ret

ReverseCopy:
; Implementujte proceduru void ReverseCopy(ESI);
; Procedura modifikuje promennou string2 v pameti, do ktere zapisuje prevraceny retezec.
; Vyuzijte instrukci LODS? a STOS?
; Pro vypocet adresy, kterou budou pouzivat tyto instrukce pouzijte instrukce LEA.
; Procedura pracuje podle nasledujiciho pseudokodu:
; i = 0
; eax = CountLength()
; for (ecx = eax; ecx > 0; ecx--)
; {
;    char a = string1[ecx-1]; // vynechavame nulu na konci retezce
;    string2[i] = a;
;    i++;
; }
; Napoveda: Diky retezovym instrukcim se nemusime zabyvat indexy, pouze musite mit nejaky counter,
;           diky kteremu vite, zda zpracovavat dalsi znak nebo jiz muzete skoncit
;           Pomoci vhodnych instrukci mente DF.
  
    ; ZDE DOPLNTE SVUJ KOD
    push ebp
    mov ebp, esp
    
    xor ecx, ecx
    call CountLength
    mov ecx, eax
    mov edi, string2
    lea esi, [esi + ecx - 1]
for:
    std
    lodsb
    cld
    stosb
    dec ecx
    cmp ecx, 0
    jne for
    
    pop ebp
    ret