Escolar Documentos
Profissional Documentos
Cultura Documentos
Aula 2 – Instruções
A linguagem do Computador
Linguagem Assembly
• Representação textual de
instruções
Linguagem de Hardware
• Dígitos binários (bits)
• Codifica instruções e dados
Conjunto de Instruções - ISA
O repertório de instruções de um
computador
Computadores diferentes possuem
conjuntos de instruções diferentes
Mas comum em muitos aspectos
Primeiros computadores tinham conjuntos
de instruções muito simples
Implementações simplificadas
Muitos computadores modernos também
tem conjuntos de instruções muito simples
Conjunto de Instruções do RISC-V
Usado como exemplo neste curso
Desenvolvido na UC Berkeley como ISA aberto
2010
Agora gerenciado pela RISC-V Foundation
(riscv.org)
Típico de muitos ISAs modernos
Veja o cartão de referência do RISC-V (Moodle)
ISAs similares possuem um vasto mercado em
sistemas embarcados
Aplicações em eletrônicos, equipamento de
rede/armazenamento, câmeras, impressoras, …
Um programa exemplo
.data
vetor: .word 10 20 30 40 50
.text
jal ra, L1
L1: addi x28,zero,1 Pseudo-instruções
addi x29,zero,1
addi x30,zero,1 Ajudam o compilador a
addi x31,zero,24 montar o programa.
sw x28 0(x31)
sw x29 4(x31) Em geral começam com
addi x31, x31,8 um caractere espacial
L2: beq x10, x30, L3
add x5, x28, x29
sw x5, 0(x31)
addi x31, x31, 4 Instruções
add x28, x29, zero
add x29, x5, zero São o programa em si.
addi x30,x30,1
beq zero,zero, L2
L3: jalr ra 0(zero)
RISC-V - Aritmética
Exemplo:
Código C: A = B + C
Exemplo:
Código C: A = B + C
• Código C: F = (G + H) - (I + J)
• F,...,J em x19,...,x23
Controle Entrada
Memória
Datapath Saída
Processador I/O
Organização da Memória
• Visto como uma matriz unidimensional, com um endereço.
• Um endereço de memória é um índice em uma matriz
• endereçamento de Byte aponta para um byte da memória.
0 8 bits de dados
1 8 bits de dados
2 8 bits de dados
3 8 bits de dados
4 8 bits de dados
5 8 bits de dados
6 8 bits de dados
...
Organização da Memória
0 64 bits de dados
8 64 bits de dados
64 bits de dados
Registradores retém 64 bits de dados
16
24 64 bits de dados
...
– ld x5, 8(x6)
Store – Copia conteúdo do registrador na memória
sd x5, 8(x6)
RISC-V – Acesso à Memória
Copiar dados de → para Instrução
• Exemplo:
Código C: A = B + 21
mais complicado:
números são finitos (overflow)
frações e números reais
números negativos
i.e., RISC-V não tem instrução subi; (addi
pode somar um número negativo)
Instruções RISC-V
Codificado como palavras de 32-bit
Pequeno número de formatos codificando: código da
operação, número dos registradores, ...
Regularidade!
Traduzindo para a Linguagem da Máquina
Instruções Tipo-R
funct7 rs2 rs1 funct3 rd opcode
7 bits 5 bits 5 bits 3 bits 5 bits 7 bits
Instruction fields
opcode: código da operação
rd: número do registrador de destino
funct3: 3-bit código de função (adicional ao opcode)
rs1: número do primeiro registrador de origem
rs2: número do segundoregistrador de origem
funct7: 7-bit código de função (adicional ao opcode)
Traduzindo para a Linguagem da Máquina
Instruções Tipo-I
immediate rs1 funct3 rd opcode
12 bits 5 bits 3 bits 5 bits 7 bits
Instruções Tipo-I
immediate rs1 funct3 rd opcode
12 bits 5 bits 3 bits 5 bits 7 bits
Instruções Tipo-S
imm[11:5] rs2 rs1 funct3 imm[4:0] opcode
7 bits 5 bits 5 bits 3 bits 5 bits 7 bits
Traduzindo para a Linguagem da Máquina
Traduzindo para a Linguagem da Máquina
Exemplo Tipo-R
funct7 rs2 rs1 funct3 rd opcode
7 bits 5 bits 5 bits 3 bits 5 bits 7 bits
add x9,x20,x21
0 21 20 0 9 51
or x9,x10,x11
RISC-V:
bne t3, t4, Else
add t0, t1, t2
beq zero,zero,Exit // incondicional
Else: sub t0, t1, t2
Exit: …
RISC-V – Operações Condicionais
Exemplo Loop
C:
while (save[i] == k) i += 1;
i em t0, k em t1, endereço de save em t2
RISC-V:
Loop: slli t3, t0, 3
add t3, t3, t2
ld t4, 0(t3)
bne t4, t1, Exit
addi t0, t0, 1
beq zero, zero, Loop
Exit: …
RISC-V – Rótulos
Loop: slli t3, t0, 3 slli t3, t0, 3
add t3, t3, t2 add t3, t3, t2
ld t4, 0(t3) ld t4, 0(t3)
bne t4, t1, Exit bne t4, t1, 8
addi t0, t0, 1 addi t0, t0, 1
beq zero, zero, Loop beq zero, zero, -
Exit: … 24
…
Rótulos auxiliam o programador de assembly
Rótulos existem somente no assembly: são traduzidos para
imediatos ao gerar o código de máquina
Alguns rótulos que viram imediatos:
Nomes de variáveis alocadas no .data
Nomes de procedimentos
Desvios condicionais e incondicionais
RISC-V – Chamada de Procedimento
Procedimentos: Conjunto de instruções com função definida
Realizam uma série de operações como base em valores de
parâmetros
Podem retornar valores computados
Motivos para o uso de procedimentos:
Tornar o programa mais fácil de ser entendido
Permitir a reutilização do código do procedimento
Permitir que o programador se concentre em uma parte do
código (os parâmetros funcionam como barreira)
RISC-V – Chamada de Procedimento
x10-x17 (a0-a7): registradores de argumento do procedimento;
x10-x11 (r0,r1): registradores de valores de retorno;
x1 (ra): registrador de endereço de retorno – retorna ao ponto de origem;
PC: contador de programa – guarda o endereço da instrução
executada.
Instruções de procedimento
jal ra, PROC
Pula para o procedimento “PROC” e coloca o endereço de retorno em x1
ra = PC + 4
PC = PC + PROC
jalr zero, 0(ra)
RISC-V – Chamada de Procedimento
O que fazer se um procedimento precisar de mais
registradores?
Algumas opções:
x5-x7, x28-x31 (t0-t6): registradores temporários não preservados;
x8, x9, x18-x27 (s0-s11): registradores salvos que precisam ser preservados.
folha:
addi sp, sp, -24
int folha (int g, int h, int i, int j) sd s2, 16(sp)
{ sd s3, 8(sp)
sd s4, 0(sp)
int f;
add s2, a0, a1
add s3, a2, a3
f = (g+h) – (i+j); sub s4, s2, s3
return f addi r0, s4, 0
} ld s4, 0(sp)
ld s3, 8(sp)
ld s2, 16(sp)
addi sp, sp, 24
jalr zero, 0(ra)
RISC-V – Chamada de Procedimento
RISC-V – Chamada de Procedimento
Exemplo – Chama de procedimento – Recursivo
RISC-V code:
04: fact: addi sp, sp, -16
08: sd ra, 8(sp)
12: sd a0, 0(sp)
16: addi t0, a0, -1
int fact (int n) 20: bge t0, zero, L1
24: addi r0, zero, 1
{ 28: addi sp, sp, 16
if (n < 1) return (1); 32: jalr zero, 0(ra)
else return (n * fact(n-1)); 36: L1: addi a0, a0, -1
40: jal ra, fact
} 44: addi t1, r0, 0
48: ld a0, 0(sp)
52: ld ra, 8(sp)
56: addi sp, sp, 16
60: mul r0, a0, t1
64: jalr zero, 0(ra)
68: main: addi a0, zero, 7
72: jal ra, fact
RISC-V – Array x Ponteiro
clear1(int array[], int size) { clear2(int *array, int size) {
int i; int *p;
for (i = 0; i < size; i += 1) for (p = &array[0]; p < &array[size];
array[i] = 0; p = p + 1)
} *p = 0;
}
Static linking
Traduzindo e Iniciando um Programa
Caracterizam-se por:
58
CISC – Vantagens
• Programação de código de máquina mais fácil
• Código executável pequeno → menos memória necessário
• Instruções memória-à-memória (carregar e armazenar dados com
mesma instrução) → menos registradores necessários
59
CISC – Desvantagens
• Aumento de complexidade de processadores novos por
causa da inclusão das instruções velhas
• Muitas instruções especiais - menos usadas
• Execução de varias instruções complexas mais lento do
que execução da sequencia equivalente
• Alta complexidade
• Pipelining muito difícil → frequência de clock reduzido
• Tratamento de eventos externos (Interrupts) mais difícil
• Execução de instruções simples demora mais do que
necessário
60
RISC
Reduced Instruction Set Computer (Computador com um Conjunto Reduzido
de Instruções)
61
RISC - Vantagens
• Complexidade baixa
62
RISC – Desvantagens
63
RISC vs. CISC
• CISC:
• Redução do número de instruções por programa
• Aumento do número de ciclos por instrução
• RISC:
• Redução do número de ciclos por instrução
• Aumento de número de instruções por programa
64
X86 ISA
Evolução com compatibilidade contínua
8080 (1974): 8-bit microprocessor
Acumulador, mais 3 register idexados
8086 (1978): extensão 16-bit do 8080
Complex instruction set (CISC)
8087 (1980): co-processador floating-point
Adiciona instruções FP e pilha de registradores
80286 (1982): endereçamento 24-bit, MMU
Memoria segmentada, mapeamento e proteção
80386 (1985): extensão 32-bit (agora IA-32)
Modos de endereçamento e operações adicionais
Mapeamento de memória mapeada e segmentada
X86 ISA
Evolução continua…
i486 (1989): pipelined, on-chip caches and FPU
Competidores compativeis: AMD, Cyrix, …
Pentium (1993): superscalar, 64-bit datapath
Versões seguintes adicinaram instruções MMX (Multi-Media
eXtension)
O famoso FDIV bug – grande prejuízo
Pentium Pro (1995), Pentium II (1997)
Nova organização (see Colwell, The Pentium Chronicles)
Pentium III (1999)
Adicionou SSE (Streaming SIMD Extensions) e registradores
associados
Pentium 4 (2001)
Nova organização
Adicionou instruções SSE2
X86 ISA
E continua…
AMD64 (2003): extensão da arquitetura para 64 bits
EM64T – Extended Memory 64 Technology (2004)
AMD64 adotado pela Intel (com refinamentos)
Adiciona instruções SSE3
Intel Core (2006)
Adiciona instruções SSE4, Suporte a máquina virtual
AMD64 (anunciado 2007): instruções SSE5
Advanced Vector Extension (anunciado em 2008)
Registradores X86
Endereçamento X86
Dois operandos por instruções
Nano-
Processador Microcódigo
73