Академический Документы
Профессиональный Документы
Культура Документы
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
REFERÊNCIAS
VIII. REQUISITOS