Fundamentos de Arquiteturas de Computadores

Aula de laboratório - Programação em linguagem de montagem

Arquitetura do conjunto de instruções

O processador hipotético apresentado em sala de aula possui as seguintes características:

  1. palavra de 32 bits
  2. 8 registradores de 32 bits com os respectivos identificadores: 0,1,2,3,4,5,6,7, sendo que o registrador 0 armazena o valor constante 0
  3. capacidade máxima de endereçamento de 65536 palavras de memória
  4. instruções de 32 bits

O conjunto de instruções desta máquina é composto de 8 instruções:

Instrução em Linguagem de Montagem

Ação

add regA regB destreg

soma o conteúdo do registrador regA com o conteúdo de regB e armazena resultado no registrador destreg

addi regA regB imediato

soma o conteúdo do registrador regA com o valor imediato e armazena resultado no registrador regB

lw regA regB deslocamento

carrega no registrador regB o conteúdo da palavra da memória cujo endereço é a soma do conteúdo do registrador regA com o valor deslocamento

sw regA regB deslocamento

armazena o conteúdo do registrador regB na palavra da memória cujo endereço é a soma do conteúdo do registrador regA com o valor deslocamento

beq regA regB deslocamento

caso os conteúdos dos registradores regA e regB sejam iguais, vai para o endereço PC+1+deslocamento, onde PC é o endereço da instrução beq

halt

incrementa o valor de PC e para execução do programa

noop

incrementa o valor de PC e vai para próxima instrução


As instruções possuem 32 bits e são codificadas da seguinte maneira:

Instrução em Linguagem de Montagem

Código de operação

add regA regB destreg

000

addi regA regB imediato

001

lw regA regB deslocamento

010

sw regA regB deslocamento

011

beq regA regB deslocamento

100

halt

110

noop

111

Simulador

O programa SimulaPC traduz um programa escrito na linguagem de montagem especificada acima e simula sua execução na máquina hipotética. Para utilizar esta ferramenta, um programa deve ser escrito na linguagem de montagem, carregado e traduzido pela ferramenta. Após esta tradução o programa poderá ser executado diretamente ou no modo passo a passo. O simulador sempre carrega o programa a partir do endereço 0.

O formato de cada linha de programa deve ser o seguinte:

 
label<espaço>instrução<espaço>campo 0<espaço>campo 1<espaço>campo 2<espaço>comentários

O campo mais à esquerda deve ser o campo label que deve conter no máximo 6 caracteres e pode conter letras ou números e sempre começar por letra.O campo label é opcional, mas o espaço após este campo é necessário.

Para cada tipo de instrução os campos 0, 1 e 2 são utilizados de forma diversa:

O último campo deve ser utilizado para comentários do programa.

Além das instruções, um programa escrito em linguagem de montagem pode conter diretivas para o montador do programa. A única diretiva utilizada neste simulador é a diretiva

.fill <valor numérico ou label>

que indica ao montador que um valor numérico deve ser colocado no lugar onde seria colocada uma instrução. Esta diretiva utiliza um único campo que pode ser um valor numérico ou um label.

Como utilizar o simulador

Para utilizar o simulador você deve salvar em um diretório o arquivo SimulaPC.exe que contém o código executável do simulador.

O programa prog1.asc mostrado abaixo soma os valores 5 e 10 e coloca o resultado no registrador 3.

 
     addi 0 1 5
     lw   0 2 val
     add  1 2 3
     halt
val  .fill 10
 

Você irá utilizar o simulador para traduzir este programa para linguagem de máquina e simular sua execução. Para isto, execute o simulador SimulaPC.exe. Carregue o programa prog1.asc, através da opção Arquivo, Carregar Arquivo Fonte.... O arquivo fonte deverá aparecer na janela Código-Fonte. Para traduzir este programa para linguagem de máquina, escolha a opção CPU, Traduzir. Na janela intitulada Saída, será colocado o resultado da tradução, indicando se foram encontrados erros no arquivo fonte.

Caso o programa tenha sido traduzido com sucesso, verifique o código gerado pelo montador mostrado na janela Display e confirme se o código gerado está correto.

Agora, você irá executar o programa passo a passo. Escolha a opção CPU, Executar Passo-a-Passo. O simulador mostra o conteúdo dos 8 registradores e de dois outros registradores: Contador de Instruções que indica o endereço da instrução a ser executada e Registrador de Instruções que contém a instrução.

Execute uma instrução de cada vez, clicando o botão Executar ao lado da janela Display e verifique como o conteúdo dos registradores é modificado.

Questão 1:

Mostre como o programa deve ser modificado de modo que ele some 15 com 20. Utilize o simulador para verificar se seu programa está funcionando.

Questão 2:

Mostre como o programa deve ser modificado de modo que o resultado da soma seja armazenado em uma posição de memória depois da posição da linha "val". Utilize o simulador para verificar se seu programa está funcionando.

Implementação de laços

O comando em C

(for i=4;i>0;i--);

inicia a variável i com o valor 4, testa se ela é maior que 0 e em caso positivo decrementa o valor de i e volta a testá-lo. Em caso negativo, o próximo comando depois deste será executado.

Supondo que a variável i esteja alocada ao registrador 1, o programa prog2.asc mostrado abaixo implementa este comando:

 
      addi 0 1 4
ini   beq 0 1 fim
      addi 1 1 -1
      beq 0 0 ini
fim   halt
 

Carregue este programa na ferramenta, traduza e executa passo a passo para entender o seu funcionamento.

Questão 3:

A partir do código acima, crie um programa para executar o seguinte código em C:

 
int x,i;
x=3;
for (i=5;i>0;i--)
   x=x+2;
 

Este trecho de programa utiliza as variáveis x e i do tipo inteiro e ao final de sua execução a variável x terá o valor 13. Considere que a variável x está alocada ao registrador 2 e a variável i ao registrador 1.