Software Básico
Silvio Fernandes2009.1
Universidade Federal Rural do Semi-ÁridoDepartamento de Ciências Ambientais
Ciência da Computação
Aula 06: Funções Básicas dos Assemblers
1
Assemblers• Existem algumas funções essenciais que todos os
assemblers devem executar, como a tradução dos mnemônicos de código de operações nos seus equivalentes em linguagem de máquina, e a designação de endereços de máquina aos labels simbólicos utilizados pelo programador
• Se avançarmos em um nível mais baixo, as características e o projeto de um assembler passarão a depender fortemente da linguagem-fonte que ele traduz e da linguagem de máquina que ele produz
2
Assemblers
• Utilizaremos um programa exemplo para estudar essas características
• O número das linhas servem apenas como referência
• O endereçamento indexado é indicado pela inclusão do modificador “X”
• Linhas com “.” são linhas de comentário
3
Assemblers
• Utilizaremos as seguintes diretivas do assembler:– START: especifica o nome e o endereço inicial do
programa– END: indica o fim do programa-fonte e (opcionalmente)
especifica a primeira instrução executável do programa– BYTE: gera uma constante alfanumérica ou hexadecimal,
ocupando tantos bytes necessários– WORD: gera uma cte. Inteira de uma palavra– RESB: reserva o no. indicado de bytes para uma área de
dados– RESW: reserva o no. indicado de palavras para uma área
de dados
4
Assemblers
5
Assemblers
6
Assemblers
7
Assemblers• A rotina principal lê registros de um dispositivo
de entrada (cód. F1) e os copia para um dispositivo de saída (cód. 05). Chama uma sub-rotina RDREC para ler um arquivo e armazená-lo num buffer, e a sub-rotina WRREC que transfere o registro do buffer para o dispositivo de saída
• O fim de cada registro é indicado por um caracter nulo (hexadecimal 00)
• O fim do arquivo será indicado por um registro de comprimento 0, que será informado pelo programa através do cód. de fim de arquivo (EOF)
8
Um assemblers simples para o SIC
• A figura a seguir mostra o programa anterior acompanhado do código-objeto de cada instrução
• A coluna Pos. fornece o endereço (em hexa) de cada parte do programa montado
• A tradução do programa-fonte em código-objeto nos obriga a executar as seguintes funções (mas não necessariamente nesta ordem):
9
Um assemblers simples para o SIC
1. Converter os mnemônicos nos equivalentes em ling. de máquina. Ex: STL para 14 (l. 10)
2. Converter operandos simbólicos em end. Máquina. Ex: RETADR para 1033 (l. 10)
3. Montar as inst. de máq. no formato correto4. Converter constante nas representações
internas. EX: EOF para 45F46 (l. 80)5. Escrever o programa-objeto e sua listagem
10
Um assemblers simples para o SIC• Todas as funções, exceto a 2, podem ser
executadas com facilidade• Por isso a maioria dos assemblers faz 2
passagens pelo programa-fonte• O assembler também tem que processar as
diretivas do assembler que não são instruções de máquina, elas atuam sobre o próprio assembler
• Por fim, o assembler tem que gravar o código-objeto em algum dispositivo de saída para ser carregado na memória antes de ser executado
11
Um assemblers simples para o SIC
12
Um assemblers simples para o SIC
13
Um assemblers simples para o SIC
• O formato simples do programa-objeto tem 3 registros: Header (cabeçalho), Texto e End (Fim)
– Header: contém o nome do programa, o endereço inicial e o tamanho
– Texto: contém as instruções traduzidas e os dados do programa, com os endereços onde devem ser carregados
– Fim: assinala o final do programa-objeto e especifica o endereço do programa onde a execução deve ser iniciada
14
Um assemblers simples para o SIC
15
Um assemblers simples para o SIC
• Na figura o símbolo ^ é usado para separar os campos visualmente mas não aparecem no programa-objeto
• Funções do nosso assembler– Passagem 1 (define os símbolos)
1. Associa endereços a todas as instruções2. Guarda os valores (endereços) associados aos labels3. Executa parte do processamento das diretivas do
assembler
16
Um assemblers simples para o SIC
• Funções do nosso assembler– Passagem 2 (monta as instruções e gera o
programa-fonte)1. Monta as instruções (traduzindo os cód. de operação
e procurando os endereços)2. Gera os valore de dados definidos por BYTE, WORD...3. Processa as diretiva não tratadas na 1ª passagem4. Escreve o programa-objeto e a listagem definitiva do
programa
17
As tabelas e a lógica do assembler
• Nosso assembler simples usa 2 tabelas– OPTAB (Tabela de Código de Operação)
• Localiza os mnemônicos dos códigos de operação e os traduz em código equivalente na ling. máquina
– SYMTAB (Tabela de Símbolos)• Armazena os valores (endereços) atribuídos aos labels
• Variável LOCCTR (Contador de Posições)– Inicializada com o endereço inicial (START), auxilia na
designação de endereços– O tamanho da instrução processada é somado a
LOCCTR
18
As tabelas e a lógica do assembler
• OPTAB costuma ser organizada como uma hash table tendo o mnemônico como chave
• Normalmente OPTAB é uma tabela estática• A SYMTAB contém o nome e o endereço de
cada label, juntamente com flags que indicam condições de erro. Também pode conter informações sobre tipo, tamanho das áreas de dados ou das instruções associadas aos labels
19
As tabelas e a lógica do assembler• SYMTAB também é organizada em uma hash
para tornar mais eficiente a inclusão e recuperação de dados
• É importante que a função hashing escolhida funcione bem com chaves não aleatórias (LOOP1, LOOP2, LOOPA...)
• Geralmente a 1ª passagem cria um arquivo intermediário contendo todas as instruções originais juntamente com os endereços associados a cada uma, os indicadores de erro, etc, que serve de entrada para a 2ª passagem
20
Algoritmo para a Passagem 1
21
Algoritmo para a Passagem 2
22
Referências
• Leland L Beck.. “Desenvolvimento de software básico”. 2ª ed. Rio de Janeiro: Campus, 1993. 525p.
23