Conjunto de instruções de linguagem de montagem

Cada registrador possui um conjunto de bits associado a ele:

  • 0=000
  • 1=001
  • 2=010
  • 3=011
  • 4=100
  • 5=101
  • 6=110
  • 7=111
 
add regA  regB destreg
destreg=regA+regB
 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9  8  7  6  5  4  3  2  1  0
------------------------------------------------------------------------------------------------
|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  | 
------------------------------------------------------------------------------------------------
31-25 = 0 
24-22=código de operação=000
21-19=regA
18-16=regB
15-3=0
2-0=destreg
 
lw regA regB deslocamento
regB=Mem[regA+deslocamento]
 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9  8  7  6  5  4  3  2  1  0
------------------------------------------------------------------------------------------------
|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  | 
------------------------------------------------------------------------------------------------
31-25 = 0 
24-22=código de operação=010
21-19=regA
18-16=regB
15-0=deslocamento expresso em C2 (16 bits: -32768 a +32767)
 
sw regA regB  deslocamento
Mem[regA+deslocamento]=regB
 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9  8  7  6  5  4  3  2  1  0
------------------------------------------------------------------------------------------------
|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  | 
------------------------------------------------------------------------------------------------
31-25 = 0 
24-22=código de operação=011
21-19=regA
18-16=regB
15-0=deslocamento expresso em C2 (16 bits: -32768 a +32767)
 

Programa em C:

 
while (A[i] != k)
  i=i+j;

Supondo i alocada no registrador 1, j em 2, k em 3 e endereço inicial de A em 4:
Programa em linguagem de montagem:

 
Loop  add 4 1 5
      lw  5 5 0
      beq 5 3 EXIT
      add 1 2 1
      beq 1 1 Loop
EXIT 
 

Formato das instruções:

 
beq regA regB label
 
 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9  8  7  6  5  4  3  2  1  0
------------------------------------------------------------------------------------------------
|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  | 
------------------------------------------------------------------------------------------------
31-25 = 0 
24-22=código de operação=100
21-19=regA
18-16=regB
15-0=deslocamento expresso em C2 (16 bits: -32768 a +32767)-vai para PC+1+deslocamento

Outras operações:

 
addi regA regB imediato 
regB=regA+imediato
 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9  8  7  6  5  4  3  2  1  0
------------------------------------------------------------------------------------------------
|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  | 
------------------------------------------------------------------------------------------------
31-25 = 0 
24-22=código de operação=001
21-19=regA
18-16=regB
15-0=valor imediato expresso em C2 (16 bits: -32768 a +32767)
 
addi 5 6 5
31-25 = 0 
24-22=código de operação=001
21-19=5=101
18-16=6=110
15-0=5=00000000000000101
 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9  8  7  6  5  4  3  2  1  0
------------------------------------------------------------------------------------------------
| 0| 0| 0| 0| 0| 0| 0| 0| 0| 1| 1| 1| 0| 1| 0| 1| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 1| 0| 1| 
------------------------------------------------------------------------------------------------
 
halt 
 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9  8  7  6  5  4  3  2  1  0
------------------------------------------------------------------------------------------------
|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  | 
------------------------------------------------------------------------------------------------
31-25 = 0 
24-22=código de operação=110
21-0=0
 
noop 
 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9  8  7  6  5  4  3  2  1  0
------------------------------------------------------------------------------------------------
|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  | 
------------------------------------------------------------------------------------------------
31-25 = 0 
24-22=código de operação=111
21-0=0
 

Exemplo:
Programa em C:

 
for (i=0; i< 9; i++)
  A[i]=A[i+1];
A[9]=0;
 

Tradução para linguagem de montagem:
Supondo i alocada no registrador 1 e endereço inicial de A no registrador 2, teremos o seguinte código:

 
      addi 0 1 0       inicializa i com o valor 0
      addi 0 3 9       inicializa variável de controle do loop com valor 9
FOR   beq 1 3  SAI     verifica se i < 9
      add 1 2 4        obtém endereço de A[i]
      addi 4 5 1       obtém endereço de A[i+1]
      lw 5 5 0         obtém elemento A[i+1]
      sw 4 5 0         armazena A[i+1] em A[i]
      addi 1 1 1       incrementa i
      beq 0 0 FOR
SAI   sw 2 0 9         armazena 0 em A[9]

Modos de endereçamento

Os operandos das instruções da linguagem de montagem utilizada podem ser acessados através dos seguintes modos:

  1. Endereçamento por registrador: O identificador do registrador indica onde o operando se encontra.
    Ex: add 1 2 3
  2. Endereçamento por base ou deslocamento: O operando se encontra em um endereço de memória formado pela soma do conteúdo de um registrador e uma constante que são indicados na instrução.
    Ex: lw 1 2 100
  3. Imediato ou Constante: O operando é uma constante indicada na própria instrução.
    Ex: addi 1 2 200
  4. Endereçamento relativo ao PC: O operando é um endereço formado pela soma do valor atual do PC e um valor constante especificado na instrução.
    Ex: beq 1 1 5 ( A próxima instrução a ser executada está no endereço PC+1+5)