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:
- Endereçamento por registrador: O identificador do registrador indica onde o operando se encontra.
Ex: add 1 2 3
- 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
- Imediato ou Constante: O operando é uma constante indicada na própria instrução.
Ex: addi 1 2 200
- 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)