Sistemas de Computação
Lic. Ciências da Computação, 1º ano
2007/2008
Docente responsável: A.J.Proença

 

Projecto

Objectivos | Regulamento | Tema | Fase1, Fase2 | Submissão

Ultima Modificação: 16 Jun 2008

 

 departamento de informática

Notas

  1. Resultados da Fase 2: como se esperava, todos conseguiram ultrapassar esta 2ª fase, e ninguém ficou excluído da avaliação da componente teórica (teste ou exame), apesar de aparecerem algumas notas "negativas"; eis a pauta com os resultados.  (16-Jun-08)
  2. Submissão e defesa da Fase 2: já está disponível o processo de submissão de trabalhos para a Fase 2 na plataforma de e-learning da UM (em http://elearning.uminho.pt/), na UC de Sistemas de Computação; avisos: a data de submissão foi adiada para a meia-noite de quarta 11-Junho, e as defesas do trabalho entregue realizar-se-ão na sexta 13-Junho, 14h-17h, num laboratório do DI.  (03-Jun-08)
  3. Resultados da Fase 1: o nível geral ficou aquém do esperado e possível pela maioria dos estudantes: apenas 1 grupo teve "Bom" (ver graus no Regulamento), a grande maioria ficou com "Razoável", houve 2 grupos com "Fraco" (i.e., entre 8 e 10) e vários grupos ou elementos de grupos com "NA" (um elemento com "0, vários muito fracos com "3" e os restantes entre o "5" e o "7"); de notar que esta avaliação é apenas da Fase 1, e que esta Fase em princípio tem um peso da ordem dos 50% do total; assim, nenhum destes elementos está impedido de vir defender a 2ª fase. A excepção, pela negativa, está nos 2 grupos que deliberadamente cometeram FRAUDE, e como tal ficaram automaticamente com a classificação final de "Não Admitido" (decidi não avançar com maior penalização); eis a pauta com os resultados. (26-Mai-08)
  4. Problemas com a submissão de trabalhos: alguns colegas vossos relataram dificuldades no upload dos ficheiros a partir de algumas distribuições do Linux; recomenda-se que estejam preparados para na hora poderem submeter em sistema operativo alternativo. (06-Mai-08)
  5. Sobre o texto desta página: parte da informação ainda é provisória, e quando tal acontecer o texto aparecerá a cinza claro. (10-Abr-08)
  6. Responsabilidade do Projecto: a elaboração do texto deste projecto é da responsabilidade da equipa docente de SC, mas a apresentação do tema é da responsabilidade conjunta dos docentes das UCs Sistemas de Computação e de Programação Imperativa (a apresentação do tema em PI está em http://www.di.uminho.pt/~jcr/AULAS/pi2008/tp2/tp2-pi2008.html); este tema é inspirado em trabalhos pedagógicos desenvolvidos no DI nos anos 80 e 90 do século passado. (08-Abr-08)


Objectivos de formação e resultados de aprendizagem

Este projecto tem como objectivos principais a formação genérica e específica dos estudantes inscritos em sistemas de computação. Alguma da informação pertinente ao funcionamento deste Projecto será partilhada com o Projecto da UC a funcionar em paralelo, Programação Imperativa.

Os objectivos de formação genérica incluem: (i) a pesquisa, análise e selecção de informação, (ii) o treino de trabalho de grupo na resolução de problemas, (iii) o desenvolvimento da capacidade de análise e compreensão de textos em língua inglesa, e (iv) o desenvolvimento da capacidade de comunicação escrita e oral.

Os objectivos de formação específica incluem: (i) a análise de problemas no desenvolvimento de uma ISA orientada à stack e a especificação da solução, (ii) o desenvolvimento de ferramentas de apoio à programação em baixo nível de uma máquina virtual, (iii) a realização de testes de conformidade, e (iv) a construção parcial de um interpretador de bytecodes da máquina virtual MSP para uma dada arquitectura de computadores (IA-32).

A avaliação dos resultados esperados de aprendizagem irão verificar se as/os estudantes conseguem demonstrar ter adquirido o seguinte conjunto de competências genéricas e específicas:

 


Regulamento

Caracterização do Projecto

  1. O projecto consiste na realização de um ou mais trabalhos práticos em grupo, com entrega faseada de resultados.
  2. A não aprovação no projecto conduz à classificação de "Não Admitido" na pauta final de exame. 
  3. O projecto deverá ser submetido através da plataforma de e-learning da UM, na parte de Assignment da UC. Para mais detalhes sobre a formatação a apresentar consultar a descrição da fase.
  4. Material de apoio à produção de documentos em LaTeX, elaborado por Alberto Simões: Mini-curso de LaTeX Manual de LaTeX.
  5. Os resultados do projecto serão avaliados em 2 fases distintas ao longo do semestre: nas semanas 10 / 11 e na semana 15 (datas indicadas adiante).

O Projecto como trabalho de grupo

  1. O projecto deverá ser realizado por grupos de 3 elementos. Em casos excepcionais, devidamente justificados e aceites pelo docente responsável, será possível a realização do projecto com menos elementos.
  2. A organização, planeamento e coordenação das actividades do trabalho de grupo é da inteira responsabilidade dos seus elementos. Os slides apresentados na sessão de  apresentação de SC estão aqui disponíveis.

Metodologia de avaliação do Projecto

  1. A avaliação do projecto consiste na verificação da aquisição individual dos conhecimentos, capacidades e aptidões especificadas no enunciado do trabalho, e decorrerá num laboratório do DI.
  2. Os elementos que serão utilizados na avaliação incluem:
    1. O relatório: (i) a versão electrónica deverá ser submetida no prazo especificado, e (ii) a versão impressa deverá acompanhar o grupo durante a defesa do trabalho (quando houver).
    2. Eventual apresentação formal oral (tarefa a definir explicitamente no enunciado).
    3. O programa desenvolvido de acordo com as especificações, em condições de ser apresentado (não são admitidos erros de compilação), e respectiva bateria de testes.
    4. A defesa do trabalho junto a um computador, durante um tempo estimado de 20 min, que poderá ser individual ou em grupo.
  3. Calendário para a entrega dos relatórios em formato electrónico:
    1. Fase 1, quarta, 07-Mai-08, 12h00.
    2. Fase 2, segunda, 09-Jun-08, 12h00
  4. Calendário para a realização das defesas dos trabalhos:
    1. Fase 1: sexta 09-Mai-08 (14h00-17h00) e durante a semana seguinte (em dia e hora a combinar)
    2. Fase 2: no horário das sessões laboratoriais, na semana de 09-Jun-08 (as sessões de terça, feriado, são transferidas para quarta 11-Jun-08, 14h00 - 17h00)
  5. A ordem de defesa dos trabalhos é coincidente com a ordem de inscrição dos grupos, e será atempadamente divulgada.
  6. A classificação final do projecto será, em princípio, por patamares, sendo os definidos para SC os seguintes:
  7. Os pesos relativos da avaliação de cada uma das fases em SC são os seguintes:
    1. Fase 1: 45% .
    2. Fase 2: 55% .
  8. Para cada uma das fases de avaliação do projecto os grupos serão atempadamente informados do seu desempenho, com feedback adequado para melhorarem os seus resultados, de acordo com um modelo de classificação similar.
  9. A classificação individual final será um valor de compromisso entre a classificação obtida pelo grupo no projecto e a impressão individual que cada elemento produziu nas equipas de examinadores e a opinião manifestada por todos os elementos do grupo de trabalho.
  10. Caso sejam detectadas situações fraudulentas (desde plágio de outro grupo ou de um outro qualquer local, a comportamento fraudulento de um dos elementos do grupo), as partes envolvidas ficarão sujeitas a acções ou procedimentos disciplinares seguindo a hierarquia institucional e de acordo com a gravidade demonstrada. Recomenda-se a leitura do documento de reflexão produzido na sequência das irregularidades ocorridas em 2004/05, em que vários estudantes comprometeram a sua carreira de estudante com a reprovação às 2 disciplinas que na altura integravam o projecto (para além dos procedimentos disciplinares).
  11. Dúvidas que surjam na sequência de ambiguidades ou lacunas no enunciado do projecto e/ou deste regulamento, deverão ser colocadas ao docente responsável, preferencialmente por email. Quando necessário, o esclarecimento dessas situações far-se-á por inclusão de um aviso na página Web da disciplina.

 

Topo...


Tema: "Mais Simples Possível (MSP)"

Introdução

O tema escolhido para este projecto foi o da criação de uma Virtual Stack Machine (VSM), mais concretamente:

A VSM poderá ser programada em assembly usando uma notação muito simples definida para este contexto, o MSP.
O MSP é uma linguagem simples, com um número de instruções reduzido e com uma sintaxe e uma semântica bastante acessíveis. Como se verá mais à frente, a VSM não tem registos visíveis ao programador e recorre a uma stack para a realização das operações lógicas e aritméticas.
A existência de um assembler que monte em binário (o bytecode) um programa "executável" (para posterior execução numa VSM em plataforma IA-32,  por ex.), poderá ser um dos resultados do projecto paralelo em Programação Imperativa.

Este trabalho será dividido em duas fases:

Arquitectura da VSM

Numa VSM podem-se identificar os seguintes blocos (representados na figura em baixo):

Arquitectura da VSM

 

Cada célula de memória (na MProg, MDados ou na Stack) tem capacidade para armazenar um byte e está associada a um endereço que a identifica univocamente.
Um endereço é um número inteiro sem sinal, representado com 16 bits.
A gama de endereços possíveis na VSM está no intervalo [0, 64k[ (i.e., em [0, 65535] ).
O byte que é armazenado em determinada célula de memória pode representar uma instrução, parte de um argumento de uma instrução, parte de um valor inteiro (representado por 16 bits, em complemento para 2), parte de um carácter, parte de um valor Booleano (Verdadeiro ou Falso) ou um componente de um endereço.

A interpretação do significado de cada byte depende da memória que está a ser acedida:

Para um programa ser executado, o IP é carregado com o endereço de MProg onde está a primeira instrução a ser executada e entra-se no seguinte ciclo de funcionamento da VSM: buscar a próxima instrução (apenas 1 byte), actualizar o IP para ficar a apontar para a célula seguinte, descodificar a instrução (se forem precisos mais bytes, vai-se buscar um de cada vez, actualizando-se logo o IP), e executar a operação especificada no opcode com o(s) operando(s) especificados na resto da instrução (se os houver).
Este processo continua até que seja executada a instrução que manda parar a execução do programa.
 

Linguagem MSP

A sintaxe e semântica da linguagem MSP contém referências às componentes de código e de dados. A informação no sítio de PI (http://www.di.uminho.pt/~jcr/AULAS/pi2008/tp2/tp2-pi2008.html) contém informações sobre a componente de dados, que poderão não ser relevantes para SC (se forem, serão posteriormente inseridas aqui). Assim, apenas iremos incluir aqui a lista das instruções disponíveis no MSP.

O conjunto das instruções do MSP pode ser dividido em três grupos de acordo com as respectivas funcionalidades: (i) instruções para movimentação de valores e endereços, (ii) operações aritméticas e lógicas, e (iii) instruções de controlo da sequência de execução do programa.

**********Movimentação de valores e endereços**********

LOAD
Retira da Stack um endereço da MDados e vai buscar o conteúdo dessa posição de memória e da seguinte, para colocar no topo da Stack
STORE
Retira da Stack um valor, depois um endereço, e coloca na posição da MDados referente ao endereço, o valor retirado inicialmente da Stack
PUSH [valor]
Coloca o valor de 16 bits no topo da Stack; tem como objectivo introduzir uma constante (valor imediato) no VSM
IN
Coloca no topo da Stack o conteúdo da posição especial input, resultante da leitura de um valor inteiro via teclado
OUT
Retira do topo da Stack um valor e coloca-o na posição especial output, para escrever no monitor esse valor como inteiro
INC
Coloca no topo da Stack o conteúdo da posição especial input, resultante da leitura de um um carácter via teclado, em que o byte com o código ASCII foi colocado na célula com endereço menor
OUTC
Retira do topo da Stack um valor e coloca-o na posição especial output, para escrever no monitor o carácter cujo código ASCII se encontra na célula com o endereço menor
**********Operações aritméticas e lógicas**********
 
ADD
Retira dois inteiros da Stack , soma-os e coloca na Stack o resultado
SUB
Retira dois inteiros da Stack , subtrai o valor do segundo operando (no topo da Stack) ao do primeiro e coloca na Stack o resultado
MUL
Retira dois inteiros da Stack , multiplica-os (resultado em 16 bits) e coloca na Stack o resultado
DIV
Retira dois inteiros da Stack , divide o primeiro pelo segundo e coloca na Stack o quociente (truncado)
ADDA
Retira da Stack um inteiro (em complemento para 2) e um endereço (um valor sem sinal); soma o inteiro ao endereço, calculando um novo endereço (um valor sem sinal), que é por fim colocado na Stack
AND
Retira dois inteiros da Stack , calcula a sua conjunção lógica e coloca na Stack o resultado (equivalente ao operador && em C)
OR
Retira dois inteiros da Stack , calcula a sua disjunção lógica e coloca na Stack o resultado (equivalente ao operador || em C)
NOT
Retira um inteiro da Stack , calcula a sua negação lógica e coloca na Stack o resultado (equivalente ao operador ! em C)
EQ
Retira dois inteiros da Stack , verifica se são iguais e coloca na Stack o resultado da comparação (Verdadeiro ou Falso)
NE
Retira dois inteiros da Stack , verifica se são diferentes e coloca na Stack o resultado da comparação (Verdadeiro ou Falso)
LT
Retira dois inteiros da Stack , verifica se o primeiro é menor que o segundo e coloca na Stack o resultado dessa comparação 
LE
Retira dois inteiros da Stack , verifica se o primeiro é menor ou igual que o segundo e coloca na Stack o resultado dessa comparação
GT
Retira dois inteiros da Stack , verifica se o primeiro é maior que o segundo e coloca na Stack o resultado dessa comparação
GE
Retira dois inteiros da Stack , verifica se o primeiro é maior ou igual que o segundo e coloca na Stack o resultado dessa comparação
ANDB
Retira dois inteiros da Stack , calcula a sua conjunção bit a bit e coloca na Stack o resultado (equivalente ao operador & em C)
ORB
Retira dois inteiros da Stack , calcula a sua disjunção bit a bit e coloca na Stack o resultado (equivalente ao operador | em C)
NOTB
Retira um inteiro da Stack , calcula a sua negação bit a bit e coloca na Stack o resultado (equivalente ao operador ~ em C)

Observação: nas operações binárias (com 2 operandos), sempre que se refere ao 1º e ao 2º operando, o 1º é o que foi primeiro colocado na Stack , e o 2º é que foi colocado por último.

**********Controlo do fluxo de execução**********

JMP [id-label ou endereço ou endereço-relativo]
Salta incondicionalmente para o endereço calculado a partir do argumento (i.e., coloca em IP esse endereço); a execução do programa continua com o código armazenado no endereço da MProg especificado por id-label, ou no endereço (em valor absoluto relativo ao início da MProg) ou somando ao IP o endereço-relativo passado como argumento; neste último caso, o valor do argumento deverá obrigatoriamente conter o sinal + ou - antes do valor numérico
JMPT [id-label ou endereço ou endereço-relativo]
Retira o valor no topo da stack e testa-o (assumindo que lá está um valor Booleano): se for Verdadeiro (True) salta para o endereço calculado a partir do argumento; se for Falso a execução continua na instrução apontada pelo valor do IP
CALL [id-label ou endereço ou endereço-relativo]
Guarda na stack o endereço da instrução que se lhe segue (i.e., o valor de IP) e prossegue com um salto incondicional para o endereço calculado a partir do argumento (i.e., invoca incondicionalmente uma subrotina)
RET
Regressa da subrotina: a execução do programa continua na instrução que está no endereço que é retirado do topo da Stack
HALT
Pára a execução do programa
NOOP
Não faz nada, serve apenas para gastar tempo...
Observação: a instrução HALT deve ser usada para terminar os programas.
 

Formato binário das instruções MSP

O código executável da VSM é constituído por sequências de bytes (o bytecode), cujo formato binário do opcode é o seguinte:
  • 3 primeiros bits, 000 se fôr uma instrução de apenas 1 byte, 100 se necessitar de um argumento (2 bytes adicionais);
  • 5 bits menos significativos, (XXX YY)
 XXX \  YY 00 01 10 11
000 ADD SUB MUL DIV
001 AND OR NOT EQ
010 ANDB ORB NOTB NE
011 LE LT GE GT
100 ADDA LOAD STORE RET
101 IN INC OUT OUTC
110 PUSH JMPR JMP CALL
111 NOOP JMPRT JMPT HALT

Observação: as instruções de salto com a letra "R" no fim indicam que são um salto para um endereço relativo, distinção que não é feita na linguagem MSP.
 

Topo...

 


Fase 1

Objectivo funcional da Fase1:

Analisar uma linguagem assembly (MSP) e desenvolver um programa que desmonte o bytecode de programas da VSM (i.e., um disassembler).

Descrição mais detalhada das tarefas da Fase1 (lista das Oobrigatórias e das Vopcionais/valorativas):

  1. OCompletar a especificação da linguagem MSP, construindo uma tabela contendo o mesmo tipo de informação que a tabela disponibilizada no fim do Anexo C da documentação entregue no início do semestre (em ISC). Esta tabela deverá ser entregue em formato electrónico, na versão original em que for feita (LaTeX, Word, ...) e em PDF.
  2. OConstruir um disassembler do bytecode da VSM: elaborar em C um "comando" Linux com funcionalidade semelhante a "objdump -d <nome_ficheiro> > <nome_ficheiro_resultado>", o qual deverá ser invocado com a seguinte sintaxe: vsmobjdump -d <nome_ficheiro> [-o <nome_ficheiro_resultado>]. Deverão ser entregues os ficheiros contendo o código fonte, a makefile, o ficheiro_resultado e o código executável. Para se ter uma ideia do pretendido, eis o exemplo de um programa em MSP (não é o código fonte pretendido!), o executável correspondente, e o que se espera ter como ficheiro_resultado.
  3. OValidar o código do disassembler com os ficheiros de teste disponibilizados (com vários graus de validação): grau1, grau2 e grau3. Apresentar uma listagem dos códigos desmontados para cada um dos testes.
  4. VAnalisar o código dos testes e tentar com reverse engineering, obter o possível código fonte em C que teria originado esses ficheiros de teste. Apresentar o resultado num ficheiro de texto.
  5. VPropor um novo programa de teste do disassembler e apresentar: (i) um texto curto explicitando que funcionalidades são testadas, (ii) a versão em C do programa de teste, (iii) a versão em MSP do mesmo programa e (iv) uma listagem do executável do mesmo programa, em binário.
  6. OElaborar um relatório de grupo, máx. 2 páginas, contendo as seguintes informações: (i) curso/UC/ano lectivo, (ii) identificação da Fase do projecto, (iii) identificação dos membros da equipa, (iv) estratégia de divisão de trabalho pelos membros do grupo e grau de responsabilização de cada elemento, e (v) análise crítica do tema do projecto e da sua realização nesta fase.

Informação adicional:
 - a realização das tarefas obrigatórias é indispensável para admissão a exame;
 - o conjunto de documentos solicitados obrigatórios (relatório de grupo, tabela nos 2 formatos, ficheiros do disassembler, e listagem do código desmontado) deverá ser entregue em formato compactado ZIP, num único ficheiro, com a seguinte designação:
<SC08_leader>, em que leader é o nº do coordenador do grupo;
 - a tarefa 5 (e apenas esta) pode ser entregue para avaliação individual, num outro ficheiro compactado com a seguinte designação:
<SC08V_nºaluno>.


 

Topo...

 


Fase 2

Objectivo funcional da Fase2:

O desenvolvimento de uma máquina virtual, o SVM, que interprete o bytecode de um programa, e que gere e execute, de modo controlado, o correspondente código  IA-32.

Descrição mais detalhada das tarefas da Fase2 (lista das Oobrigatórias e das Vopcionais/valorativas):

  1. OConstruir uma máquina virtual com depurador, para execução do bytecode da VSM: elaborar em C um "comando" Linux inspirado no gdb, o qual deverá ser invocado com a sintaxe vsmdb <nome_ficheiro> e suportar os seguintes comandos:
    1. disas: desmontar o bytecode, i.e., aproveitar o código desenvolvido na Fase1 e integrá-lo aqui.
    2. init [size_Stack]: inicializar a execução de qualquer bytecode, terminando também alguma execução prévia do bytecode; se o size_Stack não fôr explicitado, assume que a Stack irá ter reservado 4k bytes de células; prepara as estruturas de dados internas do MSP, inicializando a MProg com o bytecode do ficheiro indicado, a MDados com as variáveis globais do programa, o IP com o valor 0, o SP com o valor adequado, e INPUT e OUTPUT inicializado a 0.
    3. stepi: equivalente ao stepi do gdb; executa apenas uma instrução do bytecode, e no fim mostra no monitor a instrução MSP que acabou de executar.
    4. print <arg>: mostra no monitor o valor em decimal do conteúdo de 16-bits especificado em <arg>; este pode ser um dos seguintes valores: IP / SP / INPUT / OUTPUT / MProg_address / MData_address / Stack_address; a notação para estes endereços é a mesma que no gdb.
    5. printx <arg>: semelhante ao anterior, mas mostra no monitor o valor em hexadecimal.
    6. xb <arg1>, <arg2>: examina o conteúdo de MProg, MDados ou Stack , mostrando no monitor, em hexadecimal, o conteúdo de <arg1> bytes a partir do endereço especificado em <arg2>.
    7. xv <arg1>, <arg2>: semelhante ao anterior, mas examina conjuntos de <arg1> valores de 16-bits, considerando que este se encontra armazenado em little-endian.
  2. VEnriquecer o vsmdb <nome_ficheiro> com os seguintes comandos:
    1. run: semelhante ao gdb; executa o bytecode depois de inicializado, até encontrar um breakpoint ou até encontrar a instrução halt.
    2. break <MProg_address>: semelhante ao gdb.
    3. delete <arg>: semelhante ao gdb;
  3. OTestar o funcionamento da máquina virtual com os ficheiros de teste disponibilizados (com vários graus de validação): grau1, grau2 e grau3. Analisar:
    1. O conteúdo dos registos IP e SP bem como das células da MDados e da Stack que foram afectadas com a instrução, após a execução de cada instrução do bytecode; esta tarefa deverá ser feita usando os comandos de vsmdb e será avaliada na defesa oral da Fase2.
    2. O código assembler gerado pelo gcc para a interpretação de cada uma das instruções do MSP presentes no bytecode; esta tarefa será avaliada na defesa oral da Fase2.
  4. OEntregar os ficheiros contendo o código fonte e a makefile.
  5. VAnalisar o código assembly IA-32 gerado pelo compilador para o controlo de execução do bytecode passo a passo, e apresentar uma listagem com a parte desse código, devidamente anotado, que implementa a execução de pelo menos 3 instruções presentes nos códigos fornecidos (uma de transferência de informação, outra aritmética e outra de controlo de fluxo de execução) .
  6. OElaborar um relatório de grupo, máx. 2 páginas, contendo as seguintes informações: (i) curso/UC/ano lectivo, (ii) identificação da Fase do projecto, (iii) identificação dos membros da equipa, (iv) estratégia de divisão de trabalho pelos membros do grupo e grau de responsabilização de cada elemento, e (v) análise crítica do tema do projecto e da sua realização nesta fase.

Informação adicional:
 - a realização das tarefas obrigatórias é indispensável para admissão a exame;
 - o conjunto de documentos solicitados obrigatórios (relatório de grupo e listagem do código desenvolvido) deverá ser entregue em formato compactado ZIP, num único ficheiro, com a seguinte designação: <SC08_leader>, em que leader é o nº do coordenador do grupo.
 

 

Topo...

 


Submissão

Na plataforma de e-learning da UM, na UC de Sistemas de Computação (pode ser acedido por aqui).

 

Topo...

 


Conteúdo da responsabilidade de Alberto Proença, José Carlos Ramalho e João Barbosa.
Página mantida por aproenca@di.uminho.pt
Ultima Modificação: 16 Jun 2008