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
a year ago
9.0 kB
11
Indexable
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
retEditor is loading...
Leave a Comment