Você está na página 1de 10

Universidade Tecnolgica Federal do Paran

Arquitetura e Organizao de Computados


Antonio Gortan
Relatrio Laboratrio 1 - Lab B
Alunos:
Jeferson Fernandes da Silva - 913553
Vinicius de Souza Pinheiro - 1215396

1) Explique, de forma sucinta e objetiva, a operao do programa Fibo_32.


Resposta:
O programa fibo_32 calcula os 16 primeiros nmeros da sequencia de Fibonacci. An_1
e An_2 so duas variveis alocadas e inicializadas com os dois primeiros termos da sequencia.
AR_SIZE incivilizada com o valor 16, e N_termos recebe o valor de AR_SIZE. O registrador
ecx recebe o valor de N_termos, eax recebe An_1, ebx recebe An_2 e edi recebe o endereo
para iniciar o array. Comea um loop e o valor de eax salvado na pilha, eax e ebx so
somados para ter o prximo termo e armazenado na prxima posio do array, ebx recebe o
valor antigo na pilha e ecx decrementado at atingir o valor zero que quando se encerra o
loop.
2) Escreva a sequncia de bytes (em hexadecimal) necessria para codificar, em linguagem de
mquina, a instruo mov ecx, xxxxxx, onde xxxxxxx representa o seu nmero de matrcula.
(Voc pode consultar o manual, ou, ento, modificar o programa Fibo_32.asm para conter essa
instruo, assembl-lo e verificar o resultado na listagem produzida pelo assemblador
(extenso .lst). Ou, ainda, linkar o programa modificado, gerando um executvel, e ento,
carregando-o no WinDbg, verificar a codificao em linguagem de mquina).
Resposta:
No codigo, definimos MATRICULA EQU 1215396, que o numero de matricula do
aluno Vinicius, e aps o label meuMain, adicionamos mov ecx, [MATRICULA]. Seguimos os
passos para gerar os arquivos e na extenso .lst a instruo codificada passa a ser: B9
00128BA4

3) Explique para que serve, e como funciona, a instruo de linguagem assembly stosd
utilizada no programa.
Resposta:
A instruo STOSD armazena um dword, word ou byte a partir do registrador AL, AX ou
EAX para um local na memria que o destino do operando. Cada endereo lido pelo
registrador ES:EDI se for 32 bits ou ES:DI se for 16 bits. Se o flag estiver em clear ele ira
incrementar, se o flag estiver em set ele ira decrementar. Utilizando o stosd e dword
armazenado em eax e drecrementado ou incrementado por 2 ou 4.

4) Explique como funciona a instruo jnz utilizada no programa. Ela opera em conjunto com
qual registrador da CPU? De que forma especificado o endereo de destino do salto no caso
dessa instruo?
Resposta:
A funo jnz, jump if not zero, executa um salto se o valor do flag ZF seja 1, isso mostra
que a ultima operao aritmtica teve resultado igual a zero. Opera junto com o bit 6 do
registrador EFLAG, um valor de 8, 16 ou 32 bits deve ser passado como parmetro e somado
ao PC, para a instruo de salto. passado o endereo relativo da funo destino em relao
a atual.

5) Explique a finalidade de cada uma das opes utilizadas com o assemblador (ml.exe), a
saber: /c, /coff, /Fl e /Zi para gerar o mdulo objeto Fibo_32.obj.
Resposta:
/c = diz para o assemblador assemblar sem linkar.
/coff = diz para o assemblador criar um object file de formato coff, que preciso para o
linkador criar um programa com memria linear.
/FI = diz para criar um arquivo ouvinte que dar informaes do object code que foi
criado.
/Zi = diz para incluir informaes de depurao simblica no object code. Informao
que permite rastrear a execuo do programa sob um depurador enquanto vemos o cdigo
original.

6) Explique a finalidade de cada uma das opes utilizadas com o linkador (link.exe), a saber: /
entry, /subsystem, /release, e /debug (observe que, diferentemente das opes do MASM, as
opes do linker no so sensveis caixa).
Resposta:
/ENTRY: Especifica uma funo de entrada como endereo de entrada para um arquivo
.exe ou .dll, no caso meuMain.

/SUBSYSTEM: Especifica o ambiente para o executvel. Utiliza-se o parmetro


WINDOWS para GUI e CONSOLE para console.
/RELEASE: Inclui um Checksum (Soma de Verificao, auxilia na verificao da
integridade do arquivo) no executvel gerado.
/DEBUG: Tem como objetivo incluir informaes de debug no executvel gerado.
7) Explique para que serve e como funciona o arquivo Lab01_1s15.bat.
Resposta:
Lab01_1s15.bat serve para indicar o endereo da pasta onde est o assemblador e o
linker. @ECHO off diz para o console no imprimir as instrues executadas pelo arquivo.
PATH=\link32 indica o caminho da pasta e os programas que sero chamados, e o arquivo
bat inicializado com o console pelo parmetro /Klab01_1s15.bat adicionado nas
propriedades do atalho.

