Relatório N-ésimo fibonacci em Assembly com Código
Por: Igor Kaiser Gris • 4/5/2023 • Relatório de pesquisa • 2.297 Palavras (10 Páginas) • 95 Visualizações
INSTITUICAO
Nome extenso da instituição
Campus
Colegiado
Curso de Ciência da Computação
Graduação
Relatório para avaliação de Linguagens de Montagem
Criação de um código iterativo que calcule o n-éssimo número fibonacci
Nome
R.A.: nº de registro
Introdução:
O relatório compreende alguns passos e decisões tomadas para a criação de um código interativo em linguagem Assembly que tem por objetivo calcular o n-éssimo número Fibonacci que foi solicitado pelo usuário dentro do console, e gravar o número resultado em um arquivo binário com 64 bits de precisão não sinalizada, caso o usuário digite um valor.
Para o desenvolvimento foi utilizado o editor de notas Notepad++ para Windows e a compilação e execução foi realizada através do terminal do Windows utilizando a plataforma de WSL 2 com Debian. Os procedimentos para a compilação e execução do código seguiram as diretrizes estabelecidas no documento que descrevia a atividade avaliativa, com “nasm -f elf64 Fib_Nome.asm” e “ld Fib_Nome.o -o Fib_Nome.x” para montar e gdb “Fib_Nome.x” para executar através do Debugger ou “. /Fib_Nome.x” para executar diretamente no terminal.
Desenvolvimento:
De início, ainda no desenvolvimento da ideia, foram criados todos os nomes de funções que seriam desenvolvidas, no intuito de criar uma linha de raciocínio a seguir. A partir daí, foram desenvolvidas cada função uma a uma, sempre testando seu funcionamento através do debugger GDB. Com o desenvolver da atividade, foram notadas a necessidade de outras novas funções para o desenvolvimento e até mesmo a desnecessidade de uma delas.
Funções:
Ao iniciar o programa, dentro da função “_start” e “ScanString” foram utilizadas duas chamadas de sistema para escrever na tela, ler até 3 caracteres digitados no teclado. Ainda dentro destas funções, foi realizada a verificação da quantidade de caracteres que foram lidos, através da presença ou não da quebra de linha, se ela sucedesse no segundo caractere lido ou terceiro, é pulado para a função que transformará a cadeia de caracteres em números decimais, caso contrário, é chamada a função para gerenciar os erros decorrentes de cache do teclado.
A função “HandleScanErrors”, é a estrutura que lê um caractere por vez vindo do teclado até que seja encontrado o “Enter”. Essa função é chamada apenas quando são lidos mais que dois caracteres, e assim que ela o encontra, encaminha para a função “FailPrint” que usa uma chamada de sistema para escrever uma mensagem de erro na tela e é seguida pela função que encerra o programa.
Em caso de sucesso na leitura de um ou dois caracteres, dentro da função “ScanString”, é chamada a Função “ConvertOnetoInt” ou “ConverttoInt”, para converter respectivamente 1 ou 2 caracteres para sua representação inteira, na primeira, apenas através da tabela ASCII, fazendo um “xor” com 30 em representação hexadecimal, sobrando assim, apenas a representação do número lido. Para a segunda, é utilizada para a mesma técnica para ambos os caracteres, porém dentro de uma função chamada de “Multiply”, a parte alta do número lido é somado 10 vezes à parte baixa para gerar a correta representação.
Após estes passos, é realizado o cálculo do número Fibonacci, para os números 0 e 1 lidos, através de comparação é dada a resposta, caso contrário, são inicializados registradores de 64 bits com valores iniciais, e através de estruturas de repetição e comparação a resposta é gerada. Caso haja overflow após alguma das somas que são feitas sucessivamente, a execução encerra com mensagem de erro.
Com o resultado obtido, seja ele por comparação ou através das operações algébricas, entra-se na função que monta o nome do arquivo de saída (“FileNameCreate”). Na mesma, são movidos os 4 caracteres iniciais (“fib”), definidos por outra variável e após estes os caracteres numéricos lidos do teclado no início do programa.
A formação do nome segue o mesmo padrão, diferindo apenas no deslocamento para quando o usuário digitou um número com um ou dois caracteres, assim, nas funções “OneChar” e “TwoChar” é inserido o caractere “)” manualmente, através do seu valor em ASCII, após a quinta ou sexta posição, seguidos pela extensão “.bin” armazenados em outra variável. Fez-se necessária a inserção manual de um dos caracteres finais, pois cada dígito ocupa 2 bytes para a representação, e assim mais que 4 dígitos estouram o poder de representação dos registradores de 64 bits.
Após o desenvolvimento do nome do arquivo a ser criado, faz-se uma chamada de sistema para abrir o arquivo ou cria-lo caso ele não exista, através das flags 102 em octal para permissões do arquivo e 644, para permissões de usuário. Com o arquivo criado, é inserido o resultado dentro dele, ocupando 8 bytes de representação e fechado o arquivo, para então finalizar o programa.
Código do arquivo Fib_Nome.asm:
section .data
ErrorMsg: db "Entrada Inválida!", 10, "Execução encerrada!", 10, 0
ErrorMsgl: equ $-ErrorMsg
RequestText: db "Fibonacci requerido (até XX): ", 0
RequestTextl: equ $-RequestText
FileName: db "fib(", 0
FileNameEnd: db ".bin", 0
section .bss
FilePointer: resd 1
ReadStr: resb 3
ErrorRead: resb 1
Result: resq 1
NewFileName: resb 12
section .text
global _start
_start:
mov rax, 1 ; escrita em terminal
mov rdi, 1
mov rsi, RequestText
mov rdx, RequestTextl
syscall
ScanString:
mov rax, 0 ; leitura do terminal
...