·

Ciência da Computação ·

Linguagens de Programação

Envie sua pergunta para a IA e receba a resposta na hora

Texto de pré-visualização

UNIVERSIDADE FEDERAL DA PARAÍBA CENTRO DE INFORMÁTICA DISCIPLINA Arquitetura de Computadores I PROFESSOR Ewerton Monteiro Salvador ESPECIFICAÇÃO DE TRABALHO COM LINGUAGEM ASSEMBLY O programa especificado abaixo deverá ser implementado utilizandose a linguagem Assembly no Windows ou no Linux O trabalho será individual e deverá ser enviado pelo SIGAA até as 2359h do dia 07062022 O objetivo deste projeto é escrever um programa simples porém eficiente para gerenciamento de notas de alunos de uma turma e cálculo de médias desses respectivos alunos Inicialmente o programa deve apresentar as seguintes opções para o usuário Digite a opção desejada 1 Incluir notas de aluno max 40 alunos 2 Exibir medias da turma 3 Sair do programa Sempre que o usuário selecionar 1 ele deve informar o nome de um aluno max de 14 caracteres seguido de 3 notas de 0 a 10 pontoflutuante O programa deve aceitar novas inclusões até um máximo de 40 alunos Qualquer tentativa de inclusão após 40 alunos deve gerar uma mensagem na console informando que o limite de alunos foi atingido Quando o usuário selecionar a opção 2 deve ser calculada as médias de todos os alunos com essas médias sendo gravadas na memória Em seguida deve ser exibida uma lista com os nomes dos alunos as 3 notas parciais e a média Por fim a opção 3 deve encerrar o programa em execução Um programa deve ser implementado utilizando Assembly para Windows MASM32 ou para Linux NASM O cálculo das médias deve fazer uso de instruções SSE Streaming SMID Extensions como estratégia para otimização do programa Dessa forma será possível a realização de cálculos sobre vários conjuntos de dados em uma única instrução ex somar 4 pares de notas ao mesmo tempo com uma instrução Informações complementares são fornecidas na próxima página dessa especificação incluindo informações sobre instruções para cálculo com números de pontoflutuante e informações sobre instruções SSE No caso de implementação com MASM32 devem ser utilizadas as funções de entrada e saída do Windows readConsole writeConsole etc de modo que a macro printf deve ser evitada existe uma vídeoaula ensinando como utilizar essas funções no MASM No caso do NASM devem ser utilizadas as funções da biblioteca de entradasaída padrão da linguagem C printf scanf etc O trabalho deve ser desenvolvido de forma individual O código implementado deve ser original não sendo permitidas cópias de códigos inteiros ou trechos de códigos de outras fontes exceto quando expressamente autorizado pelo professor da disciplina Boa sorte INFOMAÇÕES COMPLEMENTARES SOBRE INSTRUÇÕES SSE Nesta seção são apresentadas algumas informações introdutórias sobre instruções SSE em processadores da Intel outras informações devem ser pesquisadas por conta própria ou perguntadas diretamente ao professor O conjunto de instruções SSE Streaming SMID Extensions da Intel foi criado para permitir que operações lógicas e aritméticas fossem paralelizadas dentro do processador Intel através do uso de registradores vetoriais No contexto deste projeto as instruções SSE deverão ser utilizadas para acelerar a realização das somas e divisões necessárias para o cálculo das médias dos alunos As instruções SSE utilizam registradores chamados XMM xmm0 a xmm7 que são registradores de 128 bits capazes de armazenar 4 números de ponto flutuante de precisão simples 4 bytes cada ou 2 números de ponto flutuante de precisão dupla 8 bytes cada São necessárias instruções especiais para carregar um conjunto de números de ponto flutuante da memória para os registradores XMM esse processo se chama empacotamento dos números ou packing Analogamente essa instrução também pode fazer o processo reverso ou seja carregar números de registradores XMM para a memórian Consideremos o exemplo abaixo para o NASM section data numeros1 dd 10 20 30 40 Declaracao de vetor com 4 pontosflutuantes de precisao simples numeros2 dd 50 60 70 80 Outro vetor com 4 pontosflutuantes de precisao simples resultado times 4 dd 00 saida db O numero eh 2f 0AH 0H section code movups xmm0 OWORDnumeros1 Carrega vetor de 4 floats de precisao simples em xmm0 movups xmm1 OWORDnumeros2 Carrega vetor de 4 floats de precisao simples em xmm1 addps xmm0 xmm1 Soma os 4 floats de cada vetor ao mesmo tempo Resultado em xmm0 movups OWORDresultado xmm0 No código acima é demonstrado o uso da instrução movups para empacotar 4 números de pontoflutuante de precisão simples 4 bytes nos registradores xmm0 e xmm1 Em seguida é utilizada a instrução addps para somar o conteúdo dos dois registradores vetoriais e salvar o resultado no registrador mencionado no primeiro operando desta instrução A operação de divisão no conjunto de instruções SSE está implementada na instrução divps resultado é armazenado no primeiro operando A palavra reservada OWORD vem de octa word é usada para acessos de 16 bytes 128 bits à memória No MASM a palavra reservada é OWORD PTR variavel Para imprimir números de ponto flutuante com o NASM é necessário primeiramente transformar esse número de precisão simples para precisão dupla pois f espera um número de precisão dupla Isso pode ser feito através das instruções abaixo da FPU Float Point Unit do processador fld DWORDresultado Carrega primeiro numero do vetor resultado na FPU Numero de precisao simples fstp QWORDesp Coloca numero na variável paraimprimir no topo da pilha push saída call printf Para o MASM32 a impressão do número de ponto flutuante deve utilizar a função FloatToStr da biblioteca masm32lib que converte um numero REAL8 ou QWORD em uma string invoke FloatToStr resultado offset paraimprimir