Sei sulla pagina 1di 13

UFRN UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE

CT CENTRO DE TECNOLOGIA
DEE DEPARTAMENTO DE ENGENHARIA ELTRICA
ARQUITETURA E PROGRAMAO DE MICROCOMPUTADORES








ANTONIO WALLACE ANTUNES SOARES







TUTORIAL PARA CALCULADORA IMPLEMENTADA COM
PROGRAMAO ASSEMBLY EM AMBIENTE WINDOWS
















NATAL-RN
DEZ/2010

SUMRIO


1. Introduo.................................................................................................................. 3
2. Assembly em Windows ............................................................................................. 3
3. Programao da calculadora...................................................................................... 4
4. Operaes implementadas ......................................................................................... 5
4.1 Adio ..................................................................................................................... 7
4.2 Subtrao ................................................................................................................ 8
4.3 Multiplicao .......................................................................................................... 8
4.4 Diviso .................................................................................................................... 9
4.5 Raiz quadrada ......................................................................................................... 9
4.6 Raiz cbica ............................................................................................................ 10
4.7 Fatorial .................................................................................................................. 10
4.8 Potenciao ........................................................................................................... 11
4.9 Arranjo Simples .................................................................................................... 12
5. Concluso ................................................................................................................ 13










1. Introduo

Este relatrio visa apresentar o desenvolvimento de uma calculadora que possui
as quatro funes elementares da matemtica e cinco operaes adicionais. Sendo essas
operaes adicionais, a raiz quadrada, a raiz cbica, fatorial, arranjo simples e
potenciao. Este projeto referente nota da terceira avaliao da disciplina de
Arquitetura e Programao de Microcomputadores, ministrada professor Jos Alberto
Nicolau de Oliveira. Programou-se a calculadora em questo em assembly, utilizando o
compilador Radasm e as API (Application Programming Interface) do Windows.
2. Assembly em Windows

Como dito anteriormente programou-se a calculadora no ambiente Windows.
Sabe-se que este sistema operacional orientado a eventos, onde o sistema executa suas
tarefas voltadas para cada evento, chamando os aplicativos que tratam desses eventos.
Para facilitar o tratamento desses eventos os aplicativos podem utilizar um conjunto de
componentes padres que podem ser includos em programas e aplicativos do usurio.
Este conjunto de componentes fornecido pela GUI (Graphical User Interface)
do Windows e pode ser acessado atravs de chamadas de APIs. As APIs do Windows
contm procedimentos ou funes que so chamadas atravs da passagem de
parmetros. As funes oferecidas pelas APIs do Windows podem ser divididas em
oito categorias, que so:

Funes para servio bsico;
Funes para servio avanado;
Funes para interface de dispositivos grficos;
Funes para interface de usurio;
Funes para biblioteca de caixa de dilogo comum;
Funes para bibliotecas de caixa de controle;
Funes para o Windows Shell;
Funes para servio de redes.

O Windows armazena as APIs em DLL (Dynamic-Link Library), sendo a
KERNEL32.DLL, GDI32.DLL E USER32.DLL as principais bibliotecas do sistema
operacional. A KERNEL32.DLL a biblioteca que trata as principais tarefas do
Windows. Oferecendo suporte para as funes de mais baixo nvel que aplicativo
necessita para ser executado. Entre as tarefas, encontram-se a gesto de memria, as
interrupes e as operaes de entrada/sada do sistema.

J a biblioteca USER32.DLL responsvel principalmente pelo tratamento da
interface com o usurio, como por exemplo, as janelas criadas pelos aplicativos.
GDI32.DLL a biblioteca responsvel pela interface do ambiente grfico, que cuida de
cores, vdeos, fontes e outros aspectos inerentemente grficos.
3. Programao da calculadora

Desenvolveu-se a calculadora em questo utilizando como base um template
oferecido pelo compilador RadAsm. O template pode ser includo da seguinte forma, ao
abrir o RadAsm criou-se um novo projeto, e logo aps fornecer o nome e local de o
projeto ser alocado, escolheu-se o template DialogApp.tpl no Assistente de Projeto
Modelo. Ao criar-se o projeto dois arquivos so gerados, um .asm e outro .inc, para
oferecendo uma base para a interface grfica com o usurio. O arquivo .asm pode ser
visto logo abaixo:
.386
.model flat, stdcall
option casemap

As trs primeiras linhas de cdigo so descritas pelas instrues acima, onde a
instruo .386 representa que o programa utilizar apenas as funes existentes do
processador 386. J a instruo .model flat, stdcall especifica os modelos a serem
usados, como por exemplo, o flat diz que todos os dados e o cdigo esto no nico
segmento de 4 Gbytes (Disponvel apenas para operaes em modo protegido). O
stdcall cria uma pilha com um tamanho padro.

