You are on page 1of 15

Alunos:

Rafael Alves do Nascimento


Rafael Nerone Gadens
RELATRIO DO LABORATRIO 2
1) Quais as opes de assembler necessrias ao ML para criar arquivos objeto que sejam linkveis para
Windows 32 bits? Explique o que significa cada uma.

R: As opes necessrias so: /c e /coff. A primeira delas (/c:) monta sem assemblar. A segunda (/coff:) fera
o objeto .obj no formato COFF.

2) Quais as opes mnimas necessrias para o linkador de 32 bits para gerar arquivos executveis para
Windows 32 bits (GUI e CONSOLE)? Explique o significado de cada uma.
R: Ponto de entrada (entry) e subsystem (escolha entre GUI, CONSOLE e outras opes).
3) Quais foram as diretivas simplificadas de assemblagem utilizadas? Essas diretivas criaram quais
segmentos, com quais nomes? Explique como (onde) voc descobriu o nome dos segmentos criados.
Diretiva
Nome do segmento criado
Funo
.model
Inicializa o modelo de memria do programa, sendo de
32-bit por causa do parmetro escolhido (FLAT)
.code
_TEXT
Cria o segmento de cdigo
.data?
_BSS
Cria o segmento de data no inicializada
.data
_DATA
Cria o segmento de data inicializada
.
Fonte: MicroSoft Developers Network (https://msdn.microsoft.com/en-us/library/8t163bt0.aspx)
4) Explique qual o ponto de entrada padro utilizado pelo linkador de 32 bits quando no definimos
nenhum atravs da opo /ENTRY. Esse ponto o mesmo para programas GUI e CONSOLE? Onde se
encontra e o que faz a rotina dos pontos de entrada padro?
R: O ponto de entrada padro o mainCRTStartup (para SUBSYSTEM CONSOLE) que chama a entrada
main; e WinCRTStartup (para SUBSYSTEM WINDOWS) que chama a entrada WinMain.
5) Qual a maneira utilizada no programa Lab02 para saber se o programa do tipo CONSOLE ou GUI?
R: Atravs da funo GetStdHandle com o parmetro -11, onde o dispositivo padro de sada o buffer
da tela do console. Em caso positivo (retorno no-zero) o programa do tipo CONSOLE. Em caso
negativo (retorno zero) o programa do tipo GUI.
Linha de cdigo responsvel por essa etapa do processo:
push STD_OUTPUT_H
call dword ptr[__imp__GetStdHandle@4]
cmp eax,0H
; Retorno no-zero = CONSOLE ; Retorno zero = GUI
jz so_gui
; Se = 0, ento pula para label so_gui

6) Liste cada uma das API's do Windows utilizadas no programa Lab02, indicando quantos e quais
parmetros cada uma recebe e qual a funo de cada um. Indique tambm qual valor cada uma retorna
e qual a conveno de chamada utilizada em cada caso. Adicionalmente, indique a qual biblioteca
dinmica cada API pertence e qual o arquivo .lib que deve ser linkado com o aplicativo para gerar o
executvel.
R:
WriteConsole
Funo: Escrever no console
Nmero de parmetros: 5
Parmetros:

hConsoleOutput: handle do console (endereo)


lpBuffer: mensagem a ser escrita
nNumberOfCharsToWrite: nmero caracteres a escrever
lpNumberOfCharsWritten: nmero de caracteres escritos com sucesso
lpReserved: reservado
Retorno: varivel booleana
Conveno de chamada: _stdcall
MessageBox
Funo: Cria uma janela do Windows
Nmero de parmetros: 4
Parmetros:
hWnd:
lpText: texto da janela
lpCaption: Ttulo da janela
uType: Tipo de janela (Yes/No, OK, cone de interrogao etc.)
Retorno: inteiro, ao realizada na janela
Conveno de chamada: _stdcall
GetStdHandle
Funo: Tenta obter o handle do console, no consegue se o programa for do tipo WINDOWS
Nmero de parmetros:1
Parmetros:
nStdHandle
Retorno:
HANDLE, endereo do controle console
Conveno de chamada: _stdcall
SetConsoleTitle
Funo: Mudar o ttulo do console
Nmero de parmetros: 1
Parmetros:
lpConsoleTitle: Texto
Retorno:
Varivel booleana
Conveno de chamada: _stdcall
wsprintf
Funo: Formatar uma string atribuindo os valores das variveis
Nmero de parmetros: 2+n (n o nmero de variveis utilizadas na string)
Parmetros:
lpOut: string formatada
lpFmt: string a ser formatada
n parmetros referentes s variveis
Retorno:
inteiro
Conveno de chamada: linguagem C
ExitProcess
Funo: fecha o programa
Nmero de parmetros: 1
Parmetros:
uExitCode: cdigo de sada
Retorno: no existe
Conveno de chamada: _stdcall

