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 |
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 |
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:
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.
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 10Você 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.
(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 haltCarregue este programa na ferramenta, traduza e executa passo a passo para entender o seu funcionamento.
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.