pauloludewig

lab02.asm

Sep 7th, 2016
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .386P                                       ; Informa ao assemblador que serão
  2.                                             ; utilizadas instruções de 32 bits
  3.                                             ; em modo protegido
  4. .model FLAT                                 ; usado no Windows
  5.  
  6. ;====Símbolos chamados por outros programs (no caso o Loader)==================
  7. PUBLIC  _meuMain
  8. ;===============Fim dos símbolos públicos======================================
  9.  
  10. ;====Símbolos acessados em outros módulos (em USER32.DLL e KERNE32.DLL): ======
  11.  
  12.     ; Todas as funções abaixo usam convenção de chamda _stdcall, exceto
  13.     ; wsprintf(), que utiliza c_call devido à qtde variável de parâmetros
  14.  
  15. EXTERN  __imp__MessageBoxA@16:NEAR          ; está em USER32.LIB
  16. EXTERN  __imp__wsprintfA:NEAR               ; está em USER32.LIB
  17. EXTERN  __imp__ExitProcess@4:NEAR           ; está em KERNEL32.LIB
  18. ;===============Fim dos símbolos externos======================================
  19.  
  20. ;===============Equates usados neste programa:=================================
  21.     AR_SIZE         EQU     16              ; Tamanho máximo do array
  22.  
  23. ;===============Fim dos equates================================================
  24.  
  25. ;===============Segmento de dados incializados:================================
  26. .data                                       ; diretiva inicia o segmento
  27.     An_2        DWORD   0H                  ; Valor inicial para An-2
  28.     An_1        DWORD   1H                  ; Valor inicial para An-1
  29.     N_Termos    DWORD   AR_SIZE             ; Quantidade máx de termos do array
  30.    
  31.     ;-----------Mensagens diversas utilizadas neste programa: -----------------
  32.    
  33. ;===============Fim do segmento de dados inicializados ========================
  34.  
  35. ;===============Segmento de dados não incializados:============================
  36. .data?                                      ; diretiva inicia o segmento
  37.     Fibo        DWORD   AR_SIZE DUP (?)     ; Array com AR_SIZE elementos
  38.  
  39. ;===============Fim do segmento de dados não inicializados ====================
  40.  
  41. ;===============Segmento de código:============================================
  42. .code                                       ; diretiva inicia o segmento
  43. _meuMain    PROC NEAR                       ; abertura da procedure
  44.     ;---------- Inicialmente tenta obter handle para o console: ---------------
  45.  
  46.     ;----------- Se for console seta seu título: ------------------------------
  47.                
  48.     ;----------- Mensagem de boas vindas no console: --------------------------        
  49.    
  50.     ;------------ Mensagem de boas vindas via MessageBox: ---------------------
  51. so_gui:                                 ; agora as boas vindas GUI:
  52.  
  53.     ; ATENÇÃO!! - Refatorar o cálculo dos termos da sequência de Fibonacci
  54.     ;             em uma rotina chamada _Fibo_loop!
  55.     ;-----------Preparação para o loop de fibonacci: --------------------------
  56.     mov ecx, N_Termos                       ; ecx = contador de nr. de termos
  57.     mov ebx, An_2                           ; ebx contém termo An-2
  58.     mov eax, An_1                           ; eax contém termo An-1
  59.     mov edi, offset flat:Fibo               ; edi->início do array de Fibonacci
  60. loop_fibo_calc:
  61.     ;-----------Início do loop controlado por ecx: ----------------------------
  62.     push eax                                ; salva cópia de An-1 na pilha
  63.     add eax, ebx                            ; eax = An = An-1 + An-2
  64.     stosd                                   ; eax=An -> próxima pos. do array
  65.     pop ebx                                 ; resgata An-1 da pilha para ebx
  66.     dec ecx                                 ; decrementa o contador
  67.     jnz loop_fibo_calc                      ; fica em loop até esgotar ecx
  68.     ;-----------Fim do loop de fibonacci controlado por ecx -------------------
  69.  
  70.     ;-----------Preparação para o loop de mostrar resultados: -----------------
  71.     mov edi, N_Termos                       ; edi conta os termos mostrados
  72.     mov esi, offset flat: Fibo              ; esi-> valor inicial a mostrar
  73.     mov ebx, 2                              ; índice inicial mostrado
  74.     ;-----------Início do loop de mostrar resultados: -------------------------
  75. loop_fibo_show:
  76.     ;-----------Formata próximo valor da array em uma string: -----------------
  77.    
  78.     ;---------- Verifica a existência do console: -----------------------------
  79.  
  80.     ;----------- Escrita do valor da sequência no console: --------------------
  81.    
  82.     ;----------- Escrita do valor da sequência em uma MsgBox YESNO: -----------
  83. so_gui_2:  
  84.     inc ebx                                 ; incrementa índice da sequência
  85.     dec edi                                 ; decrementa contador de loop
  86.     jnz loop_fibo_show                          ; se contador <> 0 fica em loop
  87.     ;-----------Fim do loop de mostrar resultados: ----------------------------
  88. fim:
  89.     ;-----------Mensagem de despedida: ----------------------------------------
  90.    
  91.     ;-----------Encerramento do programa: -------------------------------------
  92.        
  93. _meuMain    ENDP                            ; fechamento da procedure
  94. ;===============Fim do segmento de código======================================
  95.  
  96. END
Add Comment
Please, Sign In to add comment