Um Conjunto de Softwares Básicos Integrados para Arquitetura SIC/XE Argemiro Soares de Aliança Neto, Sílvio Roberto Fernandes de Araújo Departamento de Ciências Exatas e Naturais - DCEN Universidade Federal Rural do Semi-Árido -UFERSA Av. Francisco Mota, 572 Bairro Pres. Costa e Silva CEP 59.625-900 - Mossoró - RN [email protected], [email protected] Abstract. The study of basic softwares include the study of compilers, assemblers, linkers and loaders, as well as their target architecture. SIC architecture is approached in this paper for its importance in basic software courses. However, testing SIC architecture based softwares is complicated because there is not a real machine model. This paper suggests an SIC and an SIC/XE simulator able to read an object program of this “instructional machine” and to show the step-by-step execution of each instruction; along with this simulator, an assembler, a memory controller and a linking and loader are presented, thus eliminating the problem of the absence of a real machine model Resumo. O estudo dos softwares básicos inclui o estudo de compiladores, assemblers, linkers e loaders, além da arquitetura alvo de tais softwares básicos. Utilizamos a arquitetura SIC no desenvolvimento deste trabalho pela sua importância em cursos de software básico. Entretanto, os testes de softwares em arquitetura SIC apresentam a dificuldade de não possuirem um modelo real da máquina. O presente artigo propõe um simulador da arquitetura SIC e SIC/XE capaz de ler um programa em formato objeto dessa “máquina didática” e mostrar passo-a-passo a execução de cada instrução; juntamente com este simulador, são apresentados um montador de arquivos objeto, um controlador de memória e um link/loader, eliminando o problema da ausência de um modelo real. 1. Introdução Softwares básicos se diferenciam dos softwares aplicativos devido a sua dependência com relação à máquina em que será executado. Softwares básicos têm como objetivo possibilitar a operação e o uso da máquina seja qual for a aplicação utilizada. Eles possuem uma relação muito próxima com o equipamento no qual devem ser executados. Dentre os principais softwares básicos conhecidos estão os compiladores, montadores (do inglês assemblers), ligadores (linkers), carregadores (loaders), sistemas operacionais etc [Aho 2008]. [Beck 1993] propôs o computador didático simplificado (SIC - Simplified Instructional Computer), que apesar de ser uma máquina hipotética, possui a maioria das características das reais e oi proposta para fins didáticos no estudo de softwares básicos. Além da arquitetura, [Beck 1993] apresenta o assembly da máquina e discute a implementação de um assembler e um linking loader, em suas versões standard e extended. Apesar de todos os detalhes para implementação dos softwares básicos da arquitetura proposta, há ainda uma grande dificuldade para testar a funcionalidade dos softwares desenvolvidos, uma vez que não existe um modelo real da arquitetura. Desse modo, este artigo propõe um simulador da arquitetura SIC e SIC/XE obedecendo ao conjunto de instruções, ao banco de registradores e aos modos de endereçamento da memória para visualizar o estado da arquitetura durante a execução de programas. Tal simulador é uma ferramenta para auxílio dos desenvolvedores de softwares básicos para a arquitetura SIC e SIC/XE. A primeira versão interpretava o código em assembly [Aliança Neto 2010]. A nova versão simula a execução de um programa em formato binário do SIC e SIC/XE permitindo visualizar o estado de cada registrador, da memória e dados importantes da instrução a ser executada. A ferramenta também inclui um montador capaz de gerar um programa objeto equivalente ao programa escrito em assembly. O artigo está organizado da seguinte forma: a seção 2 faz a descrição do montador, a seção 3 apresenta o link/loader, a seção 4 o controlador de memória, a seção 5 o simulador e a seção 6 apresenta as considerações finais. 2. O Montador O montador recebe como entrada um código assembly compatível com a plataforma e tem como saída um código objeto executável com as mesmas funcionalidades do programa original. O arquivo objeto contém todas as informações necessárias para a correta identificação, carga na memória, endereçamento, carga de bibliotecas externas e execução do programa. O arquivo objeto é dividido em, no máximo, seis seções. Cada seção tem uma funcionalidade específica, como segue: Header: contém o nome do programa, o tamanho do código objeto, e o endereço de carga na memória. Esse último também indica se o programa deve ser alocado em uma posição específica ou em qualquer posição disponível (relocável); Definitions: tem a proposta de publicar variáveis internas para serem acessadas por outros programas. Essa seção é opcional; References: indica bibliotecas e/ou variáveis externas usadas no programa. Essa seção é opcional; Text: contém as instruções, variáveis e ponteiros para os dispositivos de entrada e saída. De fato, somente os dados desta seção são carregados na memória; Modifiers: armazena informações para ajuste do endereçamento de memória em programas relocáveis e link com bibliotecas externas. Essa seção é opcional; End: marca o fim do código executável e indica em que posição de memória está o primeiro código executável do programa. O montador cria arquivos executáveis em formato binário. Para facilitar o entendimento do processo, são criados adicionalmente um arquivo assembly e um ASCII. O primeiro contém o código original e o resultado da montagem. O segundo o código objeto em formato ASCII para cada seção do programa original. A Figura 1(a) mostra um exemplo de arquivo binário e a Figura 1(b) mostra o equivalente em padrão ASCII. Figura 1. Exemplo de programa objeto em binário e em ASCII A montagem de programas SIC Standard têm características diferentes do padrão SIC/XE. O simulador provê opção de montagem e execução nos dois padrões. Foi adicionado ao código objeto um byte que indica o fim de cada linha representada no código objeto em ASCII para eliminar a ambiguidade existente entre os cabeçalhos e os dados da seção, no entanto, o mesmo não é carregado na memória no momento da execução. 3. O Link/Loader O link/loader é o software básico responsável, basicamente, pela carga do programa na memória, suas dependências (outros programas ou bibliotecas) e resolução dos endereços de memória. O link/loader armazena informações importantes sobre os programas que estão sendo carregados na memória, tais como: nome, tamanho, posição de alocação e uma tabela de variáveis externas com seus respectivos endereços. Tais informações são necessárias para evitar que um mesmo programa seja alocado duas vezes, como realizar a desalocação de memória e para que as variáveis públicas do programa sejam acessíveis por outros programas. Ao realizar a carga de um programa, se uma biblioteca ou variável externa é referenciada no programa então o link/loader a procura primeiramente na lista de programas carregados, se não a encontra procura no mesmo diretório do programa que está sendo carregado, caso ainda não encontre o usuário é questionado para informar o endereço do arquivo. Na alocação do programa é feita uma solicitação de memória ao controlador de memória de acordo com o tamanho do programa informado na seção Header do arquivo objeto. Caso não haja memória disponível para a carga do programa ou as posições de memória necessárias para a carga de programas não-relocáveis se encontram ocupadas o programa não é carregado e uma mensagem de erro é mostrada. 4. O Controlador de Memória O controlador de memória gerencia todo acesso à memória, seja para leitura ou para escrita. O controlador fornece acesso à memória e trabalha de forma semelhante à E/S programada [Stallings 2000], onde uma solicitação é feita fornecendo o endereço inicial e a quantidade de bytes a serem lidos ou escritos, no último caso também é fornecido o valor a ser lido. O controlador mantém também as chaves de acesso à memória, disponíveis na arquitetura SIC/XE. Um gerenciador de alocação de memória baseado em mapa de bits [Tanenbaum 2007] foi implementado para alocação contínua. Ao receber uma solicitação de alocação o controlador verifica no mapa se há memória disponível e então retorna a posição da alocação. Na desalocação somente o mapa de bits é alterado, os dados continuam na memória. 5. O Simulador O simulador une todas as ferramentas desenvolvidas em um ambiente com interface gráfica completa, onde o usuário poderá montar programas objeto e executá-los no mesmo ambiente. Verificando o passo-a-passo da execução. O software simulador foi desenvolvido em C#, baseado nas tecnologias mais avançadas do .NET Framework 4, sendo compatível apenas com o Sistema Operacional Windows, nas versões Windows Vista e posteriores. 5.1 Funcionamento Básico 5.1.1 Modos de Operação O sistema tem dois modos de operação, “Passo-a-passo” ou “Contínuo”, disponíveis no menu Executar. No modo contínuo deverá ser informado o tempo de passo em milissegundos na barra de tarefas de controle de execução. Esse tempo indica quanto tempo o sistema fica em espera entre a execução de duas instruções. No modo passo-apasso o botão “play”deverá ser acionado para cada execução de instrução. 5.1.2 Fluxo Normal de Trabalho O usuário seleciona o arquivo do programa através do menu ArquivoExecutar Programa Objeto, o modo de operação e executa o programa com o “Play”. Caso queira pausar, clica em “Pause” e “Play” para retornar. Caso queira abortar, clica em “Stop”. Ao executar uma instrução os valores alterados nos flags, registradores e na memória são indicados através de uma animação onde o campo alterado fica com o segundo plano verde por alguns instantes, como na Figura 2. Figura 2. Tela do simulador em execução No campo Offset da memória o usuário pode definir um valor em hexadecimal a partir do qual o campo de memória irá mostrar os valores. 5.1.3 Programas que usam E/S Se o programa a ser executado utiliza dispositivos de E/S então o arquivo contendo os dados que serão lidos dos dispositivos de entrada deve ser carregado. A carga pode ser logo após a carga do programa através do menu Arquivo Carregar arquivo de dados. Nesse caso, um arquivo contendo o registro dos dispositivos de E/S também deve ser carregado no menu Configurar Carregar E/S. 5.1.4 O Montador de Arquivos Objeto O arquivo a ser montado pode ser carregado no menu Arquivo Montar arquivo objeto. O usuário pode escolher entre montagem para objeto SIC padrão ou SIC/XE no menu Configurar Montador SIC Compatível, selecionando para a primeira opção. O arquivo a ser montado deverá estar no formato “*.asm” e ser compatível com o assembly do SIC ou SIC/XE. Os arquivos montados serão salvos com o nome do programa constante no assembly e não com o nome do arquivo lido. Caso haja seções no programa cada seção é salva em um arquivo diferente com o nome respectivo da seção. Temos também a opção de salvar o arquivo original com os códigos de montagem produzidos pelo montador. Nesse caso, o nome do arquivo será “NOME_DO_PROGRAMA MONTADO.asm”. 6. Considerações Finais O simulador da arquitetura SIC/XE foi implementado em C# usando .NET Framework, permitindo a visualização do estado de cada registrador, dos flags da ULA e da memória durante a execução de cada instrução de um programa objeto em formato binário compatível com a arquitetura. São disponibilizados dois modos de execução: passo-a-passo ou contínuo. A ferramenta ainda permite a geração do código objeto no formato especificado por [Beck 1993]. Trabalhos futuros incluem a animação das linhas indicadoras de fluxo de acordo com sequencia dos eventos, a utilização de um desmontador de código objeto para exibir todas as instruções do programa sendo executado em formato assembly com animação de transição entre as instruções e a disponibilização do aplicativo com manual de operação na WEB. Referências Aho, Alfred V. et al (2008), Compiladores: princípios, técnicas e ferramentas, Addison Wesley, 2ª. edição. Aliança Neto, Argemiro S. de; Araújo, Silvio R. F. (2010) “Um Simulador Didático para a Arquitetura SIC/XE”, In: I Workshop Técnico Científico de Computação. Beck, Leland L (1993), Desenvolvimento de Software Básico, Campus, 2ª edição . Microsoft (2010). URL: www.microsoft.com/windows/. Acessado: set. 2010. Tanenbaum, Andrew S. (2007). Sistemas Operacionais Modernos, Prentice Hall, 2ª edição. Stallings, William (2000). Computer Organization and Architecture, Prentice Hall, 5ª edição.