Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .386P ; Informa ao assemblador que serão
- ; utilizadas instruções de 32 bits
- ; em modo protegido
- .model FLAT ; usado no Windows
- ;====Símbolos chamados por outros programs (no caso o Loader)==================
- PUBLIC _meuMain
- ;===============Fim dos símbolos públicos======================================
- ;====Símbolos acessados em outros módulos (em USER32.DLL e KERNE32.DLL): ======
- ; Todas as funções abaixo usam convenção de chamda _stdcall, exceto
- ; wsprintf(), que utiliza c_call devido à qtde variável de parâmetros
- EXTERN __imp__MessageBoxA@16:NEAR ; está em USER32.LIB
- EXTERN __imp__wsprintfA:NEAR ; está em USER32.LIB
- EXTERN __imp__ExitProcess@4:NEAR ; está em KERNEL32.LIB
- ;===============Fim dos símbolos externos======================================
- ;===============Equates usados neste programa:=================================
- AR_SIZE EQU 16 ; Tamanho máximo do array
- ;===============Fim dos equates================================================
- ;===============Segmento de dados incializados:================================
- .data ; diretiva inicia o segmento
- An_2 DWORD 0H ; Valor inicial para An-2
- An_1 DWORD 1H ; Valor inicial para An-1
- N_Termos DWORD AR_SIZE ; Quantidade máx de termos do array
- ;-----------Mensagens diversas utilizadas neste programa: -----------------
- ;===============Fim do segmento de dados inicializados ========================
- ;===============Segmento de dados não incializados:============================
- .data? ; diretiva inicia o segmento
- Fibo DWORD AR_SIZE DUP (?) ; Array com AR_SIZE elementos
- ;===============Fim do segmento de dados não inicializados ====================
- ;===============Segmento de código:============================================
- .code ; diretiva inicia o segmento
- _meuMain PROC NEAR ; abertura da procedure
- ;---------- Inicialmente tenta obter handle para o console: ---------------
- ;----------- Se for console seta seu título: ------------------------------
- ;----------- Mensagem de boas vindas no console: --------------------------
- ;------------ Mensagem de boas vindas via MessageBox: ---------------------
- so_gui: ; agora as boas vindas GUI:
- ; ATENÇÃO!! - Refatorar o cálculo dos termos da sequência de Fibonacci
- ; em uma rotina chamada _Fibo_loop!
- ;-----------Preparação para o loop de fibonacci: --------------------------
- mov ecx, N_Termos ; ecx = contador de nr. de termos
- mov ebx, An_2 ; ebx contém termo An-2
- mov eax, An_1 ; eax contém termo An-1
- mov edi, offset flat:Fibo ; edi->início do array de Fibonacci
- loop_fibo_calc:
- ;-----------Início do loop controlado por ecx: ----------------------------
- push eax ; salva cópia de An-1 na pilha
- add eax, ebx ; eax = An = An-1 + An-2
- stosd ; eax=An -> próxima pos. do array
- pop ebx ; resgata An-1 da pilha para ebx
- dec ecx ; decrementa o contador
- jnz loop_fibo_calc ; fica em loop até esgotar ecx
- ;-----------Fim do loop de fibonacci controlado por ecx -------------------
- ;-----------Preparação para o loop de mostrar resultados: -----------------
- mov edi, N_Termos ; edi conta os termos mostrados
- mov esi, offset flat: Fibo ; esi-> valor inicial a mostrar
- mov ebx, 2 ; índice inicial mostrado
- ;-----------Início do loop de mostrar resultados: -------------------------
- loop_fibo_show:
- ;-----------Formata próximo valor da array em uma string: -----------------
- ;---------- Verifica a existência do console: -----------------------------
- ;----------- Escrita do valor da sequência no console: --------------------
- ;----------- Escrita do valor da sequência em uma MsgBox YESNO: -----------
- so_gui_2:
- inc ebx ; incrementa índice da sequência
- dec edi ; decrementa contador de loop
- jnz loop_fibo_show ; se contador <> 0 fica em loop
- ;-----------Fim do loop de mostrar resultados: ----------------------------
- fim:
- ;-----------Mensagem de despedida: ----------------------------------------
- ;-----------Encerramento do programa: -------------------------------------
- _meuMain ENDP ; fechamento da procedure
- ;===============Fim do segmento de código======================================
- END
Add Comment
Please, Sign In to add comment