include Calculadora.inc

A seguinte linha de comando inclui tudo que estiver em Calculadora.inc para o
arquivo Calculadora.asm. Isso permite que o programa fique mais organizado, onde no
arquivo .inc encontra-se, por exemplo, as incluses das bibliotecas, definies de
variveis, definies de procedimentos, dados e etc. Aps a incluso comea o
programa em si.

.code
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke InitCommonControls
invoke DialogBoxParam,hInstance,IDD_DIALOG1,NULL,addr DlgProc,NULL
invoke ExitProcess,0


O trecho de cdigo acima descrito responsvel por criar a caixa e fornecer
parmetros de controle da mesma. Esses parmetros podem ser visualizados no trecho
de cdigo seguinte, onde um procedimento criado para o tratamento da interface com
o usurio, ou seja, para tratar eventos impostos pelo usurio ao utilizar a janela grfica
criada.

DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM

mov eax,uMsg
.if eax==WM_INITDIALOG
(I)
.elseif eax==WM_COMMAND
(II)
.elseif eax==WM_CLOSE
(III)
invoke EndDialog,hWin,0
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
DlgProc endp
end start

As palavras grifadas em azul, WM_INITDIALOG, WM_COMMAND e
WM_CLOSE fornecem ao programador a possibilidade de editar caractersticas iniciais
da janela (no espao I), tratar os eventos gerados pelo usurio (no espao II) e tratar o
fechamento da janela grfica (no espao III), respectivamente. Sabendo disso, pode-se
afirmar que todas as funes matemticas implementadas foram escritas no espao (II),
pois o usurio ao executar a operao est criando um evento, logo o tratamento de
eventos realizado a partir do parmetro WM_COMMAND.
4. Operaes implementadas

Como dito anteriormente as funes implementadas foram as quatros operaes
bsicas da matemtica, adio, subtrao, multiplicao e diviso. Pediu-se tambm
para desenvolver algumas outras funes um pouco mais complexas. As funes extras
escolhidas foram raiz quadrada, raiz cbica, fatorial, potenciao e arranjo simples.
O RadAsm oferece ao usurio a possibilidade de editar a janela grfica atravs
da incluso de itens alocados na barra de ferramentas. possvel realizar tal tarefa
abrindo o arquivo Calculadora.dlg que gerado ao criar-se um novo projeto, nele
incluiu-se os cones para todas as operao matemticas, os textos escritos na interface
da calculadora, os locais onde so inseridos os valores numricos para a realizao da
operao e resultado da operao. Ao criar cada novo bloco incluso na janela da
calculadora preciso alterar o caption do mesmo e criar uma constante no arquivo .inc
com o nome escolhido pelo usurio, mas referenciando o ID do bloco. Como por
exemplo, a operao multiplicao, criou-se um cone referente a operao multiplicar,
como pode ser visto na figura abaixo, e declarou-se uma constate da seguinte forma no
arquivo .inc:

.const
MULTIPLICAR equ 1009


Figura 1. Editando cones da calculadora (arquivo Calculadora.dlg)






4.1 Adio

Para o programa reconhecer qual operao o usurio deseja realizar necessrio
conhece qual parmetro fornece essa informao. No arquivo base .asm, o procedimento
criado passa para o programador alguns parmetros, entre ele encontra-se o parmetros
que desejamos.
DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
Com ele sabe-se qual cone o usurio esta clicando, pois ao clicar o wParam
retorna o valor do ID do cone clicado. Com isso, basta fazer condies para cada cone
clicado. Pode-se exemplificar com o seguinte trecho do programa:
DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
mov eax,uMsg
mov edx,wParam

.if eax == WM_INITDIALOG
.elseif eax == WM_COMMAND

.if edx == SOMA
.elseif edx == SUBTRAIR
.elseif edx == MULTIPLICAR
.elseif edx == DIVISAO
.endif

Fazendo isso, pode-se tratar cada operao dentro de cada condio. Para obter
os valores dos nmeros digitados na janela da calculadora, deve-se utilizar a funo
GetDlgItemText da API DialogBox. Essa funo chamada atravs do uso do invoke,
a funo get usada da seguinte forma:
invoke GetDlgItemText,hWin,VALOR1,ADDR VALOR1_ASCII,10
Onde os parmetros a serem fornecidos so, hWin, que o gerenciador da janela
de comandos, VALOR1, identifica (fornece o ID do local escrito) qual valor digitado
deve ser alocado no endereo da varivel VALOR1_ASCII. Percebe-se que o nmero
retornado em forma de string ASCII com tamanho de 10 caracteres.
Para realizar a operao adio em assembly faz-se necessrio converter os
valores que esto em ASCII para valores em binrio. Para isso, utilizou-se uma funo
do compilador MASM chamada atodw, que converte um valor ASCII para binrio. Mas
antes de utiliz-la tem-se que incluir a biblioteca MASM32 no arquivo calculadora.inc.
essa funo manuseada da seguinte forma:

