Você está na página 1de 3

Calculadora Basica feita em Assembly utilizando

NASM
Gabriel Gomes Camata e Lucas Carrafa Santos
Universidade Federal do Espirito Santo, BR-101, São Mateus - ES

Abstract In this article we will put in practice some of the Eles são registradores de 32 bits, e podem ser divididos
concepts learned in computer architecture, especially the assembly em registradores menores (de 16 bits): AX, BX, CX e DX,
language part, to develop a basic calculaltor, ablle to doing the que por sua vez podem ser divididos em registradores
operations of addition, subtraction, multiplication and divisio.The menores (de 8 bits): AH, AL, BH, BL, CH, CL e DH, DL.
calculator will be made in float so we will use the Float Point Unit
(FPU) because it allows us to work in a much simpler way with
this type of data and with your operations. IV. REGISTRADORES APONTADORES

Keywords  Assembly, Float Point Unit, FPU, Calculator, Os registradores apontadores, ou de deslocamento, ou de
NASM, Registers. índice, indicam um determinado deslocamento baseado no
seu registrador de segmento correspondente. Para o
I. INTRODUÇÃO desenvolvimento da calculadora utilizamos somente o
registrado ESP.
USAremos a linguagem de montagem (Assebly) para TABELA II
desenvolver uma calculadora basica, pois é uma linguagem REGISTRADORES APONTADORES
que nos permite chegar o mais próximo da linguagem de
maquina, por este fato todos os programas feitos em Registrador Nome Descrição
assembly é compilado de forma mais rapida, além disso, já Source Esse registrador é utilizado como fonte em
trabalhamos manuseando espaço na memoria e utilizamos ESI Index manipulação de string.
registradores.
Destination Esse registrador é utilizado como destino em
EDI Index manipulação de string.
II. REGISTRADORES
EBP Base Pointer Esse registrador aponta para a base da pilha.
Registradores são como que variáveis localizadas no ESP Stack Esse registrador aponta para o topo da pilha.
processador. Existem vários tipos de registradores, cada um Pointer
O Apontador de Instrução possui o valor de
com uma função específica e cada grupo com sua finalidade.
EIP Instruction deslocamento da próxima instrução. Ele é de
Para o desenvolvimento da calculadora utilizamos os Pointer uso interno do processador, por isso seu valor
Registradores de Uso Geral e Registradores Apontadores, não pode ser alterado, apenas lido.
utilizamos também a FPU.
Na tabela acima foram apresentados as versões de 32 bits,
existem também versões de 16 bits que são: SI, DI, BP, SP e
III. REGISTRADORES DE USO GERAL IP.

