;nasm -f elf64 exercicioStr.asm 
;gcc -no-pie exercicioStr.o  -o exercicioStr

%include "mymacros.inc"
extern printf

;CRIAR EM mymacros.inc a macro _len, para ler o tamanho de uma string
  
    
 
;LOCALIZAR O PRIMEIRO 'e'

section .data
    str1 db "A festa da engenharia é sensacional",0 ;tamanho 36
    str2 times 50 db 0        ;str2 = strComeco+strSub+strFim
    strSearch db "engenharia",0
    strSub db "Ciência da Computação",0
    tStr1 dq 0
    tStr2 dq 0
    msgTam db "Tamanho da string: %d",10,0
    msgPos db "Posicao:",0
    pos    dq 0
    char   db 0  ;caractere de busca
    tSearch dq 0
    tComeco dq 0 ; tamanho do 
    
    
section .text
global main
main:
    push rbp
    ;verificando o tamanho de str1
    PRINT "Inicio dos testes"
    _len str1
    mov qword [tStr1], rcx
    ;imprime o tamanho
    mov rdi, msgTam
    mov rsi, qword [tStr1]
    mov rax,0
    call printf
buscaChar:
    mov rax,0
    mov rdi,str1 ; string onde ira buscar
    ;caractere a ser encontrado
    mov al, byte [strSearch]; poderia ser mov al,'e'    
    mov rcx,qword [tStr1]
    cld
    repne scasb
    jne naoAchou
    dec rdi ;endereço de memória do caractere encontrado
    mov qword [pos],rdi
   
tamStrSearch:
    _len strSearch 
     mov qword [tSearch],rcx ;tamanho de engenharia   
verificaSubstr:
     ;mov rsi,rdi ; endereco da str1 a partir de 'e'
     mov rsi,str1
     mov rdi,strSearch ; verificar se strSearch é igual     
     cld
     rep cmpsb
     jne naoAchou    
     PRINT "Strings iguais"

;o endereço do 'e' de 'engenharia' esta no endereço pos, 
;repare que é endereço de memória. O deslocamento seria pos-str1, 
;

;OBSERVANDO AS STRINGS
;Vamos chamar de tComeco o tamanho de "A festa da "
;tComeco = pos - str1
;tSearch: tamanho de "engenharia"
;tSub: tamanho de "Ciência da Computação"
;REPARE que o endereço de str2 é diferente de str1
;
;                   pos        pos+tSearch  
;                    |            |
;                    v            v
;str1 "A festa da "+"Engenharia"+" é sensacional"
;str2 "A festa da "+"Ciência da Computação"+ " é sensacional"
;                    ^                        ^
;                    |                        |  
;               str2+tComeco              str2+tComeco+tSub  
;x/s &str1
;display
;print 
;


;1)Copiar str1 em str2 até pos
  
  mov rsi, str1   ;rsi pega endereço de str1
  mov rdi, str2
  ;calculando tComeco
  mov rcx, qword [pos]
  sub rcx,rsi ; tamanho de "A festa da ", pos-str1
  mov qword [tComeco],rcx   ;guarda o tamanho copiado
  cld
  rep movsb  
  ;str2 = "A festa da "
  ;2)Copiar Ciência da Computação em str2 a partir de pos
  _len strSub          
  mov qword [tSub],rcx ;tamanho de "Ciência da Computação"
  
  mov rsi, strSub
  mov rbx, qword [tComeco]
  lea rdi, [str2+rbx]     ;na posicao inicial de str2 + tamanho de "A festa da "
  mov rcx, qword [tSub]   ;copia "Ciência da Computação"
  cld
  rep movsb
  ;str2 = "A festa da "+"Ciência da Computação"
  
; copiar em str2 a str1 a partir da posicao pos+tSearch
; temos que copiar " é sensacional"
; Assim, pos+tSearch - str1 é o tamanho de "A festa da Engenharia"
; 



  mov rbx,qword [pos]
  add rbx,qword [tSearch]; pos+tSearch
  lea rsi, [str1+rbx] ;pega a posiçao do inicio de " é sensacional"
  mov rbx,qword [tComeco]
  add rbx,qword [tSub]   ;tComeco+tSub 
  lea rdi, [str2+rbx]    ;str2+tComeco+tSub, posicao onde será copiado "é sensacional"
  ;tamanho até "A festa da " é tComeco, de "Engenharia" é tSearch
  ;tamanho de  "A festa da engenharia" é tComeco+tSearch
  ;tamanho de "A festa da engenharia é sensacional" é tStr1
  ;Assim o tamanho de " é sensacional" é tStr1-(tComeco+tSearch)=Str1-tComeco-tSearch
  mov rbx,qword [tStr1]
  sub rbx,qword [tComeco]
  sub rbx,qword [tSearch]
  mov rcx,rbx   ;tamanho de " é sensacional"
  cld
  rep movsb
    
        
naoAchou: 
    PRINT "Caractere ou string não encontradas"    
    pop rbp
    _exit 0
 