invoke atodw, ADDR VALOR1_ASCII

preciso fornecer apenas o endereo da varivel que est em ASCII, essa
funo retorna diretamente o valor da varivel em binrio no registrador eax. Para
realizar a operao adio de fato, fez-se uso da instruo ADD do assembly. Essa
instruo soma os valores dos dois registrados indicados na linha de cdigo, e retorna o
valor da soma no primeiro registrador previamente determinado.

4.2 Subtrao

A implementao da operao subtrao segue os mesmos passos descritos na
operao anterior. Ler-se os valores dos operandos desejados, converte-os para binrio e
realiza a subtrao atravs da instruo SUB, que funciona da seguinte forma.
sub eax, VALOR2_BIN
Neste caso essa instruo subtrai VALOR2_BIN do valor encontrado no
registrador eax, e retorna o resultado da subtrao em eax.

4.3 Multiplicao

A realizao dessa operao deu-se pela utilizao da instruo do assembly
MUL, que multiplica o operando especificado na linha de comando pelo valor
encontrado no registrador eax e retorna o valor da multiplicao no registrador eax.
Uma parte mais detalhada pode ser observada no seguinte trecho d cdigo.
invoke GetDlgItemText,hWin,VALOR1,ADDR VALOR1_ASCII,10
invoke GetDlgItemText,hWin,VALOR2,ADDR VALOR2_ASCII,10

invoke atodw, ADDR VALOR1_ASCII
mov VALOR1_BIN, eax
mov ebx, VALOR1_BIN

invoke atodw, ADDR VALOR2_ASCII
mov VALOR2_BIN, eax

mul ebx
mov RESULTADO_BIN, eax

4.4 Diviso

Seguindo o mesmo raciocnio, pode-se implementar a operao de subtrao.
Fez-se uso da instruo do assembly DIV, que realiza a diviso do valor que se encontra
no registrador eax pelo valor especificado na linha de comando. Essa instruo retorna
valor da diviso em eax e o resto no registrador edx. A calculadora em questo
apresenta o resultado com apenas uma casa decimal. Para isso, dividiu-se o valor
encontrado em edx (o resto da diviso inicial) por 10.
4.5 Raiz quadrada

Para a implementao da funo raiz quadrada utilizou-se o mtodo de
aproximao de Newton, que pode ser expresso pela seguinte equao:



Esse mtodo iterativo, onde

o resultado parcial da operao. Essa


operao realizada at que o mdulo da subtrao de -

seja menor que um erro


previamente especificado. A varivel X um valor inicial para comeo da iterao, no
caso dessa calculadora esse valor foi o prprio nmero do qual se deseja tirar a raiz.
Na implementao do cdigo utilizou-se a instruo cmp para comparar o valor
da iterao anterior com o valor atual e dependendo do resultado dessa comparao
realiza-se ou no uma nova iterao como pode ser visto no trecho abaixo.

LACO: mov RESULTADO_PARCIAL, eax
mov eax, VALOR1_BIN
div RESULTADO_PARCIAL
mov edx,0
add eax, RESULTADO_PARCIAL
div DOIS
mov edx,0
cmp RESULTADO_PARCIAL, eax
jnz LACO

Ou seja, de acordo com o cdigo apresentado, percebe-se que este ser realizado
sempre que a diferena entre o contedo do registrador eax e a varivel
RESULTADO_PARCIAL for diferente de zero.

4.6 Raiz cbica

Implementou-se a raiz cbica seguindo o mesmo raciocnio da funo raiz
quadrada. Tambm utilizou-se o mtodo de aproximao de Newton, expresso pela
seguinte equao:



Esse mtodo iterativo, onde

o resultado parcial da operao. Essa


operao realizada at que o mdulo da subtrao de -

seja menor que um erro


previamente especificado. A varivel X um valor inicial para comeo da iterao, no
caso dessa calculadora esse valor foi o prprio nmero do qual se deseja tirar a raiz. A
escolha de quando parar de realizar as iteraes ocorre da mesma forma como explica
na raiz quadrada, utilizando as instrues cmp e jnz.
Tanto para a raiz quadrada quanto para a raiz cbica, o mtodo utilizado fornece
apenas resultados inteiros aproximados. Por exemplo, deseja-se calcular a raiz cbica de
60, de acordo com o mtodo o mesmo fornecer a raiz cbica do nmero menor e mais
aproximado de 60 que tenha raiz exata, nesse caso seria raiz de 27, que resultaria em 3.
Esse valor s mudaria se o nmero o qual deseja-se extrair a raiz cbica for maior que
64, pois o prximo nmero maior e mais prximo de 60 que tem raiz cbica exata.

