O que esse programa faz?...
Linguagem de Montagem
Assembly Rudimentar
Prof. João Paulo A. Almeida
([email protected])
2007/01 - INF02597
Com slides de
Roberta Lima Gomes e Camilo Calvi
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CONB 1
SAVEB 228
CONB 1
SAVEB 229
LOADA 228
CONB 5
COM
JGE 17
LOADA 229
LOADB 228
MUL
SAVEC 229
LOADA 228
CONB 1
ADD
SAVEC 128
JUMP 4
STOP
Reposta
Reposta
// Assumir i no endereço 228
// Assumir f no endereço 229
0 CONB 1
// i=1;
1 SAVEB 228
2 CONB 1
// f=1;
3 SAVEB 229
4 LOADA 228 // if i >= 5 jump to 17
5 CONB 5
6 COM
7 JGE 17
8 LOADA 229 // f=f*i;
9 LOADB 228
10 MUL
11 SAVEC 229
12 LOADA 228 // i=i+1;
13 CONB 1
14 ADD
15 SAVEC 228
16 JUMP 4
// loop back to if
17 STOP
// Assumir i no endereço 228
// Assumir f no endereço 229
0 CONB 1
// i=1;
1 SAVEB 228
2 CONB 1
// f=1;
3 SAVEB 229
4 LOADA 228 // if i >= 5 jump to 17
5 CONB 5
6 COM
7 JGE 17
8 LOADA 229 // f=f*i;
9 LOADB 228
10 MUL
11 SAVEC 229
12 LOADA 228 // i=i+1;
13 CONB 1
14 ADD
15 SAVEC 228
16 JUMP 4
// loop back to if
17 STOP
Unidade Central de Processamento - CPU
(6)
Unidade Central de Processamento - CPU
(8)
• Formato das Instruções
Código da Instrução
(OpCode)
–
–
–
–
Operando - Op
(Informação Complementar)
OpCode: identifica a instrução a ser efetuada
Op: identifica sobre o que (quem) a instrução manipulará
Existem instruções de 1, 2 ou 3 operandos
O tamanho do OpCode indica o número máximo de instruções da
máquina.
• n bits => até 2n instruções
– Ciclo de Instrução: conjunto de operações realizadas pelo
computador para completar a execução de uma instrução
CPU Genérica
1
Unidade Central de Processamento - CPU
(10)
Unidade Central de Processamento - CPU
•
• Caminho de Dados
– Registradores
– ULA
– Controlado pela UC
•
• A velocidade do ciclo
do caminho de dados
(Ciclo de Instrução)
determina, em última
análise, a velocidade
do processador.
Unidade Central de Processamento - CPU
•
(11)
Ciclo de Instrução
–
Conjunto de ações (operações) realizadas pelo computador
(leia-se CPU) para completar a execução de uma instrução
–
Divide-se em Ciclo de Busca (Fetch Cycle) e Ciclo de
Execução (Execution Cycle).
Ciclo de busca
1.
A UC lê (busca) a instrução na memória e carrega (armazena)
a instrução em RI para ser decodificada e executada.
2.
Atualização do valor de PC (incremento), fazendo-o apontar
para a instrução seguinte
(12)
Ciclo de execução
3.
Determinação do tipo de instrução que está armazenada em
RI (decodificação)
4.
Determinação de onde (endereço) uma palavra está
armazenada, caso necessário
5.
Busca da palavra, se necessário, e armazenamento em um
dos registradores do processador
6.
Execução da instrução
7.
Retorno ao passo 1 para iniciar a execução da instrução
seguinte
http://computer.howstuffworks.com/microprocessor2.htm
Exemplos de instruções
Exemplos de instruções
• LOADA mem – Carrega registrador A com conteúdo
do endereço de memória mem
• LOADB mem - Carrega registrador B com conteúdo
do endereço de memória mem
• CONB con – Carrega o valor de uma constante con
no registrador B
• SAVEB mem – Escreve o conteúdo do registrador B
no endereço de memória mem
• SAVEC mem - Escreve o conteúdo do registrador C
no endereço de memória mem
• ADD - Soma A e B e escreve o resultado em C
• SUB - Subtrai A e B e escreve o resultado em C
• MUL - Multiplica A e B e escreve o resultado em C
• DIV - Divide A e B e escreve o resultado em C
• COM - Compara A e B and store the result in test
• JUMP addr – Salta para o endereço
• JEQ addr – Salta para o endereço se a comparação
anterior tiver resultado em igualdade (A==B)
• JNEQ addr - Salta para o endereço se a comparação
anterior tiver resultado em desigualdade (A!=B)
• JG addr – Salta se A > B, na comparação anterior
• JGE addr – Salta se A >= B , na comparação
anterior
• JL addr – Salta se A < B , na comparação anterior
• JLE addr – Salta se A <= B , na comparação
anterior
• STOP – Para execução
2
Tipos de Operandos
Montagem: Mneumônico -> Números
•
•
•
•
LOADA - 1
LOADB - 2
CONB - 3
SAVEB - 4
SAVEC mem - 5
ADD - 6
SUB - 7
MUL - 8
DIV - 9
COM - 10
JUMP addr - 11
JEQ addr - 12
JNEQ addr - 13
JG addr - 14
JGE addr - 15
JL addr - 16
JLE addr - 17
STOP - 18
Registradores
Memória
Imediatos
Implícitos
Primeiro: o que esse programa faz?
End. CódigoInstrução/operador
0 3
1 1
2 4
3 128
4 3
5 1
6 4
7 129
8 1
9 128
10 3
11 5
12 10
13 14
i=1;
f=1;
while (i <= 5)
{
f = f * i;
i = i + 1;
}
Usando a representação numérica
End. CódigoInstrução/operador
0 3
// CONB 1
1 1
2 4
// SAVEB 128
3 128
4 3
// CONB 1
5 1
6 4
// SAVEB 129
7 129
8 1
// LOADA 128
9 128
10 3
// CONB 5
11 5
12 10
// COM
13 14
// JG 17
Usando a representação numérica
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
31
1
129
2
128
8
5
129
1
128
3
1
6
5
128
11
8
18
// LOADA 129
// LOADB 128
// MUL
// SAVEC 129
// LOADA 128
// CONB 1
// ADD
// SAVEC 128
// JUMP 4
// STOP
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
31
1
129
2
128
8
5
129
1
128
3
1
6
5
128
11
8
18
Usando o conjunto de instruções
// Assumir i no endereço 128
// Assumir f no endereço 129
0 CONB 1
1 SAVEB 128
2 CONB 1
3 SAVEB 129
4 LOADA 128
5 CONB 5
6 COM
7 JG 17
8 LOADA 129
9 LOADB 128
10 MUL
11 SAVEC 129
12 LOADA 128
13 CONB 1
14 ADD
15 SAVEC 128
16 JUMP 4
17 STOP
3
Usando o conjunto de instruções comentado
Usando rótulos (labels)
// Assumir i no endereço 128
// Assumir f no endereço 129
0 CONB 1
// i=1;
1 SAVEB 128
2 CONB 1
// f=1;
3 SAVEB 129
4 LOADA 128 // if i > 5 jump to 17
5 CONB 5
6 COM
7 JG 17
8 LOADA 129 // f=f*i;
9 LOADB 128
10 MUL
11 SAVEC 129
12 LOADA 128 // i=i+1;
13 CONB 1
14 ADD
15 SAVEC 128
16 JUMP 4
// loop back to if
17 STOP
// Assumir i no endereço 128
// Assumir f no endereço 129
CONB 1
// i=1;
SAVEB 128
CONB 1
// f=1;
SAVEB 129
loop_fatorial:
LOADA 128 // if i > 5 jump to 17
CONB 5
COM
JG final
LOADA 129 // f=f*i;
LOADB 128
MUL
SAVEC 129
LOADA 128 // i=i+1;
CONB 1
ADD
SAVEC 128
JUMP loop_fatorial
// loop back to if
final:
STOP
Usando rótulos para dados
Usando rótulos para dados
CONB 1
// i=1;
SAVEB i
CONB 1
// f=1;
SAVEB f
loop_fatorial:
LOADA i // if i > 5 jump to final
CONB 5
COM
JG final
LOADA f // f=f*i;
LOADB i
MUL
SAVEC f
LOADA i // i=i+1;
CONB 1
ADD
SAVEC i
JUMP loop_fatorial
// loop back to if i>5
final:
STOP
segment .bss
i
DB 0
f
DB 0
segment .text
CONB 1
// i=1;
SAVEB i
CONB 1
// f=1;
SAVEB f
loop_fatorial:
LOADA i // if i > 5 jump to final
CONB 5
COM
JG final
LOADA f] // f=f*i;
LOADB i]
MUL
SAVEC f
LOADA i // i=i+1;
CONB 1
ADD
SAVEC i
JUMP loop_fatorial
// loop back to if i>5
final:
STOP
O que esse programa faz?...
Melhorando o nome dos rótulos
segment .bss
i
DB 0
f
DB 0
segment .text
inicio:
CONB 2
SAVEB f
loop:
LOADA f
CONB 10
COM
JG else
LOADB f
SAVEB i
JUMP rotulo2
else:
LOADA i
CONB 1
ADD
SAVEC i
JUMP fim
rotulo2:
LOADA i
CONB 10
ADD
SAVEC i
JUMP else
fim:
STOP
segment .bss
i
DB 0
f
DB 0
segment .text
inicio:
CONB 2
// f=2;
SAVEB f
loop:
LOADA f // if f > 10 jump to soma1
CONB 10
COM
JG else
LOADB f // i=f
SAVEB i
JUMP soma10
soma1:
LOADA i // i=i+1;
CONB 1
ADD
SAVEC i
JUMP fim
soma10:
LOADA i // i=i+10
CONB 10
ADD
SAVEC i
JUMP soma1
fim:
STOP
4
Exercício: Calculadora
• Operandos nas posições 128 e 129
• Operações na posição 130 de memória:
Addição 0
Subtração 1
Multiplicação 2
Divisão 3
• Colocar resposta da operação na posição 131 de
memória
5
Download

O que esse programa faz?... Reposta Reposta