Relatório 02 Ismael & Marco
-
Upload
ismael-dias -
Category
Documents
-
view
85 -
download
17
Transcript of Relatório 02 Ismael & Marco
-
UNIVERSIDADE TECNOLGICA FEDERAL DO PARAN
ENGENHARIA ELETRNICA
ISMAEL DIAS
MARCO ANTONIO MOREIRA
RELATRIO 2
ARQUITETURA E ORGANIZAO DE COMPUTADORES
CURITIBA
2014
-
PGINA 1
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.
Deve-se digitar a seguinte linha de comando para criar um objeto linkvel para Windows 32 bits:
Atravs das seguintes linhas de comando:
ml /c /coff /Fl /Zi codigo.asm
/ml Especifica que est sendo utilizando o assembler ML do MASM 6.1;
/c Indica que o ml deve criar somente o arquivo .obj sem assemblar e linkar;
/coff Indica que o arquivo criado deve ser um common object file format,
/Fl Gera um arquivo de listagem durante o assemblamento;
/Zi Adiciona informaes de debug no arquivo final
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.
Para o linkador de 32 bits para gerar arquivos eecutveis para Windows 32 bits (GUI e CONSOLE) so
necessrias as opes setadas atravs dos LFLAGS:
/MACHINE:I386\ tipo de mquina usada (PC)
/ENTRY:meuMain\ Endereo de incio do programa
/RELEASE Realiza o checksum do arquivo, saber a verso do cdigo
/DEBUG Cria .pbd usados no Debug do programa
/LIB Indica as bibliotecas que sero Linkadas
/LIBPATH caminho do diretrio das bibliotecas
/OUT:$@ define o nome do arquivo de sada
/SUBSYSTEM:WINDOWS gerar .exe em modo grfico (GUI)
/SUBSYSTEM:CONSOLE gerar .exe Console
/MAP define o nome do arquivo .map que ser gerado
/LIBPATH:$(LIB_DIR)\ biblioteca que ser usada para gerar os arquivos
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. ~
As diretivas esto presentes e foram obtidas no arquivo Lab02.lst atravs do Notepad++.
DIRETIVA(linha) DESCRIO
.data (43) Reserva espao na memria, para alocar os dados;
.data? (78) Reserva espao na memria no definido, _BSS para os dados no inicializados;
.code (90) Reserva espao na memria _TEXT para o cdigo
.386 (05) Define que as instrues so de 32bits em modo protegido
.model FLAT (09) A memria alocada em um espao no segmentado de at 4Gb
-
PGINA 2
O nome dos segmentos foram obtidos no arquivo Lab02.lst, que por sua vez foi gerado
atravs do comando abaixo onde esto especificados os segmentos criados e seus tamanhos.
/Fl /As
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?
O ponto de entrada padro utilizado pelo linkador de 32 bits quando no se
define nenhum atravs da opo /ENTRY difere entre programas GUI e CONSOLE. Esses
pontos de entrada so como a seguir:
Console _mainCRTStartup
GUI _WinMainCRTStartup
DLL _ DllMainCRTStartup
A rotina de entrada se est na memria do S.O. e antes de o programa ser iniciado, inicializa
o segmento de pilha, de dados, a tarefa relacionada ao programa e os argumentos passados, para
ento pular para o ENTRY point.
5) Qual a maneira utilizada no programa Lab02 para saber se o programa do tipo CONSOLE ou
GUI?
Para descobrir se o programa CONSOLE ou GUI, o programa executa uma chamada pra a funo:
GetStdHandle
Que est presente na DLL KERNEL32.DLL, ela retorna um identificador da janela principal. Retorno for
diferente de zero indica do tipo CONSOLE, o que indica que a janela de console j est aberta. Se o
retorno for zero indica que no existe uma janela principal, de todo modo o valor retornado pela
funo comparado e e se for GUI ele continua em outro trecho do programa
;================= Incio do segmento de cdigo: ================== ;---------- Inicialmente tenta obter handle para o console: --------------- push STD_OUTPUT_H call DWORD ptr[__imp__getstdhandle@4] ; Retorna um Handle no EAX cmp eax,0 ; Compara EAX com 0, por causa do handle jz so_gui ; Pula para so_gui se o handle for 0, por causa do GetStdHandle mov out_handle, eax ; Se no for zero, salve em out_handle o contedo de eax push offset flat: MSG_CAP ;Mensagem de Boas Vindas lpCaption push offset flat: MSG_CAP ;Se for Console Seta seu Titulo call DWORD ptr[__imp__SetConsoleTitleA@4] ;retorna no EAX um handle
Listagem 1: Programa Lab02.asm - Cdigo original
-
PGINA 3
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.
NOME DLL ARQUIVO CONVENO DE CHAMADA
PARMETROS - Descrio RETORNO
__imp__MessageBoxA
USER32.DLL USER32.lib _stdcall [LPCTSTR] lpMSG Mensagem; [LPTCSTR] lpCaption Ttulo; [HWND] hWnd - Identificador da janela me da mensagem; [UINT] uType - Tipo da janela;
[INT] Identifica se o boto foi acionado
__imp__WriteConsoleA USER32.DLL USER32.lib _stdcall [HANDLE] hConsoleOutput - Identificador para o par o do banco [const VOID*] lpBuffer - Ponteiro para o Buffer; [DWORD] NumberOfCharsToWrite - Quantidade de caracteres a serem escritos. [LPDWORD] lpNumberOfCharsWritten Um ponteiro para uma varivel que indica a quantidade de caracteres escritos [LPVOID] lpReserved - Reservado, deve ser NULL.
[BOOL] Que indica se o conseguiu escrever no console, se conseguiu o retorno 1;
__imp__wsprintfA USER32.DLL USER32.lib c_call [LPCTSTR] lpFmt - Mensagem com os formatos de controle para os argumentos; [LPTSTR] lpOut - Buffer que recebe a sada formatada
[INT] Se o resultado for sucesso, retorna a quantidade de caracteres no buffer. Caso o resultado seja negativo o valor ser a quantidade esperarada de caracteres;
_imp__GetStdHandle KERNEL32.DLL KERNEL32.lib _stdcall [DWORD] hStdHandle - Dispositivo padro.
[HANDLE] Se o resultado for positivo, retorna handle para o dispositivo, caso contrrio 0;
__imp__SetConsoleTitleA KERNEL32.DLL KERNEL32.lib _stdcall [LPCTSTR] lpConsoleTitle - A String com o texto de ttulo.
[BOOL] = Se o resultado for sucesso, retorna um valor no nulo, caso contrrio retorna 0;
__imp__ExitProcess KERNEL32.DLL KERNEL32.lib _stdcall [UINT] uExitCode - Cdigo de sada para o processo e threads.
Sem Retorno
-
PGINA 4
7) Qual a diferena entre uma biblioteca esttica e uma biblioteca dinmica (DLL)? Cite vantagens e
desvantagens de cada uma.
Bibliotecas estticas so criadas a partir da unio de arquivos objeto. Quando o programa usa
biblioteca esttica o programador informa ao Linkador que ele deve usar tambm o arquivo .lib
quando for procurar pelos smbolos. Elas so unidas ao programa em tempo de compilao, diferente
das dinmicas(DLL) que so unidas ao programa em tempo de execuo. Para bibliotecas dinmicas,
s ocorre a chamada quando o programa principal estiver chamando-a (por demanda).
A vantagem da DLL sobre a biblioteca esttica que se o programa principal no cham-la, a mesma
no consome nenhum recurso do sistema, enquanto as estticas so executadas junto com o
programa. Alm do o arquivo executvel ser menor elas ocupam menos espao na RAM quando
usada tambm por outros programas, alm de uma manuteno mais simples. A vantagem da
biblioteca esttica desacopla mais o cdigo executvel da configurao do ambiente, tornando-o mais
robusto em algumas aplicaes.
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.lib /linkermember para obter uma listagem
completa dos smbolos de API's exportados por user32.lib.
O smbolo _imp_Func@xxx uma entrada para a tabela Import Address Table (IAT) e o
smbolo _Func@xxx um endereo direto. Ao utilizar uma chamada o smbolo __imp__Func@xxx o
programa vai diretamente para a funo solicitada, entretanto, ao utilizar sem o __imp__ o programa
direcionado para uma instruo do tipo jmp dword ptr [address], o que leva mais tempo de
processamento.
-
PGINA 5
;===================== Incio do segmento de cdigo: ======================
.386P ; Informa ao assemblador que sero
; utilizadas instrues de 32 bits
; em modo protegido
.model FLAT ; usado no Windows
;====Smbolos chamados por outros programs (no caso o Loader)==================
PUBLIC _meuMain
;===============Fim dos smbolos pblicos======================================
;======================= Fim do segmento de cdigo ========================
Listagem 2: Programa Lab02.asm - Smbolos Pblicos
;==================== Incio do segmento de cdigo: =======================
;====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 USER32.LIB
EXTERN __imp__SetConsoleTitleA@4:NEAR ;est em
KERNEL32.DLL
EXTERN __imp__ExitProcess@4:NEAR ;
EXTERN __imp__WriteConsoleA@20:NEAR ;
;===============Fim dos smbolos
externos======================================;======================== Fim do segmento de
cdigo ========================
Listagem 3: Programa Lab02.asm - Smbolos Externos
;=================== Incio do segmento de cdigo: ========================
;===============Equates usados neste programa:=================================
AR_SIZE EQU 16 ; Tamanho mximo do array
CR EQU 0DH ; Retorno de Carro
LF EQU 0AH ;Mudana de linha
STD_OUTPUT_H EQU -11 ; a constante
que vai ser passada para a ;funo GETSTD HANDLE
MB_OK EQU 0 ;usado na MSGBOX
MB_YESNO EQU 4H ;usado na MSGBOX
MB_ICONQUESTION EQU 20H
ID_YES EQU 6H
ID_NO EQU 7H
;===============Fim dos equates================================================
;========================== Fim dos Equates ===============================
;===================== Fim do segmento de cdigo ===========================
Listagem 4: Programa Lab02.asm - Equates
-
PGINA 6
;=================== Incio do segmento de cdigo: ========================
;===============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_INI BYTE 'bem vindo ao programa Lab 02!', CR, LF, 0H
MSG_CAP BYTE 'programa lab02 v 20.0', 0H
MSG_FIB BYTE 'O TERMO FIBONACCI DE INDICE %02d VALE %04d', CR, LF,
'CONTINUAR????', CR, LF, 0H ;string de
formato
;===============Fim do segmento de dados inicializados ========================
Listagem 5: Programa Lab02.asm Dados inicializados
;===================== Incio do segmento de cdigo: ======================
;=============== Segmento de dados no inicializados: =====================
.data? ; Diretiva inicia o segmento
Fibo DWORD AR_SIZE DUP (?) ; Array com AR_SIZE
elementos
Str_Fibo BYTE 100 DUP (?) ;usado para
escrever os val. calculados
dwWritten DWORD ? ; Quantidade de caracteres
no escritos
;============= Fim do segmento de dados no inicializados =================
;======================== Fim do segmento de cdigo =======================
Listagem 6: Programa Lab02.asm Dados no inicializados
;====================== Incio do segmento de cdigo: =====================
;==================== 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] ; Retorna um Handle no EAX
cmp eax,0 ; Compara EAX com 0, por causa do handle
jz so_gui ; Pula para so_gui se o handle for 0, por causa
do ;GetStdHandle
mov out_handle, eax ; Se no for zero, salve em out_handle o contedo
de eax
-
PGINA 7
;----------- Se for console seta seu ttulo: ------------------------------
;----------- Mensagem de boas vindas no console: --------------------------
push offset flat: MSG_CAP ;Mensagem de Boas Vindas lpCaption
push offset flat: MSG_CAP ;Se for Console Seta seu Titulo
call DWORD ptr[__imp__SetConsoleTitleA@4] ;retorna no EAX um handle
;========================= Fim do segmento de cdigo ======================
Listagem 7: Programa Lab02.asm Incio do cdigo
;===================== Incio do segmento de cdigo: ======================
;------------ Mensagem de boas vindas via MessageBox: ---------------------
so_gui: ; agora as boas vindas GUI:
push 0 ;uTipe = 0
push offset flat: msg_cap
push offset flat: msg_ini
push 0 ;hwindow = 0 , o prprio desktop
call dword ptr [__imp__MessageBoxA@16]
;-----------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
loopstart:
;-----------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 loopstart ; fica em loop at esgotar ecx
;-----------Fim do loop de fibonacci controlado por ecx -------------------
;========================== Fim do segmento de cdigo =====================
Listagem 8: Programa Lab02.asm Segunda parte do cdigo
;====================== Incio do segmento de cdigo: =====================
;-----------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: -------------------------
loopfibo:
;-----------Formata prximo valor da array em uma string: -----------------
;---------- Verifica a existncia do console: -----------------------------
-
PGINA 8
push eax
push ebx
push offset flat: MSG_FIB
push offset flat: str_Fibo
call DWORD ptr[__imp__wsprintfA]
add esp, 16
test out_handle, 0FFFFFFFFh ; verifica se todos os bits do out_handle forem zero ele pula
para jz
jz so_gui_2 ;ele pula para a regio gui_2
;----------------- Escrita do valor da sequncia no console: --------------
;----------- Escrita do valor da sequncia no console: --------------------
Push 0H
push offset flat: dwWritten
push sizeof MSG_FIB
push offset flat: str_Fibo
push DWORD ptr out_handle
call DWORD ptr[__imp__WriteConsoleA@20]
push MB_YESNO OR MB_ICONQUESTION
push offset flat: MSG_CAP
push offset flat: MSG_FIB
push 0 ;hwindow = 0 , o
prprio desktop
call DWORD ptr[__imp__WriteConsoleA@20]
cmp eax, ID_NO
je fim
;========================= Fim do segmento de cdigo ======================
Listagem 9: Programa Lab02.asm Terceira parte do cdigo
;=================== Incio do segmento de cdigo: ========================
;----------- Escrita do valor da sequncia em uma MsgBox YESNO: -----------
push MB_YESNO or MB_ICONQUESTION ; uType
push offset flat: MSG_CAP ; lpCaption
push offset flat: Str_Fibo ; lpMSG
push 0 ; hWnd
call dword ptr [__imp__MessageBoxA@16] ;chamada MsgBox
cmp eax,ID_NO
je fim
so_gui_2:
inc ebx ; Incrementa
dec edi ; Decrementa
jnz loopfibo ; se contador 0 fica em loop
;---------------- Fim do loop de mostrar resultados: ---------------------
-
PGINA 9
fim:
;----------------- Mensagem de despedida: ---------------------------------
;-----------Encerramento do programa: -------------------------------------
push 0 ;joga um zero na pilha
call DWORD ptr[__imp__ExitProcess@4]
_meuMain ENDP ; fechamento da procedure
;========================= Fim do segmento de cdigo ======================
Listagem 10: Programa Lab02.asm Parte final cdigo
;====================== Incio do segmento de cdigo: =======================
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#
# EL66C - Arquitetura e Organizao de Computadores
#
# Makefile para gerar o programa Lab02.exe a partir de Lab02.asm
# 2a. Aula de Laboratrio
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#opes para assemblar para .obj no formato coff 32 bits:
AFLAGS=/c /coff /Fl /Zi /Sa
#opes para linkar o executvel a partir do .obj:
LFLAGS=/entry:meuMain \
/RELEASE \
/DEBUG \
/MAP
LIBS=USER32.LIB KERNEL32.LIB
# Especificao do Linker de 32 bits a ser utilizado:
LNK32=link
.asm.obj:
$(AS) $(AFLAGS) $<
;========================== Fim do segmento de cdigo =======================
Listagem 11: Programa Makefile Definies do Makefile
-
PGINA 10
;==================== Incio do segmento de cdigo: ======================
# Especificao do Linker de 32 bits a ser utilizado:
LNK32=link
.asm.obj:
$(AS) $(AFLAGS) $<
#Primeiro alvo
nada: info
#Segundo alvo - GUI
Lab02w.exe: Lab02.obj
$(LNK32) $(LFLAGS) /SUBSYSTEM:WINDOWS /OUT:$*.exe Lab02.obj $(LIBS)
#Terceiro alvo - console
Lab02c.exe: Lab02.obj
$(LNK32) $(LFLAGS) /SUBSYSTEM:CONSOLE /OUT:$*.exe Lab02.obj $(LIBS)
#Pseudo target ALL
all: Lab02w.exe Lab02c.exe
#Pseudo target para fornecer algumas informaes sobre a utilizao:
info:
@echo **************** UTILIZAO: *****************************
@echo * Programa criado por Ismael e Marco
@echo * makefile para gerar o programa Lab02.exe
@echo *
@echo * Menu:
@echo *
@echo * nmake ............. - Visualizar as informaes
@echo * nmake Lab02w.exe ...- Gerar GUI
@echo * nmake Lab02c.exe ...- Gerar CONSOLE
@echo * nmake Lab02all ...- Gerar AMBAS
@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
;======================= Fim do segmento de cdigo =======================
Listagem 12: Programa Makefile