4.7 Fatorial

Para implementar essa operao fez-se uso da funo .while, funcionando da
seguinte forma, carrega-se um determinado registrador com o valor em binrio do do
nmero o qual deseja-se encontrar o fatorial, e dentro do .while subtrai-se o valor deste
registrador de uma unidade, multiplicando pelo valor anterior a subtrao. O resultado
armazena em um outro registrador e a mesmo operao realizada. O trecho do
programa que representa esta operao mostrado abaixo.
mov ecx, VALOR1_BIN
.while ecx > 2
sub ecx, 1
mov RESULTADO_PARCIAL, ecx
mul RESULTADO_PARCIAL
mov RESULTADO_PARCIAL, eax
.endw

4.8 Potenciao

Tambm desenvolveu-se esta funo utilizando ajuda do controle de fluxo de
programa .while, que se d da seguinte forma. Armazena-se em um registrador o valor
do expoente da operao, e dentro do .while decrementa-se este valor de 1, at que o
mesmo seja 1. Cada vez que este registrador decrementado multiplica-se o valor do
nmero base da operao por ele mesmo, representado assim uma funo de
potenciao. O seguinte trecho de cdigo mostra como implementou-se esta funo.
.if ((ebx == 0 && ecx == 0))
invoke MessageBox, NULL, addr TextoJanela, addr TituloJanela, MB_OK or
MB_ICONEXCLAMATION
.else
.if ebx == 0
mov eax,1
.endif
.while ebx > 1
mul ecx
sub ebx,1
.endw
mov RESULTADO_BIN, eax
mov RESULTADO_BIN2, 0

xor eax,eax
xor ebx,ebx
xor ecx,ecx
xor edx,edx
.endif

Criou-se tambm para esta operao uma condio para o caso em que se o
usurio, por ventura, digitar o valor do nmero base da operao e o expoente da
operao como sendo zero, o programa emite uma mensagem de erro atravs da funo
MessageBox. Esta funo mostra um cone OK com um uma exclamao informando
que h uma mensagem de alerta.





4.9 Arranjo Simples

Como se sabe a funo arranjo simples expressa pela seguinte equao:



Percebe-se que para implementar esta funo ser necessrio fazer uso da
operao fatorial duas vezes. Para no repetir-se esta operao varias vezes ao decorrer
do cdigo. Criou-se um procedimento para facilitar a utilizao do fatorial e como
conseqncia deixar o cdigo mais enxuto. O trecho do cdigo referente a criao
desse procedimento mostrado logo abaixo:
Fatorial proc Val1: dword
mov ecx, Val1
mov eax, Val1
.if ecx == 0
mov eax, 1
.endif
.while ecx > 2
sub ecx, 1
mov RESULTADO_PARCIAL, ecx
mul RESULTADO_PARCIAL
mov RESULTADO_PARCIAL, eax
.endw
mov RESULTADO_BIN, eax
mov RESULTADO_BIN2, 0
ret
Fatorial endp

Deve-se lembrar que pra criar um procedimento preciso declar-lo no arquivo
.inc. Aps criado o procedimento possvel chamar esta funo (Fatorial) atravs do
uso do invoke, da mesma forma como se chama uma funo de qualquer API do
Windows. Lembrando que necessrio fornecer os parmetros corretos e saber em que
varivel ou em qual registrador a funo retornar o resultado. Neste caso,
procedimento retorna o resultado no registrador eax e na varivel RESULTADO_BIN.




5. Concluso

O trabalho aqui apresentado obteve resultados satisfatrios, tendo em vista que
fora concludo tudo o que se pediu para o projeto da calculadora, como por exemplo,
todas as funes bsicas e todas as funes extras foram corretamente implementadas,
pois apresentou-se previamente o projeto ao professor responsvel.
Com relao ao aprendizado, este projeto serviu como uma grande experincia
para os alunos da disciplina, pois esudou-se sobre algumas das varias APIs do
Windows 32 bits e praticou-se muito mais a linguagem de programao Assembly.
Percebeu-se tambm no inicio do projeto uma certa dificuldade em obter os valores
digitados pelos usurios e mostrar os resultados das operaes na janela grfica. Porm,
esta dificuldade se deu devido a pouca experincia dos alunos, particularmente no autor
deste tutorial, em programao assembly para ambiente Windows.

Potrebbero piacerti anche