8) Altere o programa Fibo_32 para que calcule a maior quantidade possvel de termos da srie
de Fibonacci, de tal maneira que o maior termo ainda possa estar contido em uma posio de
memria de 32 bits. Relate o que foi necessrio fazer.
Resposta:
Foi alterado o valor de AR_SIZE para 64, e adicionado o comando jc que verifica se o
valor de CF=1, excedendo o valor de 32 bits, se verdadeiro termina o loop.

9) Altere o arquivo makefile fornecido pelo professor para que gere um programa Fibo_32 do
tipo GUI (Graphical User Interface) em vez de CUI (Console User Interface). Relate o que foi
necessrio fazer.
Nas #opes para linkar o executvel a partir do .obj: (LFLAGS) deve-se mudar o tipo
de subsystem de CONSOLE para WINDOWS = /SUBSYSTEM:WINDOWS \

.386P
.model FLAT
;---Smbolos chamados por outros programs (no caso o Loader)------------------PUBLIC
_meuMain
;---------------Fim dos smbolos pblicos-------------------------------------;---------------Equates usados neste programa:--------------------------------AR_SIZE
EQU
16
; Tamanho mximo do array
;---------------Fim dos equates-----------------------------------------------;---------------Segmento de dados incializados:-------------------------------.data
An_2
DWORD
0H
; Valor inicial para An-2
An_1
DWORD
1H
; Valor inicial para An-1
N_Termos
DWORD
AR_SIZE
; Quantidade mxima de termos do array
;---------------Fim do segmento de dados inicializados -----------------------;---------------Segmento de dados no incializados:---------------------------.data?
Fibo
DWORD AR_SIZE DUP (?)
; Array com AR_SIZE elementos
;---------------Fim do segmento de dados no inicializados -------------------;---------------Segmento de cdigo:-------------------------------------------.code
_meuMain
PROC NEAR
; abertura da procedure
mov ecx, N_Termos
; ecx = contador de nmero 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 vai p/ 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 controlado por ecx -------------------------------ret

; encerrando o programa...

_meuMain
ENDP
; fechamento da procedure
;---------------Fim do segmento de cdigo-------------------------------------END
Listagem 1: Programa Fibo_32 Procedimento principal

.386P
.model FLAT
;---Smbolos chamados por outros programs (no caso o Loader)------------------PUBLIC
_meuMain
;---------------Fim dos smbolos pblicos-------------------------------------;---------------Equates usados neste programa:--------------------------------AR_SIZE
EQU
16
; Tamanho mximo do array
MATRICULA
EQU
1215396
;---------------Fim dos equates-----------------------------------------------;---------------Segmento de dados incializados:-------------------------------.data
An_2
DWORD
0H
; Valor inicial para An-2
An_1
DWORD
1H
; Valor inicial para An-1
N_Termos
DWORD
AR_SIZE
; Quantidade mxima de termos do array
;---------------Fim do segmento de dados inicializados -----------------------;---------------Segmento de dados no incializados:---------------------------.data?
Fibo
DWORD AR_SIZE DUP (?)
; Array com AR_SIZE elementos
;---------------Fim do segmento de dados no inicializados -------------------;---------------Segmento de cdigo:-------------------------------------------.code
_meuMain
PROC NEAR
; abertura da procedure
mov ecx, [MATRICULA]
; ecx = contador de nmero 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 vai p/ 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 controlado por ecx -------------------------------ret

; encerrando o programa...

_meuMain
ENDP
; fechamento da procedure
;---------------Fim do segmento de cdigo-------------------------------------END
Listagem 2: Programa Fibo_32 modificado para questo 2

.386P
.model FLAT
;---Smbolos chamados por outros programs (no caso o Loader)------------------PUBLIC _meuMain
;---------------Fim dos smbolos pblicos-------------------------------------;---------------Equates usados neste programa:--------------------------------AR_SIZE
EQU
64
; Tamanho mximo do array
foi mudado de 16 para 64
;---------------Fim dos equates-----------------------------------------------;---------------Segmento de dados incializados:-------------------------------.data
An_2
DWORD 0H
; Valor inicial para An-2
An_1
DWORD 1H
; Valor inicial para An-1
N_Termos
DWORD
AR_SIZE
; Quantidade mxima de termos do array
;---------------Fim do segmento de dados inicializados -----------------------;---------------Segmento de dados no incializados:---------------------------.data?
Fibo
DWORD AR_SIZE DUP (?)
; Array com AR_SIZE elementos
;---------------Fim do segmento de dados no inicializados -------------------;---------------Segmento de cdigo:-------------------------------------------.code
_meuMain
PROC NEAR
; abertura da procedure
mov ecx, N_Termos
; ecx = contador de nmero 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
jc veri
; verifica o flag do carry, se
excede 32 bits
stosd
; eax=An vai p/ 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 controlado por ecx -------------------------------veri:
pop ebx
;resgata An_1 da pilha para ebx
ret
; encerrando o programa...
_meuMain
ENDP
; fechamento da procedure
;---------------Fim do segmento de cdigo-------------------------------------END

