Interface Hardware-Software
História do ISA Intel x86
Evolução garantindo compatibilidade com versões
anteriores
– 8080 (1974): microprocessador de 8 bits
– 8086 (1978): extensão do 8080 para 16 bits
Registradores dedicados de 16 bits
– 8087 (1980): coprocessador para ponto flutuante
Adiciona instruções de ponto flutuante e pilha
– 80286 (1982): endereços de 24 bits e MMU
Modelo de proteção da memória
– 80386 (1985): extensão para 32 bits (chamado de IA-32)
Modos de endereçamento e operações adicionais
Registradores e endereçamento de 32 bits
– i486 (1989): utilização de pipeline, caches on-chip
Evoluindo sempre…
– Pentium (1993): superescalar
Versões posteriores incluiram instruções MMX (Multi-Media eXtension)
O famoso bug da instrução FDIV
– Pentium III (1999)
Adicionou instruções SSE (Streaming SIMD Extensions) e registradores associados
70 instruções adicionadas, 4 operações com ponto flutuante de precisão simples podiam ser feitas
paralelamente
– Pentium 4 (2001)
Adicionou 144 instruções (SSE2)
Permitia que operações com ponto flutuante com precisão dupla fossem realizadas paralelamente
E mais ainda…
– AMD64 (2003): estendeu a arquitetura para 64 bits
Aumentou registradores para 64 bits
Aumentou o número de registradores
– EM64T – Extended Memory 64 Technology (2004) AMD64 adotada pela Intel (com refinamentos)
Adicionou 13 instruções SSE3
– Intel Core (2006)
Adicionou 54 instruções SSE4
– AMD64 (2007): mais 170 instruções SSE5
Introduziu instruções com 3 operandos como o MIPS
Registradores do IA-32 (Arquitetura de 32 bits)
Registradores de 16 bits
Apenas 8
registradores de 32 bits propósito geral
Registradores de Propósito Geral (32 bits)
Podem ser referenciados também como registradores de 16 bits(ex: AX), pela parte baixa dos 16 bits(ex: AL), ou ainda pela parte alta dos 16 bits(ex: AH)
Embora sejam de propósito geral, em algumas instruções os diferentes registradores tem um uso específico
– EAX,EDX – Multiplicação, divisão, operações de E/S
– ECX – Instruções de laço, rotação, deslocamento de bits
AH AL BH BL CH CL DH DL EAX EBX ECX EDX 31 16 15 8 7 0 AX BX CX DX Reg 32 bits Reg 16 bits Acumulador Base Contador Dados
Chapter 2 — Instructions: Language of the Computer — 7
Exemplo de Uso do AL/AX
MUL CL
00 20H 00 80H AH AL CH CL 10 00H AH AL Multiplica CL por AL e coloca resultado em AXMais Registradores de Propósito Geral (32 bits)
Registradores de Índice devem ser utilizados em instruções que manipulam strings
– Estes tipos de instruções geralmente incrementam/decrementam implicitamente estes registradores
Registrador Stack Pointer deve guardar endereço do topo da pilha
– Instruções como POP/PUSH incrementam/decrementam o ESP
O Base Pointer deve ser utilizado como ponteiro base para um acesso a memória SI DI ESI EDI ESP EBP 31 16 15 0 Reg 32 bits Reg 16 bits Source Index Destination Index SP BP Stack Pointer Base Pointer
Registradores de Segmentos (16 bits)
Servem para controlar e apontar para porções da memória que devem ser acessados
– CS – Busca de instruções
– SS – Operações na pilha, como chamada e retorno de subrotinas
– DS – Ler e escrever dados do programa
– ES,FS,GS – Não tem função específica CS 15 0 Segmento de código SS DS ES FS GS Segmento da pilha Segmento de dados Segmento extra Segmento extra Segmento extra
Chapter 2 — Instructions: Language of the Computer — 10
Utilidade dos Registradores de Segmentos
CS 15 0 SS DS ES FS GS .code mov ax,var1 add ax,var2 .data var1 db 4 var2 db 5 valorECX db 2 dup(0h)
Chapter 2 — Instructions: Language of the Computer — 11
Registradores de Controle (32 bits)
IP (Instruction pointer) aponta para a instrução a ser executada dentro do segmento de código corrente
– Não pode ser alterado explicitamente pelo programador
– É modificado implicitamente por certas instruções
FLAGS é utilizado para guardar o estado da CPU e também para seu controle
– É modificado implicitamente pelas instruções
– Instruções de tomadas de decisão baseiam-se neste registrador IP FLAGS EIP EFLAGS 31 16 15 0 Reg 32 bits Reg 16 bits Contador do programa Flags
Chapter 2 — Instructions: Language of the Computer — 13
Endianness do x86
Memória 00H 00H 12H 34H 322H 323H 321H 320H Memória 34H 12H 00H 00H 322H 323H 321H 320H 001234H Big-endian Little-endian Byte mais significativo Byte mais significativox86 é Little-endian
Operandos no IA-32
Dois operandos
– Em instruções aritméticas/lógicas primeiro operando é origem e destino
Pode ter um operando na memória
Operando origem/dest Segundo operando origem
Registrador Registrador
Registrador Imediato
Registrador Memória
Memória Registrador
Memória Imediato
Há algumas poucas instruções que possuem a opção de
utilizarem três operandos
Modos de Endereçamento Básicos do IA-32
Modos de endereçamento comuns
– Registrador, imediato, endereçamento base
Modos de endereçamento mais complexos
– Direto
– Registrador indireto
– Indexado
―Base Indexado
―Base Indexado com deslocamento
―String
―Portas
Dependendo do modo de endereçamento, certos
registradores não podem ser utilizados
Modo Registrador
Neste modo, os operandos estão nos registradores
0001H AX 0004H BX Operando 2 Operando 1 0005H AX Operando 1
ADD
AX,
BX
ADD AX BX Reg 1 Reg 2Modo Imediato
Neste modo, um operando está contido na própria
instrução
Imediato pode ser um número de 8,16 ou 32 bits
Não pode ser utilizado para registradores de segmento!
0001H AX 3H Operando 2 Operando 1 0004H AX Operando 1
ADD
AX,
3H
ADD AX 3H Reg 1 Imed.Modo Direto
Neste modo, um operando está contido na memória
A instrução contém o endereço do operando em relação a
um segmento
Deve vir especificado com o uso de colchetes ([ ]) Segmento padrão é DS, senão deve ser especificado Ex: MOV ES:[2000H],AX
0001H AX Memória Operando 1 1235H AX Operando 1
ADD
AX,
[300H]
ADD AX 300H Reg 1 End. 12H 34H 00H 00H DS + 300H DS +301H Operando 2 DS + 299H DS + 298HModo Registrador Indireto
A instrução contém o registrador que armazena um
endereço do operando em relação a um segmento
Deve vir especificado com o uso de colchetes ([ ]) Só podem ser utilizados BX,BP,SI,DI
Segmento padrão é DS, exceto quando BP usado (padrão SS)
0001H AX
Memória Operando 1
1235H AX
Operando 1
ADD
AX,
[SI]
ADD AX SI Reg 1 Reg 2 12H 34H 00H 00H DS + 300H DS +301H Operando 2 DS + 299H DS + 298H 0300H SI
Modo Base
Similar ao endereçamento indireto, contudo pode-se somar
um valor ao endereço apontado pelo registrador (base)
Deve vir especificado com o uso de colchetes ([ ])
Só podem ser utilizados BX,BP como registrador base Valor deve ser de 8 ou 16 bits com sinal
Segmento padrão é DS para BX e SS para BP
0001H AX Memória Operando 1 1235H AX Operando 1
ADD
AX,
[BX + 4]
ADD AX BX Reg 1 Base 12H 34H 00H 00H DS + 304H DS +305H Operando 2 DS + 303H DS + 302H 0300H BX 4 Offset +4Modo Indexado
Similar ao endereçamento base, contudo somente os
registradores SI e DI podem ser utilizados para apontar
para um endereço de memória (registradores de índice)
Deve vir especificado com o uso de colchetes ([ ]) Segmento padrão é DS 0001H AX Memória Operando 1 1235H AX Operando 1
ADD
AX,
[SI + 4]
ADD AX SI Reg 1 Base 12H 34H 00H 00H DS + 304H DS +305H Operando 2 DS + 303H DS + 302H 0300H SI 4 Offset +4
Modo Base Indexado
Endereço do operando na memória é o resultado da soma
dos endereços do segmento, do registrador de base e do
registrador de índice
Deve vir especificado com o uso de colchetes ([ ]) Segmento padrão é DS 0001H AX Memória Operando 1 1235H AX Operando 1
ADD
AX,
[BP + SI]
ADD AX BP Reg 1 Base 12H 34H 00H 00H DS + 304H DS +305H Operando 2 DS + 303H DS + 302H 0300H BP SI Índice 0004H SI +
Modo Base Indexado com Deslocamento
Endereço do operando na memória é o resultado da soma
dos endereços do segmento, do registrador de base, do
registrador de índice e de valor de deslocamento (offset)
Deve vir especificado com o uso de colchetes ([ ]) Segmento padrão é DS 0001H AX Memória Operando 1 1235H AX Operando 1
ADD
AX,
[BP + SI + 8]
ADD AX BP Reg 1 Base 12H 34H 00H 00H DS + 30CH DS + 30DH Operando 2 DS + 30BH DS + 30AH 0300H BP SI Índice 0004H SI + 8 Offset 8Modo Base Indexado Escalar
Modo utilizado para gerar endereços de 32 bits, o
operando na memória é o resultado da soma dos
endereços do segmento, do registrador de base, e do
registrador de índice multiplicado for um fator escalar
Fator pode ser 1,2,4,8
00000001H EAX
Memória Operando 1
00001235H EAX Operando 1
ADD
EAX,
[EBX][ECX *4]
ADD EAX EBX Reg 1 Base 00H 00H 12H 34H DS + 322H DS + 323H Operando 2 DS + 321H DS + 320H 00000300H EBX ECX Índice 00000008H ECX + 4 Fator 4 *
Modo de Endereçamento de Portas
Específico para E/S, o operando é dado pelo endereço
(imediato) de uma porta ou é dado pelo endereço contido
pelo registrador DX
0001H AX Porta 80H Operando 1 0012H AX Operando 1IN
AX,
DX
IN AX DXReg 1 Reg de Porta
0012H
Operando 2
80H DX
OUT
40H
,AX
OUT AX 40H
Reg 1 Imed de Porta
Porta 40H 0012H
Chapter 2 — Instructions: Language of the Computer — 26
Formato de Instrução do x86
Formatos com tamanhos
variados
Chapter 2 — Instructions: Language of the Computer — 27
Formato de Instrução do x86 – Bytes Prefixados
– Bytes pré-fixados modificam operação
Chapter 2 — Instructions: Language of the Computer — 28
Chapter 2 — Instructions: Language of the Computer — 29
Formato de Instrução do x86 – Bytes Pós-Fixados
Chapter 2 — Instructions: Language of the Computer — 30
Chapter 2 — Instructions: Language of the Computer — 31
Algumas Conclusões sobre x86
Instruções complexas tornam implementação difícil
– Hardware traduz instruções para micro-operações mais simples
Instruções simples: 1–1
Instruções complexas : 1–muitos
– Microengine similar ao RISC
– Mercado torna o processador economicamente viável
Desempenho comparável ao RISC
– Compiladores evitam instruções complexas