Relatório 02 Ismael & Marco

11
UNIVERSIDADE TECNOLÓGICA FEDERAL DO PARANÁ ENGENHARIA ELETRÔNICA ISMAEL DIAS MARCO ANTONIO MOREIRA RELATÓRIO 2 ARQUITETURA E ORGANIZAÇÃO DE COMPUTADORES CURITIBA

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