AC-07 ISA
AC-07 ISA
AC-07 ISA
Instruções
ISA: a Identidade da Máquina
Nivel 4
Orientada a Problemas
Montagem
Sistema Operacional
ISA (Máquina)
Microarquitetura
Lógica Digital
Dispositivos Eletrônicos
Conjunto de Instruções ISA
• Limite onde o projetista de computador e o programador podem ver a
mesma máquina
• Binário
• Repertório de operações
– Quantas operações?
– Quais operações? O que elas podem fazer?
– Qual a complexidade delas?
• Formatos de instrução
– Tamanho e formato dos campos
– Número de endereços e modos de endereçamento
• Registradores
– Número de registradores da CPU disponíveis
– Quais operações podem ser realizadas sobre quais registradores?
• Modos de endereçamento
Decisões de Projeto
Para executar: c = a + b
Pop C Store R3
Classificação da ISA
TOS … … …
…
… … … …
Memória Memória Memória Memória
… …
Pilha
Acumulador
… …
• Suporte a procedures
• Interrupções e exceções
• Registrador do processador
– Com raras exceções, um processador contém um ou mais registradores
– Registradores podem ser referenciados por instruções
– Se houver apenas 1 registrador, a referência é implícita
• Imediato
– O valor do operando está contido na instrução
• Dispositivo de E/S
– A instrução precisa especificar o módulo de E/S
Representação da Instrução
• Em código de máquina, cada instrução tem um padrão de bits exclusivo
16 bits
Tipos de Instrução
• Processamento de dados
– Aritmética e lógica
• Armazenamento de dados
– Fluxo de dados para dentro ou fora do registrador e/ou memória
• Pode incluir
– Incremento
– Decremento
– Negação
Lógicas
– NOT
– AND
– OR
– Exclusive OR (XOR)
– EQUAL teste binário útil
Deslocamentos
À direita À esquerda
0 0
Deslocamento Lógico … …
0
Deslocamento Aritmético S … S …
Rotação … …
Em alguns casos pode usar o carry
Conversão
• Instruções privilegiadas
• Salto (Jump)
• Chamadas a sub-rotinas
• Retorno
de sub-rotinas, interrupções etc.
Resumo
Tipo de operador Exemplos
• Numéricos
– Valores (Inteiros com ou sem sinal, Ponto-Flutuante, BCD)
– Endereços
• Não Numéricos
– Caracteres (ASCII, unicode etc.)
– Cadeias de caracteres (strings)
– Outros
– Tamanho da memória
– Organização da memória
– Estrutura de barramento
– Complexidade da CPU
– Velocidade da CPU
instrução instrução
Opcode
• 1 endereço
Opcode Endereço 1
• 2 endereços
• 3 endereços
• Menos endereços
– Instruções menos complexas (poderosas?)
– Mais instruções por programa
– Busca/execução de instruções mais rápida
Expansão de opcodes
• Compromisso entre o tamanho do opcode e o espaço para outras
informações
• Dificuldade de decodificação
Opcode Endereço 1 Endereço 2 Endereço 3
13
00 Destino opcode Fonte 1 1 Imediato ULA Imediato
3 22
SPARC
01 Destino opcode Imediato SETHI
1 4
10 A Condição opcode Deslocamento em relação ao PC BRANCH
30
11 Deslocamento em relação ao PC CALL
Algumas Arquiteturas
bits 8
opcode
5 3
opcode Reg
8
Intel 8051
opcode Operando
11
opcode Endereço
16
opcode Endereço
8
opcode Operando Operando
Algumas Arquiteturas
bytes 0−1 0−1 0−1 0−1
Prefixo Segmento T.Operando T.Endereço
Intel x86
32 bits bytes 0−4 1−3 0−1 0−1 0−4 0−4
Prefixos Opcode ModR/m SIB Deslocamento Imediato
bits 2 3 3 bits 2 3 3
Mod Reg/Opcode R/M eScala Índice Base
Registradores
Arquitetura ISA
Registradores
• Outros
Propósito Especial
• Existem três registradores de propósito especial no ISA MIPS:
MIPS
Processador IBM 370/168 VAX 11/780 Intel 80486 SPARC Mips R4000 Power PC Ultra Sparc
R10000
Ano de Desenvolvimento 1973 1978 1989 1987 1991 1993 1996 1996
Tamanho da Instrução
2-6 2-57 1-11 4 4 4 4 4
(bytes)
Modos de
4 22 22 1 1 2 1 1
Endereçamento
Número de Registradores
16 16 8 40-520 32 32 40-520 32
de Propósito Geral
Tamanho da Memória de
420 480 246 - - - - -
Controle (Kbits)
Tamanho da Cache
64 64 8 32 128 16-32 32 64
(KBytes)
Stallings, Cap.12
Tamanho de um Registrador
• Registrador de Endereços: o suficiente para armazenar um endereço
completo
• MIPS: registradores 32 bits, que combinados por trabalhar com até 64 bits
• Multiplicação, divisão, operações ponto-flutuante etc.
Algumas Organizações de Registradores
MC68000 8086 Pentium II
Registradores de Dados Gerais Registradores Gerais
D0 AX Acumulador EAX Acumulador AX
D1 BX Base EBX Base BX
D2 CX Contador ECX Contador CX
D3 DX Dados EDX Dados DX
D4
D5 Ponteiros e Índices Registradores Ponteiros e Índices
D6 SP Ponteiro de Pilha ESP Ponteiro de Pilha SP
D7 BP Ponteiro Base EBP Ponteiro Base BP
SI Índice Fonte ESI Índice Fonte SI
Registradores de Dados DI Índice Destino EDI Índice Destino DI
A0
A1 Segmento Segmento
A2 CS Código CS Código
A3 DS Dados DS Dados
A4 SS Pilha SS Pilha
A5 ES Extra ES Extra
A6
A7
A7’
Stallings, Cap.12
Modos de Endereçamento
Arquitetura ISA
Implícito vs Explícito
Opcode Operando
Direto
• O endereço de memória onde está o operando faz parte da instrução
Opcode Endereço
Operando
Registrador
• Mesmo que endereçamento direto, entretanto é o endereço do registrador
que faz parte da instrução
R3 Operando
R4
Indireto de Registrador
• A instrução traz o endereço do registrador que armazena o endereço de
memória onde está o operando
R1
Opcode Registrador …
Operando
R2
R3 Endereço
R4
Indireto de Memória
• A instrução traz o endereço do registrador que armazena o ponteiro para
endereço de memória onde está o operando
Registradores Memória
R1
Opcode Registrador …
Operando
R2
R3 Endereço A
Endereço B
R4
Indireto
• O campo de endereço da instrução contém um endereço da memória
cujo conteúdo é o endereço do operando na memória (ponteiro)
Memória
Opcode Endereço A
Operando
Endereço B
Auto Incremento
• É equivalente a um endereçamento indireto a registrador, com o
incremento automático do conteúdo do registrador selecionado após
calcular o endereço efetivo
Registradores Memória
R1
Opcode Registrador …
Operando
R2
R3 Endereço
R3 = R3 + 1 R4
Auto Decremento
• É equivalente a um endereçamento indireto a registrador, com o
decremento automático do conteúdo do registrador selecionado após
calcular o endereço efetivo
Registradores Memória
R1
Opcode Registrador …
Operando
R2
R3 Endereço
R3 = R3 - 1 R4
por Deslocamento
• É uma combinação dos modos Direto e Indireto via Registrador
Registradores Memória
R1
Opcode Registrador P1
+ Operando
R2
R3 P2
R4
Base com Deslocamento
• É uma generalização do endereçamento Relativo, onde o número
(endereço) do registrador Base faz parte da instrução
Memória
Registrador Base P
Operando
Indexado
• Interpretação oposta ao modo via Registrador Base
Memória
Escala Memória
Memória
Memória
Memória
Opcode … Operando
Implícito SP P
Endereçamento de Desvios
Absoluto
• Usado em instruções de transferência de controle
Memória
Opcode Endereço
Próxima Instrução
Relativo
• Explora o conceito de localidade, economizando bits do campo de
endereço da instrução, com valor de deslocamento em complemento,
permitindo acréscimos e decréscimos de endereço
Memória
Opcode Deslocamento P
+
Implícito PC P
Proxima Instrução
Indireto
• A instrução traz o endereço do registrador que armazena o endereço de
memória onde está a próxima instrução
• A grande vantagem é ter uma instrução que ocupa poucos bits para
codificar o endereço
Registradores Memória
R1
Opcode Registrador …
Próxima Instrução
R2
R3 Endereço
R4
Análise de Dados
Análise baseada em Benchmarks
Freqüência de cada Modo
50%
Registrador 50%
50%
0,5%
Indireto à memória 3%
0,5%
0%
Escalado 8%
3%
12%
Indireto a Registrador 1,5%
5,5%
21,5%
Imediato 8,5%
19,5%
16% TeX
Deslocamento 27,5%
spice
20%
0% gcc
Outros 3%
3%
25%
Inteiro
Ponto Flutuante
20%
15%
10%
5%
0%
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Número de bits necessário para o valor do deslocamento
Uso dos Operandos Imediatos
10%
Cargas (loads)
45%
87%
Comparações
77%
58%
Operações com ULA
78%
35%
Todas Instruções Inteiros
10% Ponto-Flutuante
30%
20%
10%
0%
0 4 8 12 16 20 24 28 32
Tamanho do Operando Imediato em bits
Tipos de Operandos
59%
Double word
70%
29%
Word
26%
0%
Half word
5%
1% Inteiros
Byte Ponto Flutuante
10%
Comparação 16%
Adição (add) 8%
E (and) 6%
Subtração (sub) 5%
Movimentação registrador-registrador 4%
Chamada a procedimento 1%
Retorno de procedimento 1%
Total 96%
Controle do Fluxo
Inteiro
13% Ponto Flutuante
Chamada/Retorno
11%
6%
Salto
4%
81%
Desvio Condicional
86%
1020
1021 memória
1022
1023
Alinhamento de Palavras
endereços 8 bytes
8 8 9 10 11 12 13 14 15
palavra de 8 16
bytes alinhada
no endereço 8 24
Alinhamento de Palavras
endereços 8 bytes
8 12 13 14 15
palavra de 8 16 16 17 18 19
bytes não-
alinhada no
24
endereço 12
Ordem de Bytes
0 0
0 0
} •
Segmento
de código O SO ajusta $gp antes de iniciar os
…
instruções programas
PC • Labels na esquerda são offsets relativos ao
…
$gp
$gp 0 0xCCCCCCCC i • As variáveis não são inicializadas, logo seu
Segmento
4 0x00000014 N
conteúdo é indefinido (aleatório)
8 ‘E’‘n’‘t’‘e’ prompt
de dados
12 0x7220616E • Se assume que a máquina opera no modo
16 0x20696E74 “Big endian”, então, os bytes estão escritos
20 0X65676572
0x3A00CCCC
da direita para esquerda dentro da palavra
24
28 A[0] (A) • O vetor A deve ser alinhado nas palavras
32
…
A[1]
(pode haver algum “padding” antes dele.
1048 A[255] • Se assume que pBArray é inicializado
•
1052 pBArray
1056 BSize
Apesar deste layout seguir a ordem das
1060 0xFFFFFF00 background declarações, não há nenhuma razão para o
…
compilador fazê-lo. Compiladores C
diferentes, farão coisas diferentes
Gerando um Programa Executável
Programa em C Conteúdo dos arquivos objeto (Unix)
Cabeçalho: tamanho e posição dos componentes
Segmento de texto: código de máquina
Compilador Segmento de dados: variáveis dinâmicas e
estáticas
Informação de relocação: referências absolutas
de memória
Programa em Assembly Tabela de símbolos: nome e localização dos
labels, procedimentos e variáveis
Informação de Debugging: mapeamento de
Montador códigos fontes para objetos, break
points etc.
Linker
• Coloca módulos de dados e de
código simbolicamente na
memória Executável: programa em LM
• Determina o endereço dos labels
de dados e de instruções
• Relaciona referências internas e Carregador
externas
Memória
Carregando um Programa Executável
• Para carregar um executável, o SO realiza os seguintes passos:
Sistema Operacional
0x80000000
Total = 4 GiBytes $sp ! 0x7fffffff
pilha
dados dinâmicos
dados estáticos
$gp ! 0x10010000
segmento de código
pc ! 0x00400000
0x00000000 reservado
Simuladores MARS
0xffffffff
e SPIM
Sistema Operacional
0x80000000
Total = 4 GiBytes $sp !
0x7fffffff
0x7fffeffc
reservado pelo MARS
pilha
dados dinâmicos
• Como faço com as operações de entrada/saída, por exemplo, ler uma entrada do teclado e
imprimir na tela?
Visão Geral da Instrução
• Instruções simples, todas com largura de 32 bits
011
110
111
FlPt, op(31:26) = 010001
000 001 010 011 100 101 110 111
01
10
11
(16:16) (16:16)
0 movf 0 movf.f
1 movt 1 movt.f
Mapa de opcode
1 01 1 1 sub.f 1 maddu
2 02 j 2 srl 2 mul.f 2 mul
3 03 jal 3 sra 3 div.f 3
4 04 beq 4 sllv 4 sqrt.f 4 msub
5 05 bne 5 5 abs.f 5 msubu
6 06 blez 6 srlv 6 mov.f 6
do MIPS
7 07 bgtz 7 srav 7 neg.f 7
8 08 addi 8 jr 8 8
9 09 addiu 9 jalr 9 9
10 0a slti 10 movz 10 10
11 0b sltiu 11 movn 11 11
12 0c andi 12 syscall 12 round.w.f 12
13 0d ori 13 break 13 trunc.w.f 13
anteriores
16 10 z=0 16 mfhi 16 16
17 11 z=1 17 mthi 17 17
18 12 z=2 18 mflo 18 movz.f 18
19 13 19 mtlo 19 movn.f 19
20 14 beql 20 20 20
21 15 bnel 21 21 21
22 16 blezl 22 22 22
23 17 bgtzl 23 23 23
24 18 24 mult 24 24
25 19 25 multu 25 25
26 1a 26 div 26 26
27 1b 27 divu 27 27
28 1c 28 28 28
29 1d 29 29 29
rs if z = 1 or z = 2 funct rt
30 1e 30 30 30
31 1f (25:21) (17:16) (4:0) (20:16) 31 31 31
32 20 lb 0 mfcz 0 bczf 0 0 bltz 32 add 32 cvt.s.f 32 clz
33 21 lh 1 1 bczt 1 tlbr 1 bgez 33 addu 33 cvt.d.f 33 clo
34 22 lwl 2 cfcz 2 bczfl 2 tlbwi 2 bltzl 34 sub 34 34
35 23 lw 3 3 bcztl 3 3 bgezl 35 subu 35 35
36 24 lbu 4 mtcz 4 4 36 and 36 cvt.w.f 36
37 25 lhu 5 5 5 37 or 37 37
38 26 lwr 6 ctcz 6 tlbwr 6 38 xor 38 38
39 27 7 7 7 39 nor 39 39
40 28 sb 8 8 tlbp 8 tgei 40 40 40
41 29 sh 9 9 9 tgeiu 41 41 41
42 2a swl 10 10 10 tlti 42 slt 42 42
43 2b sw 11 11 11 tltiu 43 sltu 43 43
44 2c 12 12 12 tegi 44 44 44
45 2d 13 13 13 45 45 45
46 2e swr 14 if z = 0 14 14 tnei 46 46 46
47 2f cache 15 15 15 47 47 47
48 30 ll 16 copz 16 16 bltzal 48 tge 48 c.f.f 48
49 31 lwc1 17 copz 17 17 bgezal 49 tgeu 49 c.un.f 49
50 32 lwc2 18 if z = 1, if z = 1, 18 18 bltzall 50 tlt 50 c.eq.f 50
51 33 pref 19 f=d f=s 19 19 bgczall 51 tltu 51 c.ueq.f 51
52 34 20 20 20 52 teq 52 c.olt.f 52
53 35 ldc1 21 21 21 53 53 c.ult.f 53
54 36 ldc2 22 22 22 54 tne 54 c.ole.f 54
55 37 23 23 23 55 55 c.ule.f 55
56 38 sc 24 24 eret 24 56 56 c.sf.f 56
57 39 swc1 25 25 25 57 57 c.ngle.f 57
58 3a swc2 26 26 26 58 58 c.seq.f 58
59 3b 27 27 27 59 59 c.ngl.f 59
60 3c 28 28 28 60 60 c.lt.f 60
61 3d sdc1 29 29 29 61 61 c.nge.f 61
62 3e sdc2 30 30 30 62 62 c.le.f 62
63 3f 31 31 deret 31 63 63 c.ngt.f 63
LM MIPS para PF
Nome Formato Exemplo Instrução Codificada
6 bits 5 bits 5 bits 5 bits 5 bits 6 bits
add.s R add.s $f2, $f4, $f6 010001 10000 00100 00110 00010 00000
sub.s R sub.s $f2, $f4, $f6 010001 10000 00100 00110 00010 00001
mul.s R mul.s $f2, $f4, $f6 010001 10000 00100 00110 00010 00010
div.s R div.s $f2, $f4, $f6 010001 10000 00100 00110 00010 00011
add.d R add.d $f2, $f4, $f6 010001 10001 00100 00110 00010 00000
sub.d R sub.d $f2, $f4, $f6 010001 10001 00100 00110 00010 00001
mul.d R mul.d $f2, $f4, $f6 010001 10001 00100 00110 00010 00010
div.d R div.d $f2, $f4, $f6 010001 10001 00100 00110 00010 00011
lwcl I lwcl $f1, 127($2) 110001 00010 00001 0000 0000 0111 1111
swcl I swd1 $f1, 127($2) 111001 00010 00001 0000 0000 0111 1111
bclt I bclt 25 010001 01000 00001 0000 0000 0001 1001
bclf I bclf 25 010001 01000 00000 0000 0000 0001 1001
c.lt.s R c.lt.s $f2, $f4 010001 10000 00100 00010 00000 111100
c.le.d R c.le.d $f2, $f4 010001 10001 00100 00010 00000 111110
Montagem na Prática
"Assembler" Manual
add $t1, $s5, $s3
0x02B34820
lui $at, 0x00001001
0x3c011001
beq $t0, $at, 0x00001a8c
0x102806a3
ori $t0, $at, 0x000010c2
0x342810c2
syscall
syscall
Formato R
0x0000000c
j 0x042BDC0C
retirar 2 zeros menos
significativos
j 0x010af703
0x0900f103
Uso da Pilha no MIPS
# PUSH # POP
# coloca um registrador na pilha # retirar um registrador da pilha
.macro push($reg) .macro pop($reg)
sw $reg, ($sp) addi $sp, $sp, 4
addi $sp, $sp, -4 lw $reg, ($sp)
.end_macro .end_macro