Esse grupo de registradores recebe esse nome por serem V. UNIDADE DE PONTO FLUTUANTE (FPU)
utilizados para quase tudo: manipulação de dados, cálculos,
contagem, armazenamento, ponteiros. Unidade do Processador dedicada a fazer operaões de ponto
flutuante. Abaixo apresentaremos uma tabela com as
TABELA I instruções da FPU utilizadas.
REGISTRADORES DE USO GERAL
TABELA III
Registrador Nome Descrição
Utilizado em operações aritméticas, acesso de Instrução Nome Descrição
EAX Acumulador portas de entrada e saída, transferência de FLD load floating-point Carrega um valor de float na FPU
dados, entre outros. value
Utilizado como ponteiro para acessar a FMUL multiply floating- Carrega o valor da multiplicação de dois
EBX Base memória, índice, e auxiliar de operações point float na FPU
aritméticas efetuadas por EAX. FSTP store floating- Carrega um valor de float e da um pop
ECX Contador Sua principal finalidade é servir de contador point value and na FPU
em laços de repetição pop
Usado em operações aritméticas juntamente FDIV divide floating- Carrega o valor de uma divisão entre
EDX Dados com EAX (EDX recebe o resto da divisão e o point dois float na FPU
produto da multiplicação), acesso de portas de FADD add floating-point Carrega o Valor de uma adição entre
entrada e saída, entre outros. dois float na FPU
FSUB subtract floating- Carrega o valor de uma subtração entre Para comparar o operador e manda-lo para o label que faz
point dois float na FPU a operação desejada pelo usuario.
mov eax , dword [operador]
VI. INSTRUÇÕES UTILIZADAS cmp eax , 2Bh
TABELA IV je soma
cmp eax , 2Dh
Instruções Nome Descrição je subi
cmp Compare Subtrai a fonte do destino, atualiza as flags
porém não armazena o resultado.
cmp eax , 2Fh
je Jump if equal Salte se iguall je divi
jmp Jump Salto incondicional cmp eax , 2Ah
add Add Adiciona a fonte do destino e o resultado é je multi
armazenado no destino.
mov move Copia um byte ou word do operando fonte Movemos o operador para o eax e comparamos o caractere
para o operando destino.
Transfere o word do topo da pilha para o
com os equivalentes da tabelas ASCII e utilizamos a função
pop POP destino e incrementa SP em dois para instrução je para fazermos um desvio incondicional para o
apontar para o novo topo da pilha label que faz a operação desejada pelo o usuário.
Decrementa SP pelo tamanho do operando
push PUSH (dois ou quatro, valores byte são estendidos Para fazer a operação de adição:
por sinal) e transfere um word da fonte para
o topo da pilha
Realiza uma operação lógica OR fld dword [numero1]
xor Or Exclusive EXCLUSIVE bit a bit nos seus operandos e fld dword [numero2]
põe o resultado no destino. fadd
fstp dword [numero1]
jmp printar
VII. FLUXOGRAMA E EXPLICAÇÃO DAS OPERAÇÕES
Carregamos os numeros digitados pelo usuario na FPU e
Para fazer a entrada de dados usamos as funções da utilizamos a instrução fadd que faz a soma dos dois numeros
linguagem C scanf que lê o número e operador que o usuário que estão no topo da pilha e após isso damos um carregamos
entra, e utilizamos a função printf para mandar uma o valor na FPU e damos um pop, depois disso pulamos para o
mensagem para o usuário quando ocorre algum erro ou para label que mostrara na tela o resultado da operação para o
instruir o tipo de dado que ele deve entrar. Um exemplo do usuário.
que falamos acima pode ser visto no trecho de código abaixo: As operações de multiplicação e subtração são feitas de
maneira similar a operação de adição mudando somente a
push mensagem1 instrunção fadd para fmul e fsub. Já para a divisão de
call printf numeros reais é necessario verificar se o divisor é zero, póis
add esp , 4 essa divisão foge da capacidade da calculadora desenvolvida
para este trabalho.
push numero1
push scan_format Para fazer a operação de divisão:
call scanf
add esp , 8 mov eax, dword[numero2]
cmp eax, 0
Um problema que percebemos é a necessidade de emular a je erro
função fflush da linguagem C, pois estava armazenando fld dword [numero1]
caractere vazio no lugar do operando. Como pode ser visto fld dword [numero2]
no trecho abaixo: fdiv
fstp dword [numero1]
;LER O \n jmp printar
push operador
push scan_char_format Verificamos se o segundo número digitado pelo usuario, istó
call scanf é o quociente, é igual a zero. Caso seja igual a zero emitimos
add esp , 8 uma mensagem de erro e abortamos o programa, caso
contrario carregamos os numeros para a FPU evetuamos a
;LER O OPERADOR divisão e logo após damos um pop na pilha de float e
push operador fazemos um desvio condicional para o label que é
push scan_char_format responsavel por mostrar na tela o resultado da operação para
call scanf o usuario.
add esp , 8 Algo que percebemos ao desenvolver o codigo, é que, quando
iriamos carregar o valor da operação que estaba na FPU para
a variavel de resultado (numero1) era necessario fazer uma uma divisão por zero; se o usuário tentar fazer uma operação
conversão da palavra que estava em double para float, para diferente das operações previstas anteriormente.
somente depois printar para o usuário o resultado final da A entrada e saída de dados é feita através de chamadas das
operação. funções printf e scanf da linguagem C. O resultado de uma
operação passa a ser o primeiro operando da operação
mov ebx , dword [numero1] seguinte.
fld dword [numero1]
fstp qword [numero1] X. COMO COMPILAR O PROGRAMA

push dword [numero1+4] Para compilar o programa, como dito anteriormente, é


push dword [numero1] necessario estar utilizando o sistema operacional Linux, ter
push dword printf_format instalado o gcc, ter instalado o Multilib (emular uma maquina
call printf 32 bits). Dito isso basta digitar as linhas abaixo no terminal:
add esp , 12
nasm -f elf -l calcFinal.lst calcFinal.asm
Para ver o funcionamento do programa criamos um gcc calcFinal.o -m32
fluxograma abaixo: ./a.out

REFERÊNCIAS

[1] Assembly: Tudo sobre linguagem Assembly. Disponível em:


<http://assemblytutorial.wikidot.com/registers>. Acesso em: 05 dez.
2017.
[2] Oracle. Floating-Point Instructions. Disponível em:
<https://docs.oracle.com/cd/E18752_01/html/817-5477/eoizy.html>.
Acesso em: 05 dez. 2017.
[3] L. M. RICARTE, Ivan . Instruções assembly. Disponível em:
<http://www.dca.fee.unicamp.br/cursos/EA876/apostila/HTML/node109.h
tml>. Acesso em: 05 dez. 2017.
[4] William Stallings. “Arquitetura e organização de computadores: projeto
para o desempenho”. Editora Prentice Hall, 2003, 786p.

VIII. REQUISITOS

Para compilar a calculadora é necessario a utilização de


uma arquitetura de 32 bits ou emular no próprio gcc a
arquitetura de 32 bits , para isso basta instalar o Multilib,e se
faz necessario o sistema operacional Linux pois o programa
foi desenvolvido nele. Além disso, é necessario instalar o
NASM.

IX. FUNCIONAMENTO E CAPACIDADE

A calculadora é capaz de fazer calculos de adição,


subtração, multiplicação e divisão de números reais. O
programa irá abortar nos casos de: se o usuário tentar fazer

Você também pode gostar