Trabalho N1

Código feito em assembly x86 - NASM. Pede duas senhas se forem iguais mostra que são iguais e faz um hash bem básico se forem diferentes mostra que são diferentes.
mail@pastecode.io avatar
unknown
assembly_x86
8 days ago
9.0 kB
2
Indexable
Never
section .data
    ; Seção de dados, mensagens e constantes são armazenadas aqui.
    ; Mensagem pra solicitar a senha na primeira vez
	msg1 db 'Digite a senha: ', 0 
	; Tamanho da msg1
    tam_msg1 equ $- msg1 
	; Mensagem pra solicitar a senha pela segunda vez
    msg2 db 'Digite a senha novamente: ', 0 
	; Tamanho da msg2
    tam_msg2 equ $- msg2 
	; Mensagem que indica sucesso na alteração de senha
    msg_sucesso db 'Senha alterada com sucesso.', 0 
	; Tamanho da msg de sucesso
    tam_msgsucesso equ $- msg_sucesso 
	; Mensagem que indica que as senhas são diferentes
    msg_diferente db 'As senhas são diferentes.', 0 
	; Tamanho da msg de senhas diferentes
    tam_msgdiferente equ $- msg_diferente 
	; Mensagem pra mostrar o hash da nova senha alterada
    msg_novasenha db 'Senha com hash: ',0 
	; Tamanho da mensagem do hash da nova senha
    tam_msgnovasenha equ $- msg_novasenha 
	; Caractere de nova linha \n ou 0xA ou 10
    car_nova_linha db 10, 0 
	; Tamanho máximo permitido pra senha
    TAM_SENHA_MAX equ 50 

section .bss
    ; Seção pra armazenar variaveis não inicializadas
	; Espaço pra armazenar a primeira senha no tamanho 50(TAM_SENHA_MAX)
    senha1 resb TAM_SENHA_MAX 
	; Espaço pra armazenar a segunda senha no tamanho 50(TAM_SENHA_MAX)
    senha2 resb TAM_SENHA_MAX 
	; Espaço pra armazenar a senha hash no tamanho 50(TAM_SENHA_MAX)
    senha_hash resb TAM_SENHA_MAX 
	; Espaço pra armazenar o tamanho da primeira senha
    tam_senha1 resb 1 
    tam_senha2 resb 1 

section .text
	; Declara a entrada principal do programa
    global _start 

_start:
    ; Mostra a primeira mensagem através da chamada pra função de imprimir mensagem
	; Coloca o endereço de msg1 no registrador ecx
    mov ecx, msg1 
	; Coloca em edx o tamanho da msg1
    mov edx, tam_msg1 
	; Chama a função imprimir_msg para mostrar a mensagem armazenada em ecx
    call imprimir_msg 

    ; Lê a primeira senha do teclado através da chamada pra função de ler mensagem
	; Move o endereço da variavel senha1 pra ecx
    mov ecx, senha1 
	; Move o tamanho max da senha1 pra edx
    mov edx, TAM_SENHA_MAX 
	; Chama a função de ler_entrada
    call ler_entrada 

	; Armazena o tamanho da senha1 em tam_senha1
    mov [tam_senha1] , al 

    ; Mostra a segunda mensagem através da chamada pra função de imprimir mensagem
	; Coloca o endereço de msg2 no registrador ecx
    mov ecx, msg2 
	; Coloca em edx o tamanho da msg2
    mov edx, tam_msg2 
	; Chama da função imprimir_msg pra mostrar a mensagem armazenada em ecx
    call imprimir_msg 

    ; Lê segunda senha do teclado através da chamada pra função de ler mensagem
	; Coloca o endereço da senha2 no registrador ecx
    mov ecx, senha2 
	; Move o tamanho max da senha2 pra edx
    mov edx, TAM_SENHA_MAX 
	; Chama a função ler_entrada
    call ler_entrada 

	; Armazena o tamanho da senha2 em tam_senha2
    mov [tam_senha2], al 

    ; Verifica se as senhas são iguais, comparando elas
	; Chama a função de comparar as senhas
    call comparar_senhas 
	; Testa o resultado retornado por comparar_senhas
    test eax, eax
	; Se não forem iguais (eax != 0), pula pra senhas_diferentes
    jnz senhas_diferentes 

    ; Cria o hash da senha caso elas sejam iguais
	; Coloca o endereço da senha1 no registrador esi
    mov esi, senha1 
	; Coloca o endereço da senha_hash(onde será armazenado a senha com hash) no registrador edi
    mov edi, senha_hash 
	; Chama a função de fazer o hash da senha
    call hash_senha 

    ; Mostra a mensagem de sucesso na alteração das senhas
	; Coloca o endereço de msg_sucesso no registrador ecx
    mov ecx, msg_sucesso 
	; Coloca o tamanho da msg_sucesso no registrador edx
    mov edx, tam_msgsucesso 
	; Chama a função de imprimir_msg que mostrará a mensagem em ecx
    call imprimir_msg 
    
	; Chama a função de imprimir uma nova linha "\n" pra melhor estilização
    call imprimir_nova_linha 
    
    ; Mostra a mensagem de hash da senha
	; Coloca o endereço da msg_novasenha em ecx
    mov ecx, msg_novasenha 
	; Coloca o tamanho da msg_novasenha em edx
    mov edx, tam_msgnovasenha 
	; Chama a função de imprimir_msg que mostrará a mensagem em ecx
    call imprimir_msg 

    ; Mostra a senha nova armazenada já com o hash
	; Coloca o endereço da senha nova com hash no registrador ecx
    mov ecx, senha_hash 
	; Coloca o tamanho da senha1 pois será o mesmo tamanho da senha hash em edx
    mov edx, [tam_senha1] 
	; Chama a função de imprimir_msg pra mostrar a senha hash que está em ecx
    call imprimir_msg 
	
	; Chama a função de imprimir uma nova linha
    call imprimir_nova_linha 
	
	; Faz um jump (salto) pro final do programa
    jmp fim 

