Professional Documents
Culture Documents
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:
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.
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#
# 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)
-2-
;#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;#
;# EL66C - Arquitetura e Organizao de Computadores
;#
;# Lab02A
;# 2a. Aula de Laboratrio
;#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;
.386P
.model FLAT
;
;
;
;
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================================================
_meuMain
PROC NEAR
; 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 ------------------;-----------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-
push
push
push
push
push
call
0H
offset flat: dwWritten
sizeof Str_format
offset flat: Str_fibo
OUT_HANDLE
dword ptr[__imp__WriteConsoleA@20]
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]
_meuMain
ENDP
; fechamento da procedure
;===============Fim do segmento de cdigo======================================
END
-3-
;#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;#
;# EL66C - Arquitetura e Organizao de Computadores
;#
;# Lab02B
;# 2a. Aula de Laboratrio
;#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;
.386P
.model FLAT
;
;
;
;
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
;===============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]
push
push
push
push
call
MB_YESNO OR MB_ICONQUESTION
offset flat: MSG_CAP
offset flat: Str_fibo
0
dword ptr[__imp__MessageBoxA@16]
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]
_meuMain
ENDP
; 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-
;#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;#
;# EL66C - Arquitetura e Organizao de Computadores
;#
;# Lab02C
;# 2a. Aula de Laboratrio
;#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
.386P
.model FLAT
;
;
;
;
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
;===============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
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]
_meuMain
ENDP
; fechamento da procedure
;===============Fim do segmento de cdigo======================================
END
-3-
;#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;#
;# EL66C - Arquitetura e Organizao de Computadores
;#
;# Fibo_loop
;# 2a. Aula de Laboratrio
;#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;
.386P
.model FLAT
;
;
;
;
-1-