Академический Документы
Профессиональный Документы
Культура Документы
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
Esse mtodo iterativo, onde
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.