7) Qual a diferena entre uma biblioteca esttica e uma biblioteca dinmica (DLL)? Cite vantagens e
desvantagens de cada uma.
R:
A DLL, biblioteca dinnima possui funes utilizadas por muitos programas. Uma das vantagens de sua
utilizao a economia de memria e a desvatangem a necessidade de haver uma chamada no
momento de executar uma dada rotina.
A biblioteca esttica includa no cdigo do programa durante a sua linkagem. As vantagens e
desvantagens so opostas ao que foi apresentado na DLL, ou seja, o que visto como vantagem ou
desvatagem ao se utilizar as DLLs so tidos como desvantagens e vantagens, respectivamente, quando
utiliza-se uma biblioteca esttica.
8) Como voc pde notar nesse experimento, as libs de bibliotecas dinmicas do Windows, exportam,
para cada funo denominada Func, dois smbolos: _Func@xxx e __imp__Func@xxx, onde xxx
representa a quantidade de bytes transferidos na pilha como parmetros. Explique a diferena entre
esses dois smbolos e os motivos desse procedimento. (obs.: voc pode listar todos os smbolos de API's
exportados por uma lib usando o utilitrio dumpbin com a opo /linkermember p. ex., digite
dumpbin user32.
R:
Uma funo sem o prefixo __imp__ colocada pelo Linker na biblioteca esttica do programa.
Quando a funo chamada utilizando-se o prefixo __imp__, o Linker atribui ao endereo de sua
definio um endereo de redirecionamento para uma DLL.

C:\Users\Rafael Alves\Documents\UTFPR\7 Perodo\AOC\Labs\Lab02_1s16\Makefile

quarta-feira, 30 de maro de 2016 13:33

#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#
# EL66C - Arquitetura e Organizao de Computadores
#
# Makefile
# 2a. Aula de Laboratrio
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#opes para assemblar para .obj no formato coff 32 bits:
AFLAGS=/c /coff
#opes para linkar o executvel a partir do .obj:
LFLAGSW=/entry:meuMain \
/SUBSYSTEM:WINDOWS
LFLAGSC=/entry:meuMain \
/SUBSYSTEM:CONSOLE

LIBS=USER32.LIB KERNEL32.LIB
# Especificao do Linker de 32 bits a ser utilizado:
LNK32=link
.asm.exe:
$(AS) $(AFLAGS) $<
$(AS) $(AFLAGS) Fibo_loop.asm
$(LNK32) $(LFLAGSC) $*.obj Fibo_loop.obj $(LIBS)
.asm.exe1:
$(AS) $(AFLAGS) $<
$(LNK32) $(LFLAGSC) $*.obj $(LIBS)

Lab02w.exe:
$(AS) $(AFLAGS) Lab02C.asm
$(AS) $(AFLAGS) Fibo_loop.asm
$(LNK32) $(LFLAGSW) /OUT:Lab02w.exe Lab02C.obj Fibo_loop.obj $(LIBS)
Lab02c.exe:
$(AS) $(AFLAGS) Lab02C.asm
$(AS) $(AFLAGS) Fibo_loop.asm
$(LNK32) $(LFLAGSC) /OUT:Lab02c.exe Lab02C.obj Fibo_loop.obj $(LIBS)
#Pseudo target para gerar ambos executaveis
ambos:
$(AS) $(AFLAGS) Lab02C.asm
$(AS) $(AFLAGS) Fibo_loop.asm
$(LNK32) $(LFLAGSW) /OUT:Lab02w.exe Lab02C.obj Fibo_loop.obj $(LIBS)
$(LNK32) $(LFLAGSC) /OUT:Lab02c.exe Lab02C.obj Fibo_loop.obj $(LIBS)

#Pseudo target para fornecer algumas informaes sobre a utilizao:


info:
@echo **************** UTILIZAO: *****************************************
@echo * Alunos:
@echo * Rafael ALves do Nascimento
@echo * Rafael Nerone Gadens
@echo *
@echo * Makefile para gerar arquivo executvel Lab02C.exe a partir
@echo * dos cdigos Lab02C.asm e Fibo_loop.asm
@echo *
@echo *
@echo *
@echo * digite:
@echo *
@echo * nmake .............. - para ver esta tela de informaes
@echo * nmake Lab02A.exe ... - para gerar Lab02A.exe
@echo * nmake Lab02B.exe1... - para gerar Lab02B.exe (rotina para calculo da sequencia
-1-

C:\Users\Rafael Alves\Documents\UTFPR\7 Perodo\AOC\Labs\Lab02_1s16\Makefile

quarta-feira, 30 de maro de 2016 13:33

separada, porm no mesmo .asm)


@echo * nmake Lab02c.exe.... - para gerar Lab02c.exe a partir do Lab02C.obj
(CONSOLE)(utiliza Fibo_loop.asm)
@echo * nmake Lab02w.exe.... - para gerar Lab02w.exe a partir do Lab02C.obj
(WINDOWS)(utiliza Fibo_loop.asm)
@echo * nmake ambos......... - para gerar Lab02w.exe e Lab02c.exe a partir do Lab02C.obj;
@echo * .................... - verses WINDOWS e CONSOLE respectivamente
@echo * nmake clean ........ - para limpar os arquivos gerados
@echo * nmake info ......... - para ver esta tela de informaes
@echo *
@echo **********************************************************************
@echo **********************************************************

#Pseudo target para deixar o diretrio no estado inicial:


clean:
-@del
*.exe
-@erase *.obj
-@erase *.lst
-@erase *.pdb
-@erase *.map

-2-

C:\Users\Rafael Alves\Documents\UTFPR\7 Perodo\AOC\Labs\Lab02_1s16\Lab02A.asm

quarta-feira, 30 de maro de 2016 13:46

;#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;#
;# EL66C - Arquitetura e Organizao de Computadores
;#
;# Lab02A
;# 2a. Aula de Laboratrio
;#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;
.386P

.model FLAT

;
;
;
;

Informa ao assemblador que sero


utilizadas instrues de 32 bits
em modo protegido
usado no Windows

;====Smbolos chamados por outros programs (no caso o Loader)==================


PUBLIC _meuMain
;===============Fim dos smbolos pblicos======================================
;====Smbolos acessados em outros mdulos (em USER32.DLL e KERNE32.DLL): ======
; Todas as funes abaixo usam conveno de chamda _stdcall, exceto
; wsprintf(), que utiliza c_call devido qtde varivel de parmetros

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
EXTERN __imp__GetStdHandle@4:NEAR
; est em KERNEL32.LIB
EXTERN __imp__WriteConsoleA@20:NEAR
; est em KERNEL32.LIB
EXTERN __imp__SetConsoleTitleA@4:NEAR
;===============Fim dos smbolos externos======================================
;===============Equates usados neste programa:=================================
AR_SIZE
EQU
16
; Tamanho mximo do array
MB_OK
EQU
0H
CR
EQU
0DH
LF
EQU
0AH
STD_OUTPUT_H
EQU
-11
MB_YESNO
EQU
4
MB_ICONQUESTION EQU
20H
ID_YES
EQU
6
ID_NO
EQU
7
;===============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 mx de termos do array
OUT_HANDLE DWORD
0H

;-----------Mensagens diversas utilizadas neste programa: ----------------MSG_CAP


BYTE
'ProgramaLab02 v1.0 - Rafael Alves e Rafael Nerone',0H
MSG_INI
BYTE
'Bem vindo ao programa Lab02 - Rafael Alves e Rafael Nerone!',CR,LF,0H
Str_format BYTE
'O nr de fibonacci de ndice %02d vale %04d', CR, LF,
'Continuar?',CR,LF,0H
MSG_FIM
BYTE
'Obrigado',0H
MSG_CFIM
BYTE
'Obrigado',0H
;===============Fim do segmento de dados inicializados ========================
;===============Segmento de dados no incializados:============================
.data?
; diretiva inicia o segmento
Fibo
DWORD
AR_SIZE DUP (?)
; Array com AR_SIZE elementos
Str_fibo
BYTE
300 DUP (?)
dwWritten
DWORD
?
;===============Fim do segmento de dados no inicializados ====================
;===============Segmento de cdigo:============================================
.code
; diretiva inicia o segmento
-1-

C:\Users\Rafael Alves\Documents\UTFPR\7 Perodo\AOC\Labs\Lab02_1s16\Lab02A.asm

_meuMain

PROC NEAR

; abertura da procedure

quarta-feira, 30 de maro de 2016 13:46

;---------- Inicialmente tenta obter handle para o console: --------------push STD_OUTPUT_H


; STD_OUTPUT_H = -11 -> STD_OUTPUT_HANDLE (Tela
do console ativo)
call dword ptr[__imp__GetStdHandle@4]
cmp eax,0H
jz
so_gui
mov OUT_HANDLE, eax
;----------- Se for console seta seu ttulo: -----------------------------push offset flat: MSG_CAP
call dword ptr[__imp__SetConsoleTitleA@4]
;----------- Mensagem de boas vindas no console: -------------------------push 0H
push offset flat: dwWritten
push sizeof MSG_INI
push offset flat: MSG_INI
push OUT_HANDLE
call dword ptr[__imp__WriteConsoleA@20]

;------------ Mensagem de boas vindas via MessageBox: --------------------so_gui:


; agora as boas vindas GUI:
push MB_OK
push offset flat: MSG_CAP;
push offset flat: MSG_INI
push 0H
call dword ptr[__imp__MessageBoxA@16]
; ATENO!! - Refatorar o clculo dos termos da sequncia de Fibonacci
;
em uma rotina chamada _Fibo_loop!
;-----------Preparao para o loop de fibonacci: -------------------------mov ecx, N_Termos
; ecx = contador de nr. de termos
mov ebx, An_2
; ebx contm termo An-2
mov eax, An_1
; eax contm termo An-1
mov edi, offset flat:Fibo
; edi->incio do array de Fibonacci

loop_fibo_calc:
;-----------Incio do loop controlado por ecx: ---------------------------push eax
; salva cpia de An-1 na pilha
add eax, ebx
; eax = An = An-1 + An-2
stosd
; eax=An -> prxima 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 ------------------;-----------Preparao 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
;-----------Incio do loop de mostrar resultados: -------------------------

loop_fibo_show:
;-----------Formata prximo valor da array em uma string: ----------------lodsd
push eax
push ebx
push offset flat: Str_format
push offset flat: Str_fibo
call dword ptr[__imp__wsprintfA]
add esp, 16
;---------- Verifica a existncia do console: ----------------------------test OUT_HANDLE, 0FFFFFFFFH
jz so_gui_2
;----------- Escrita do valor da sequncia no console: --------------------2-

C:\Users\Rafael Alves\Documents\UTFPR\7 Perodo\AOC\Labs\Lab02_1s16\Lab02A.asm

push
push
push
push
push
call

0H
offset flat: dwWritten
sizeof Str_format
offset flat: Str_fibo
OUT_HANDLE
dword ptr[__imp__WriteConsoleA@20]

quarta-feira, 30 de maro de 2016 13:46

;----------- Escrita do valor da sequncia em uma MsgBox YESNO: ----------so_gui_2:


push MB_YESNO OR MB_ICONQUESTION
push offset flat: MSG_CAP
push offset flat: Str_fibo
push 0
call dword ptr[__imp__MessageBoxA@16]
cmp eax, ID_NO
jz fim

fim:

inc ebx
; incrementa ndice da sequncia
dec edi
; decrementa contador de loop
jnz loop_fibo_show
; se contador <> 0 fica em loop
;-----------Fim do loop de mostrar resultados: ---------------------------;-----------Mensagem de despedida: ---------------------------------------push MB_OK
push offset flat: MSG_CFIM
push offset flat: MSG_FIM
push 0
call dword ptr[__imp__MessageBoxA@16]
push
push
push
push
push
call

0H
offset flat: dwWritten
sizeof MSG_FIM
offset flat: MSG_FIM
OUT_HANDLE
dword ptr[__imp__WriteConsoleA@20]

;-----------Encerramento do programa: ------------------------------------push 0H


call dword ptr[__imp__ExitProcess@4]

_meuMain
ENDP
; fechamento da procedure
;===============Fim do segmento de cdigo======================================
END

-3-

C:\Users\Rafael Alves\Documents\UTFPR\7 Perodo\AOC\Labs\Lab02_1s16\Lab02B.asm

quarta-feira, 30 de maro de 2016 13:34

;#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;#
;# EL66C - Arquitetura e Organizao de Computadores
;#
;# Lab02B
;# 2a. Aula de Laboratrio
;#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;
.386P

.model FLAT

;
;
;
;

Informa ao assemblador que sero


utilizadas instrues de 32 bits
em modo protegido
usado no Windows

;====Smbolos chamados por outros programs (no caso o Loader)==================


PUBLIC _meuMain
;===============Fim dos smbolos pblicos======================================
;====Smbolos acessados em outros mdulos (em USER32.DLL e KERNE32.DLL): ======
; Todas as funes abaixo usam conveno de chamda _stdcall, exceto
; wsprintf(), que utiliza c_call devido qtde varivel de parmetros

EXTERN
EXTERN
EXTERN
EXTERN
EXTERN
EXTERN

__imp__MessageBoxA@16:NEAR
__imp__wsprintfA:NEAR
__imp__ExitProcess@4:NEAR
__imp__GetStdHandle@4:NEAR
__imp__WriteConsoleA@20:NEAR
__imp__SetConsoleTitleA@4:NEAR

;
;
;
;
;
;

est
est
est
est
est

em
em
em
em
em

USER32.LIB
USER32.LIB
KERNEL32.LIB
KERNEL32.LIB
KERNEL32.LIB

;===============Fim dos smbolos externos======================================


;===============Equates usados neste programa:=================================
AR_SIZE
EQU
16
; Tamanho mximo do array
MB_OK
EQU
0H
CR
EQU
0DH
LF
EQU
0AH
STD_OUTPUT_H
EQU
-11
MB_YESNO
EQU
4
MB_ICONQUESTION EQU
20H
ID_YES
EQU
6
ID_NO
EQU
7
;===============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 mx de termos do array
OUT_HANDLE DWORD
0H

;-----------Mensagens diversas utilizadas neste programa: ----------------MSG_CAP


BYTE
'ProgramaLab02 v2.0',0H
MSG_INI
BYTE
'Bem vindo ao programa Lab02! - Rafael Alves do Nascimento',CR,LF,0H
Str_format BYTE
'O nr de fibonacci de ndice %02d vale %04d', CR, LF,
'Continuar?',CR,LF,0H
MSG_FIM
BYTE
'Obrigado',0H
MSG_CFIM
BYTE
'Obrigado',0H
;===============Fim do segmento de dados inicializados ========================
;===============Segmento de dados no incializados:============================
.data?
; diretiva inicia o segmento
Fibo
DWORD
AR_SIZE DUP (?)
; Array com AR_SIZE elementos
Str_fibo
BYTE
300 DUP (?)
dwWritten
DWORD
?
;===============Fim do segmento de dados no inicializados ====================
-1-

C:\Users\Rafael Alves\Documents\UTFPR\7 Perodo\AOC\Labs\Lab02_1s16\Lab02B.asm

quarta-feira, 30 de maro de 2016 13:34

;===============Segmento de cdigo:============================================
.code
; diretiva inicia o segmento
_meuMain
PROC NEAR
; abertura da procedure
;---------- Inicialmente tenta obter handle para o console: --------------push STD_OUTPUT_H
call dword ptr[__imp__GetStdHandle@4]
cmp eax,0H
jz
so_gui
mov OUT_HANDLE, eax
;----------- Se for console seta seu ttulo: -----------------------------push offset flat: MSG_CAP
call dword ptr[__imp__SetConsoleTitleA@4]
;----------- Mensagem de boas vindas no console: -------------------------push 0H
push offset flat: dwWritten
push sizeof MSG_INI
push offset flat: MSG_INI
push OUT_HANDLE
call dword ptr[__imp__WriteConsoleA@20]
;------------ Mensagem de boas vindas via MessageBox: --------------------so_gui:
; agora as boas vindas GUI:
push MB_OK
push offset flat: MSG_CAP
push offset flat: MSG_INI
push 0H
call dword ptr[__imp__MessageBoxA@16]

;-----------Preparao para o loop de fibonacci: -------------------------push N_Termos


;Envio valores para a pilha
push An_2
push An_1
push offset flat: Fibo
call _Fibo_loop
;Chamo a rotina que far o clculo propriamente
dito
add esp, 16
;-----------Preparao 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

;-----------Incio do loop de mostrar resultados: ------------------------loop_fibo_show:


;-----------Formata prximo valor da array em uma string: ----------------lodsd
push eax
push ebx
push offset flat: Str_format
push offset flat: Str_fibo
call dword ptr[__imp__wsprintfA]
add esp, 16
;---------- Verifica a existncia do console: ----------------------------test OUT_HANDLE, 0FFFFFFFFH
jz so_gui_2
;----------- Escrita do valor da sequncia no console: -------------------push 0H
push offset flat: dwWritten
push sizeof Str_format
push offset flat: Str_fibo
push OUT_HANDLE
call dword ptr[__imp__WriteConsoleA@20]

;----------- Escrita do valor da sequncia em uma MsgBox YESNO: ----------so_gui_2:


-2-

C:\Users\Rafael Alves\Documents\UTFPR\7 Perodo\AOC\Labs\Lab02_1s16\Lab02B.asm

push
push
push
push
call

MB_YESNO OR MB_ICONQUESTION
offset flat: MSG_CAP
offset flat: Str_fibo
0
dword ptr[__imp__MessageBoxA@16]

quarta-feira, 30 de maro de 2016 13:34

cmp eax, ID_NO


jz fim

fim:

inc ebx
; incrementa ndice da sequncia
dec edi
; decrementa contador de loop
jnz loop_fibo_show
; se contador <> 0 fica em loop
;-----------Fim do loop de mostrar resultados: ---------------------------;-----------Mensagem de despedida: ---------------------------------------push MB_OK
push offset flat: MSG_CFIM
push offset flat: MSG_FIM
push 0
call dword ptr[__imp__MessageBoxA@16]
push
push
push
push
push
call

0H
offset flat: dwWritten
sizeof MSG_FIM
offset flat: MSG_FIM
OUT_HANDLE
dword ptr[__imp__WriteConsoleA@20]

;-----------Encerramento do programa: ------------------------------------push 0H


call dword ptr[__imp__ExitProcess@4]

_meuMain

ENDP

_Fibo_loop PROC NEAR


push ebp
mov ebp,esp
mov ecx, [ebp+20]
mov edi, [ebp+8]
mov ebx, [ebp+16]
mov eax, [ebp+12]

; fechamento da procedure
; abertura da procedure

loop_fibo_calc:
;-----------Incio do loop controlado por ecx: ---------------------------push eax
; salva cpia de An-1 na pilha
add eax, ebx
; eax = An = An-1 + An-2
stosd
; eax=An -> prxima 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 ------------------pop ebp
ret
_Fibo_loop ENDP
; fechamento da procecure
;===============Fim do segmento de cdigo======================================
END

-3-

C:\Users\Rafael Alves\Documents\UTFPR\7 Perodo\AOC\Labs\Lab02_1s16\Lab02C.asm

quarta-feira, 30 de maro de 2016 13:34

;#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;#
;# EL66C - Arquitetura e Organizao de Computadores
;#
;# Lab02C
;# 2a. Aula de Laboratrio
;#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
.386P

.model FLAT

;
;
;
;

Informa ao assemblador que sero


utilizadas instrues de 32 bits
em modo protegido
usado no Windows

;====Smbolos chamados por outros programs (no caso o Loader)==================


PUBLIC _meuMain
;===============Fim dos smbolos pblicos======================================
;====Smbolos acessados em outros mdulos (em USER32.DLL e KERNE32.DLL): ======
; Todas as funes abaixo usam conveno de chamda _stdcall, exceto
; wsprintf(), que utiliza c_call devido qtde varivel de parmetros

EXTERN
EXTERN
EXTERN
EXTERN
EXTERN
EXTERN
EXTERN

__imp__MessageBoxA@16:NEAR
__imp__wsprintfA:NEAR
__imp__ExitProcess@4:NEAR
__imp__GetStdHandle@4:NEAR
__imp__WriteConsoleA@20:NEAR
__imp__SetConsoleTitleA@4:NEAR
_Fibo_loop:NEAR

;
;
;
;
;
;

est
est
est
est
est

em
em
em
em
em

USER32.LIB
USER32.LIB
KERNEL32.LIB
KERNEL32.LIB
KERNEL32.LIB

;===============Fim dos smbolos externos======================================


;===============Equates usados neste programa:=================================
AR_SIZE
EQU
16
; Tamanho mximo do array
MB_OK
EQU
0H
CR
EQU
0DH
LF
EQU
0AH
STD_OUTPUT_H
EQU
-11
MB_YESNO
EQU
4
MB_ICONQUESTION EQU
20H
ID_YES
EQU
6
ID_NO
EQU
7
;===============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 mx de termos do array
OUT_HANDLE DWORD
0H

;-----------Mensagens diversas utilizadas neste programa: ----------------MSG_CAP


BYTE
'ProgramaLab02 v2.0',0H
MSG_INI
BYTE
'Bem vindo ao programa Lab02! - Rafael Alves do Nascimento',CR,LF,0H
Str_format BYTE
'O nr de fibonacci de ndice %02d vale %04d', CR, LF,
'Continuar?',CR,LF,0H
MSG_FIM
BYTE
'Obrigado',0H
MSG_CFIM
BYTE
'Obrigado',0H
;===============Fim do segmento de dados inicializados ========================
;===============Segmento de dados no incializados:============================
.data?
; diretiva inicia o segmento
Fibo
DWORD
AR_SIZE DUP (?)
; Array com AR_SIZE elementos
Str_fibo
BYTE
300 DUP (?)
dwWritten
DWORD
?
;===============Fim do segmento de dados no inicializados ====================
-1-

C:\Users\Rafael Alves\Documents\UTFPR\7 Perodo\AOC\Labs\Lab02_1s16\Lab02C.asm

quarta-feira, 30 de maro de 2016 13:34

;===============Segmento de cdigo:============================================
.code
; diretiva inicia o segmento
_meuMain
PROC NEAR
; abertura da procedure
;---------- Inicialmente tenta obter handle para o console: --------------push STD_OUTPUT_H
call dword ptr[__imp__GetStdHandle@4]
cmp eax,0H
jz
so_gui
mov OUT_HANDLE, eax
;----------- Se for console seta seu ttulo: -----------------------------push offset flat: MSG_CAP
call dword ptr[__imp__SetConsoleTitleA@4]
;----------- Mensagem de boas vindas no console: -------------------------push 0H
push offset flat: dwWritten
push sizeof MSG_INI
push offset flat: MSG_INI
push OUT_HANDLE
call dword ptr[__imp__WriteConsoleA@20]
;------------ Mensagem de boas vindas via MessageBox: --------------------so_gui:
; agora as boas vindas GUI:
push MB_OK
push offset flat: MSG_CAP
push offset flat: MSG_INI
push 0H
call dword ptr[__imp__MessageBoxA@16]
;-----------Preparao para o loop de fibonacci: -------------------------push N_Termos
;Envio valores para a pilha
push An_2
push An_1
push offset flat: Fibo
call _Fibo_loop
dito
add esp, 16

;Chamo a rotina que far o clculo propriamente

;-----------Preparao 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

;-----------Incio do loop de mostrar resultados: ------------------------loop_fibo_show:


;-----------Formata prximo valor da array em uma string: ----------------lodsd
push eax
push ebx
push offset flat: Str_format
push offset flat: Str_fibo
call dword ptr[__imp__wsprintfA]
add esp, 16
;---------- Verifica a existncia do console: ----------------------------test OUT_HANDLE, 0FFFFFFFFH
jz so_gui_2
;----------- Escrita do valor da sequncia no console: -------------------push 0H
push offset flat: dwWritten
push sizeof Str_format
push offset flat: Str_fibo
push OUT_HANDLE
call dword ptr[__imp__WriteConsoleA@20]
-2-

C:\Users\Rafael Alves\Documents\UTFPR\7 Perodo\AOC\Labs\Lab02_1s16\Lab02C.asm

quarta-feira, 30 de maro de 2016 13:34

;----------- Escrita do valor da sequncia em uma MsgBox YESNO: ----------so_gui_2:


push MB_YESNO OR MB_ICONQUESTION
push offset flat: MSG_CAP
push offset flat: Str_fibo
push 0
call dword ptr[__imp__MessageBoxA@16]
cmp eax, ID_NO
jz fim

fim:

inc ebx
; incrementa ndice da sequncia
dec edi
; decrementa contador de loop
jnz loop_fibo_show
; se contador <> 0 fica em loop
;-----------Fim do loop de mostrar resultados: ---------------------------;-----------Mensagem de despedida: ---------------------------------------push MB_OK
push offset flat: MSG_CFIM
push offset flat: MSG_FIM
push 0
call dword ptr[__imp__MessageBoxA@16]
push
push
push
push
push
call

0H
offset flat: dwWritten
sizeof MSG_FIM
offset flat: MSG_FIM
OUT_HANDLE
dword ptr[__imp__WriteConsoleA@20]

;-----------Encerramento do programa: ------------------------------------push 0H


call dword ptr[__imp__ExitProcess@4]

_meuMain
ENDP
; fechamento da procedure
;===============Fim do segmento de cdigo======================================
END

-3-

C:\Users\Rafael Alves\Documents\UTFPR\7 Perodo\AOC\Labs\Lab02_1s16\Fibo_loop.asm

quarta-feira, 30 de maro de 2016 13:34

;#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;#
;# EL66C - Arquitetura e Organizao de Computadores
;#
;# Fibo_loop
;# 2a. Aula de Laboratrio
;#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;
.386P

.model FLAT

;
;
;
;

Informa ao assemblador que sero


utilizadas instrues de 32 bits
em modo protegido
usado no Windows

;====Smbolos chamados por outros programs (no caso o Loader)==================


PUBLIC _Fibo_loop
;===============Fim dos smbolos pblicos======================================
;===============Segmento de cdigo:============================================
.code
; diretiva inicia o segmento
_Fibo_loop PROC NEAR
; abertura da procedure
push
ebp
mov
ebp, esp
;-----------Preparao para o loop de fibonacci: --------mov ecx, [ebp+20]
;ecx contem N_Termos
mov edi, [ebp+8]
;edi->inicio do array
mov ebx, [ebp+16]
;ebx contem termo An-2
mov eax, [ebp+12]
;eax contem termo An-1
loop_fibo_calc:
;-----------Inicio do loop controlado por ecx: ----------push eax
add eax, ebx
stosd
pop ebx
dec ecx
jnz loop_fibo_calc

;-----------Fim do loop de fibonacci controlado por ecx---pop ebp


ret
_Fibo_loop ENDP
; fechamento da procedure
;===============Fim do segmento de cdigo======================================
END

-1-

You might also like