; Rótulo para mostrar mensagem de senhas diferentes
senhas_diferentes:
    mov eax, 4
    mov ebx, 1
    mov ecx, msg_diferente
    mov edx, tam_msgdiferente
    int 0x80
    
    call imprimir_nova_linha

; Rótulo para o fim do programa
fim:
    mov eax, 1
    mov ebx, 0
    int 0x80

; Função para imprimir as mensagens
imprimir_msg:
    ; Como o endereço da mensage já está em ecx e o tamanho da mensagem já está em edx
    ; basta colocar em eax e ebx as chamadas para o sistema no caso pra imprimir mensagens
    mov eax, 4
    mov ebx, 1
    int 0x80
    ret

; Função para leitura das senhas
ler_entrada:
    ; Como o endereço já está em ecx e o tamanho máximo já está em edx
    ; basta colocar em eax e ebx as chamadas para o sistema no caso para leitura
    mov eax, 3 
    mov ebx, 0
    int 0x80
    ret ; Retorna pra origem

; Função pra comparar as senhas, retorna 0 se iguais ou 1 se diferentes
comparar_senhas:
	; Coloca em al o tamanho da senha1
    mov al, [tam_senha1] 
	; Coloca em bl o tamanho da senha2
    mov bl, [tam_senha2] 
	; Compara al (tamanho da senha1) com bl (tamanho da senha2) 
    cmp al, bl 
	; Se forem diferentes pula pra diferente
    jne .diferente 
	; Armazena o endereço da senha1 em esi
    mov esi, senha1 
	; Armazena o endereço da senha2 em edi
    mov edi, senha2 
	; Coloca o tamanho da senha1(que está em eax) em ecx 
    mov ecx, eax 
.loop_comparacao:
    ; Loop de comparação das strings
	; Move o caractere que está em esi, para al
    mov al, [esi] 
	; Move o caractere que está em edi, para bl
    mov bl, [edi] 
	; Compara os dois caracteres
    cmp al, bl 
	; Se forem diferentes, pula pra diferente
    jne .diferente 
	; Incrementa o endereço de esi da primeira senha
    inc esi 
	; Incrementa o endereço de edi da segunda senha
    inc edi 
	; Decrementa o contador que tem o tamanho das strings
    dec ecx 
	; Se o contador não for 0 pula pro começo do loop
    jnz .loop_comparacao 
    ; Se o contador for 0 , são iguais e pula pra .igual
    jmp .igual
.diferente:
	; Se chegou até aqui quer dizer que são strings diferentes, armazenando 1 em eax
    mov eax, 1 
	; Retorna pra origem
    ret 
.igual:
	; As senhas são iguais então armazena 0 em eax
    mov eax, 0  
	; Retorna pra origem
    ret 

; Função pra fazer o hash da senha que será armazenada
hash_senha:
.loop:
    ; Loop pra fazer o hash da senha simples
    	; Obtem o próximo caractere
    movzx eax, byte [esi]
    	; Compara com \n   
    cmp al, 10
    	; Se sim pula pra ignore onde vai incrementar +1
    je .ignore
	; Testa o caractere pra verificar se não é \0 ou o terminador de string
    test al, al 
	; Se sim quer dizer que a string terminou então pula para terminou
    jz .terminou 
	; Verifica se o caractere é ímpar (bit menos significativo)
    test eax, 1
	; Se o bit menos significativo for 0, é par
    jz .par    
	; Se for ímpar, adiciona 1 no byte que é o caractere
    add eax, 1             
	; Pula para guarda_valor onde será armazenado o byte modificado na posição atual
    jmp .guarda_valor 
.par:
	; Se for par, adiciona 2 no byte que é o caractere e guarda o valor
    add eax, 2             
.guarda_valor:
	; Armazena o valor ajustado no hash 
    mov [edi], al      
	; Avança para o próximo byte no endereço do hash    
    inc edi        
	; Avança para o próximo byte no endereço da senha	
    inc esi               
	; Pula pro começo do loop
    jmp .loop
.ignore:
	; Avança para o próximo byte no endereço do hash    
    inc edi
	; Avança para o próximo byte no endereço da senha	
    inc esi
	; Pula pro começo do loop
    jmp .loop 		   
.terminou:
	; Termina a string do hash com terminador de string (\0)
    mov byte [edi], 0    
	; Retorna pra origem
    ret 

; Função pra imprimir uma nova linha (\n)
imprimir_nova_linha:
   mov eax, 4
   mov ebx, 1
   mov ecx, car_nova_linha
   mov edx, 1
   int 0x80
   ret
Leave a Comment