TrabalhosGratuitos.com - Trabalhos, Monografias, Artigos, Exames, Resumos de livros, Dissertações
Pesquisar

Relatório N-ésimo fibonacci em Assembly com Código

Por:   •  4/5/2023  •  Relatório de pesquisa  •  2.297 Palavras (10 Páginas)  •  73 Visualizações

Página 1 de 10

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

...

Baixar como (para membros premium)  txt (9.6 Kb)   pdf (83.1 Kb)   docx (13.7 Kb)  
Continuar por mais 9 páginas »
Disponível apenas no TrabalhosGratuitos.com