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.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