Listagem 3: Programa Fibo_32 modificado para questo 8

#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#
# EL66C - Arquitetura e Organizao de Computadores
#
# Makefile para gerar o programa Fibo_32.exe a partir de Fibo_32.asm
# 1a. Aula de Laboratrio
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#opes para assemblar para .obj no formato coff 32 bits:
AFLAGS=/c /coff /Fl /Zi
#opes para linkar o executvel a partir do .obj:
LFLAGS=/ENTRY:meuMain \
/SUBSYSTEM:CONSOLE \
/RELEASE \
/DEBUG
# Especificao do Linker de 32 bits a ser utilizado:
LNK32=link
# Finalmente nosso target:
Fibo_32.exe:Fibo_32.obj
$(LNK32) $(LFLAGS) $*.obj
#Esta uma regra de inferncia para assemblar de .asm para .obj:
#experimente coment-la para ver se o NMAKE tem uma regra parecida
#embutida que pode utilizar no lugar desta.
.asm.obj:
$(AS) $(AFLAGS) $<
#Pseudo target para fornecer algumas informaes sobre a utilizao:
info:
@echo **************** UTILIZAO: *****************************
@echo * Universidae Tecnologica Federal do Parana
@echo * Arquitetura e Organizao de Computadores
@echo * Alunos:
@echo * Jeferson Fernandes da Silva - 913553
@echo * Vinicius de Souza Pinheiro - 1215396
@echo *
@echo * makefile para gerar o programa Fibo_32.exe
@echo *
@echo * digite:
@echo *
@echo * nmake ............. - para gerar Fibo_32.exe
@echo * nmake Fibo_32.exe . - idem acima
@echo * nmake clean ....... - para limpar os arquivos gerados
@echo * nmake info ........ - para ver esta tela de informaes
@echo *
@echo **********************************************************
#Pseudo target para deixar o diretrio no estado inicial:
clean:
-@del *.exe
-@erase *.obj
-@erase *.lst
-@erase *.pdb
Listagem 4: Programa Makefile Procedimento Principal

#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#
# EL66C - Arquitetura e Organizao de Computadores
#
# Makefile para gerar o programa Fibo_32.exe a partir de Fibo_32.asm
# 1a. Aula de Laboratrio
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#opes para assemblar para .obj no formato coff 32 bits:
AFLAGS=/c /coff /Fl /Zi
#opes para linkar o executvel a partir do .obj:
LFLAGS=/ENTRY:meuMain \
/SUBSYSTEM:WINDOWS \
/RELEASE \
/DEBUG
# Especificao do Linker de 32 bits a ser utilizado:
LNK32=link
# Finalmente nosso target:
Fibo_32.exe:Fibo_32.obj
$(LNK32) $(LFLAGS) $*.obj
#Esta uma regra de inferncia para assemblar de .asm para .obj:
#experimente coment-la para ver se o NMAKE tem uma regra parecida
#embutida que pode utilizar no lugar desta.
.asm.obj:
$(AS) $(AFLAGS) $<
#Pseudo target para fornecer algumas informaes sobre a utilizao:
info:
@echo **************** UTILIZAO: *****************************
@echo * Universidae Tecnologica Federal do Parana
@echo * Arquitetura e Organizao de Computadores
@echo * Alunos:
@echo * Jeferson Fernandes da Silva - 913553
@echo * Vinicius de Souza Pinheiro - 1215396
@echo *
@echo * makefile para gerar o programa Fibo_32.exe
@echo *
@echo * digite:
@echo *
@echo * nmake ............. - para gerar Fibo_32.exe
@echo * nmake Fibo_32.exe . - idem acima
@echo * nmake clean ....... - para limpar os arquivos gerados
@echo * nmake info ........ - para ver esta tela de informaes
@echo *
@echo **********************************************************
#Pseudo target para deixar o diretrio no estado inicial:
clean:
-@del *.exe
-@erase *.obj
-@erase *.lst
-@erase *.pdb
Listagem 5: Programa Makefile Modificado para a questo 9

Você também pode gostar