Software Básico Arquitetura de sistemas: nível de instruções de máquina Tanembaum, capítulo 5 Sumário • • • • • Introdução: arquitetura do conj. de instruções Formato de instruções Endereçamento de memória Tipos de instruções Fluxo de controle Arquitetura do conjunto de instruções • Interface entre software e hardware ° o que é visível para o programador/compilador • Registradores • Operadores • Modos de endereçamento • Instruções com implementação eficiente • Interface limpa e flexível para compiladores • Compatibilidade é quase sempre um requisito e um peso Instruções de máquina 3 Nível ISA O nível ISA é a interface entre os compiladores e o hardware. Instruções de máquina 4 Propriedades desse nível • Praticamente independente dos detalhes de implementação do HW ° Exceto por questões de desempenho/paralelismo • Pode ser definida formalmente (SPARC) ou por uma implementação modelo (Intel) • Maioria das máquinas atuais tem pelo menos dois modos de operação ° kernel: acesso a todos os recursos da CPU ° usuário: certas operações são “barradas” Instruções de máquina 5 Modelos de memória • Qual a unidade mínima endereçável? ° Quanto menor, mais linhas de endereço ° Quanto maior, mais desperdício potencial ° Comum : 8 bits • Quais as restrições de alinhamento? ° Quanto menor, maior a flexibilidade ° Quanto maior, mais chances de otimização • Acesso a palavras não alinhadas (compatibilidade) exige hardware extra (mais área no chip, maior preço) Instruções de máquina 6 Garantias semânticas Qual a semântica de acessos a memória? • Considere-se os comandos: ° WRITE (0x1000), 13 ° READ (0x1000), R1 • Qual o valor de R1? ° Problemas de atrasos de propagação ° Reordenação de microprogramações ° Problema pior em multiprocessadores Instruções de máquina 7 Modelos de memória • Qual a semântica de acesso? ° Todas as requisições a memória são serializadas: garantia de execução correta ° Não há garantias do hardware; compilador tem que incluir instrução SYNC que bloqueia emissão de novas instruções de memória ° Meio termo: hardware detecta algumas dependências (RAW) Instruções de máquina 8 Registradores • Elementos de acesso mais rápido • Acessíveis diretamente por instruções ° Uso geral • variáveis e resultados intermediários • Intercambiáveis • Em algumas arquiteturas, registradores de “uso geral” podem exercer papéis específicos também ° Compiladores e SO podem adotar convenções adicionais Instruções de máquina 9 Registradores • Dedicados (dependentes da arquitetura) ° Program Counter (PC) ° Program Status Word (PSW): vários bits que a CPU precisa (p.ex: códigos de condição ajustados em todo ciclo da ULA) • N / Z = marcado qdo resultado foi negativo / zero • V = marcado quando resultado deu overflow • P = marcado qdo resultado deu paridade par • Vários outros ° Stack Pointer (SP) Instruções de máquina 10 Visão geral do Pentium 4 (ISA) • Longa história familiar: ° 4004->8008->8080->8086/8088->80286 ->80386>80486->Pentium->...->Xeon ° Mantém total suporte para execução de software construído para 8086/8088 (16 bits) ° Ainda tem sobras do 8080 (8 bits , 1970) ° Alterações após o 386: MMX, SSE, SSE2 Instruções de máquina 11 Visão geral do Pentium 4 (ISA) • Três modos de operação ° Modo real: executa como um 8088 ° Modo virtual: cria ambiente virtual que executa como 8086 virtual (ex: MS-DOS) ° modo protegido (4 níveis, especificado na PSW) • Nível 0: núcleo, acesso total a máquina, usado pelo SO • Nível 3: programas usuários • Níveis 1 e 2: não são usados Instruções de máquina 12 Registradores do Pentium 4 16 8 AH BH CH DH Registradores “de uso geral” Apontadores para a memória Frame Pointer Stack Pointer Registradores de segmentos (ignorados) Program Counter Program Status Word Instruções de máquina AX 8 AL BL CL DL EAX EBX ECX EDX ESI EDI EBP ESP CS SS DS ES FS GS EIP EFLAGS 13 Visão geral do Ultra Sparc III (ISA) • • • • • • Versão 9 da arquitetura SPARC (Sun, 1987) 64 bits de endereçamento (44 na prática) Organização de registradores complexa 64 registradores (32 uso geral + 32 P.F.) – 64 bits Apesar do “uso geral”, há recomendações 32 registradores de uso geral em janelas ° Cada chamada de procedimento desloca janela ° Tentativa de evitar acesso à pilha (memória) ° Se no. de janelas é ultrapassado usa a pilha Instruções de máquina 14 Registradores do UltraSPARC III Registrador Nome alt. Função R0 G0 Fixo em zero; escritas são simplesmente ignoradas R1-R7 G1-G7 Variáveis globais R8-R13 O0-O5 Parâmetros para um procedimento a ser chamado R14 SP Stack Pointer R15 O7 Rascunho R16-R23 L0-L7 Variáveis locais a um procedimento R24-R29 I0-I5 Parâmetros de entrada de um procedimento R30 FP Base do quadro na pilha (frame pointer) R31 I7 Valor de retorno de um procedimento • R24-R29 da função se tornam R8-3 das chamadas por ela • Hardware renomeia registradores a cada chamada Instruções de máquina 15 Registradores do UltraSPARC III Operação das janelas de registrador da UltraSPARC III. Instruções de máquina 16 Visão geral do 8051 (ISA) • Processador para sistemas embutidos ° Origem: 8080 com dispositivos de E/S integrados ° Idade não importa tanto, mas o custo, sim ° Originalmente: interf. serial, timers, saídas binárias ° Versões atuais podem ter USB... • Um único modo de operação • Espaços de programa e de dados separados ° Programa em ROM, dados em RAM ° Palavra = 1 byte Instruções de máquina 17 Visão geral do 8051 (ISA) • 4 conjuntos de 8 registradores de 1 byte ° Determinado por 2 bits no PSW ° Chaveados durante interrupções: importante para dispositivos de tempo real • 16 bytes de memória são endereçados por bit por instruções especiais: registrar e ajustar estado de interruptores, luzes e outros dispositivos E/S ° Processador acessa variáveis de bits sem recuperar bytes inteiros • Registradores mapeados no espaço de memória ° Acesso a endereço/ byte 0 direciona para R0 do 1o conjunto de registradores. Instruções de máquina 18 Visão geral do 8051 (ISA) IE = Habilitar/desabilitar interrupçoes IP = Nível de prioridade das interrupções TCON = controla temporizadores 0 e 1 TMOD = determina como temporizadores serão usados (a) Organização de memória (b) Principais registradores Instruções de máquina 19 Tipos de dados • Dependentes da arquitetura • CPU e instruções determinam os tipos básicos reconhecidos pelo hardware ° Numéricos: • Inteiros e ponto flutuante, tamanhos variados ° Outros: • Booleanos • Caracteres (ASCII, UNICODE) • Apontadores Instruções de máquina 20 Tipos de dados suportados pelo hardware • Intel Pentium 4 ° Inteiros c/ e s/ sinal de 8, 16 e 32 bits • Com sinal: complemento de 2 ° Inteiro decimal em código binário (BCD) 8 bits ° Ponto flutuante de 32 e 64 bits • UltraSparc ° Inteiros c/ e s/ sinal de 8, 16, 32 e 64 bits • Com sinal: complemento de 2 ° Ponto flutuante de 32, 64 e 128 bits • Intel 8051 ° Bit ° Inteiro com sinal de 8 bits Instruções de máquina 21 Sumário • • • • • Introdução: arquitetura do conj. de instruções Formato de instruções Endereçamento de memória Tipos de instruções Fluxo de controle Formatos de instruções • Cada instrução deve definir ° o quê fazer: OPCODE ° com o quê: endereçamento de dados • A CPU deve ser capaz de identificar esses campos em cada instrução • É preciso definir a relação entre tamanho de cada instrução e as palavras de memória Instruções de máquina 23 Formatos de instruções • Exemplos de combinação: ° código de operação + operandos Instrução sem endereço explícito Instrução com um endereço Instrução com dois endereços Instrução com três endereços Instruções de máquina 24 Formatos de instruções • Algumas relações possíveis entre comprimento de instrução e de palavra. Fixo, igual à palavra Fixo, fração da palavra Instruções de máquina Variável (depende do OPCODE) 25 Critérios de projeto de conjuntos de inst. • Tamanho ° espaço, veloc. de decodificação, banda de mem. ° Menor tamanho: maior número de instruções iniciadas por ciclo • Expressividade de operandos (n bits: max 2n instruções) ° modos de endereçamento • Número de bits para cada endereço ° define, por exemplo, quantos registradores usar ° Maior tamanho: resolução de memória melhor X maior memória endereçável • Ortogonalidade entre códigos e operandos ° toda operação deveria poder ser chamada com qualquer tipo de operandos Instruções de máquina 26 Formatos de instruções • Os tipos de operandos possíveis determinam modelo de programação ° LOAD/STORE ° Um end. de memória + um (dois) registrador(es) ° Diversos endereços em uma instrução • Todas as instruções podem ter o mesmo comprimento ou não (expansão de opcodes) Instruções de máquina 27 Expansão de Opcodes • Diferenciação do formato de instruções para uma mesma CPU ° Opcode de escape (Intel) • Um opcode específico define que o restante da instrução segue outro formato ° Bits de diferenciação (SPARC) • Um conjunto de bits define como o restante da instrução é interpretada para cada caso Instruções de máquina 28 Expansão de Opcodes Instrução de 16 bits : um opcode de 4 bits e três campos de endereço de 4 bits cada. Instruções de máquina 29 Expansão de Opcodes Instrução de 16 bits : um opcode de 4 bits e três campos de endereço de 4 bits cada. Compromisso entre espaço para opcodes e espaço para outras informações (endereços) Instruções de máquina 30 Formato de instruções do Pentium 4 • Ao longo da evolução da arquitetura, algumas decisões de projeto foram desastrosas, mas tiveram que ser mantidas por compatibilidade ° Extremamente variável, difícil decodificação • Até seis campos de comprimento variável ° Instruções com dois operandos: dois registradores ou registrador e memória ° Prefix byte: modifica a ação de uma instrução (ex: REP: repete instrução seguinte até ECX chegar a zero) ° 2 bytes para opcode: 0xff como código de escape • Opcode deve ser completamente decodificado para saber a qual classe a instrução pertence e o seu comprimento ° Precisa decodificar tudo antes de saber onde a próxima instrução começa Formato de instruções do Pentium 4 • Extremamente variável, difícil decodificação Bytes 0-5 1-2 Prefix OpCode 0-1 0-1 0-4 Mode SIB Displacement Códigos que mudam o efeito do comando Bits Endereço de memória 6 0-4 Immediate Constante embutida na instrução 1 1 Code Precisa ser Bits 2 3 3 decodificado Operação em ScaleIndex Base palavra/byte Endereço de Identificador para acessos indexados memória (se Bits 2 3 3 presente) é MOD REG R/M origem/destino Identificador dos operandos Instruções de máquina 32 Formato de instruções do UltraSPARC III • Todas instruções tem 32 bits, alinhadas na memória • Instrução aritmética: 2 regs fontes , 1 reg destino ° Variante: 1 constante de 13 bits com sinal ao inves de 1 reg. • LOAD: endereço de memória é dado por ° Soma de dois registradores ou soma de um registrador + constante • Poucos formatos : extremamente regular, decodificação simples ° 2 primeiros bits: determinam formato da instrução e informam ao hardware onde encontrar o resto do opcode se existir. Formato de instruções do UltraSPARC III • Extremamente regular, decodificação simples Bits Bits Bits 2 5 6 00 DEST OpCode SRC1 0 FP-OP 00 DEST OpCode SRC1 1 Immediate const. Immediate (-4096..4095) 2 5 3 01 DEST OP 2 1 5 2 11 1 8 5 SRC2 3 register 22 Immediate constant 3 SETHI (22 superior bits) 22 10 A COND OP Bits 5 PC-relative displacement Conditional branches 30 PC-relative displacement Instruções de máquina CALL 34 Formato de instruções do 8051 • Extremamente simples; 1, 2 ou 3 bytes: Incrementar acumulador Instruções que envolvem acumulador + registrador (3 bits) Operando : constante imediata ou deslocamento para branch ou número de bit Saltos e chamadas a subrotinas : formato depende se memória externa é usada (maior) Operandos (8bits) = constante ou endereço de memória Instruções de máquina 35 Expansão de opcodes • Considere uma máquina com: ° palavra de memória de 36 bits ° oito registradores ° endereços de memória com 15 bits • Defina um formato de expansão de opcode com inst. de tamanho fixo (1 palavra) com: ° 7 inst. c/ 2 endereços de mem. e um registrador ° 500 inst. c/ um endereço e um registrador ° 40 inst. sem nenhum endereço, nem registrador Sumário • • • • • Introdução: arquitetura do conj. de instruções Formato de instruções Endereçamento de memória Tipos de instruções Fluxo de controle Endereçamento de memória • Modos de endereçamento: como os bits de um campo de endereço devem ser interpretados para achar o operando • Identificação dos operandos armazenados em memória • Endereço usualmente é maior que OpCode • Idealmente deve-se reduzir a instrução ° Operações limitadas a registradores ° Uso de operandos implícitos (registradores especiais) Instruções de máquina 38 Modos de endereçamento • Imediato: valor do dado na própria instrução • Direto: endereço do dado fixo na instrução • Registrador: identificado diretamente na instrução • Indireto: endereço do dado é obtido do conteúdo da posição identificada pela instrução (endereço na instrução = ponteiro) ° Referência à memória sem precisar de endereço de memória completo na instrução ° Indexado: valor de registrador + constante ° Relativo (c/ base): soma de registradores (e constante) • Pilha: endereçamento implícito Instruções de máquina 39 Endereçamento imediato • O valor a ser manipulado faz parte dos bits da própria instrução, já estando disponível • Extremamente rápido, pouco flexível • Determinação de constantes • MOV R1, #5 ° 5 seria um valor embutido como constante no código da instrução 00 DEST OpCode 01 DEST OP SRC1 1 Immediate const. Immediate (-4096..4095) Immediate constant Instruções de máquina SETHI (22 superior bits) 40 Endereçamento direto • O endereço a ser utilizado faz parte do código da instrução • O dado pode mudar, mas a posição não • Acesso a variáveis globais ° Endereços conhecidos em tempo de compilação • MOV R1, (0x1000) ° Carrega em R1 o conteúdo da posição de memória 0x1000 OPCODE REG Instruções de máquina Immediate address 41 Endereçamento de registrador • Semelhante ao endereçamento direto, mas endereço especifica registrador (não endereço de memória) que contém o dado • Simples de ser representado, pois são necessários poucos bits (32 reg.-> 5 bits) ° Mais comum: compiladores utilizam registradores para armazenar variáveis acessadas com frequência (índice de um laço) • Manipulação mais eficiente • MOV (0x1000),R13 ° R13 indica que o dado a ser guardado na posição 0x1000 deve ser obtido daquele registrador 00 DEST OPCODE OpCode REG SRC1 0 FP-OP SRC2 Immediate addres Instruções de máquina 42 Endereçamento indireto de registrador • Endereço do dado é obtido do conteúdo da posição identificada pela instrução (endereço na instrução = ponteiro) ° Referencia memória sem precisar de endereço de memória completo na instrução • Ex: soma elementos de um vetor de 1024 inteiros LOOP: MOV R1, #0 ; Acumula soma em R1, inicialmente 0 MOV R2, #A ; R2 = endereço de vetor A MOV R3, #A + 4096 ; R3 = endereço da 1a palavra depois de A ADD R1, (R2) ; Indireto de registrador via R2 para obter operando ADD R2, #4 ; Incrementa R2 de uma palavra (imediato) CMP R2, R3 ; Já terminou? BLT LOOP ; R2 < R3 : continue Instruções de máquina 43 Endereçamento indexado • O endereço do dado é obtido pela combinação de dois valores ° Endereço de base: constante (ou registrador) ° Offset: deslocamento a partir da base • Útil no acesso a vetores • MOV R1, A(R3) ° O dado a ser colocado em R1 está em uma posição de memória obtida ao se somar o endereço inicial do vetor A (uma constante) com o valor armazenado em R3 (pode ser incrementado/decrementado) Instruções de máquina 44 Endereçamento de Base Indexado • Endereço do dado é obtido pela soma dos valores de dois registradores e opcionalmente uma constante • MOV R1, (R3+R4) ° Os valores de R3 e R4 são somados e o valor resultante é usado para acessar uma posição de memória de onde o novo valor de R1 é lido Instruções de máquina 45 Endereçamento por pilha • Instruções de máquinas devem ser as mais curtas possíveis • Limite: nenhum endereço é fornecido na instrução (endereçamento implícito) • O processador tem a noção de manipulação de dados em uma pilha • Operações sempre se referem ao topo da pilha em qualquer instante (Parêntese: notação polonesa invertida) Instruções de máquina 46 Modos de endereçamento para desvios • Na definição de desvios, os métodos anteriores também se aplicam ° Endereçamento direto e indireto por registrador ° Endereçamento indexado • Além deles usa-se também modos de endereçamento relativos ao PC: ° Endereço de memória da próxima instrução é definido como um deslocamento em relação ao valor corrente do PC (modo indexado usando PC como registrador) ° Definição do deslocamento pode ser por qualquer dos modos descritos anteriormente Instruções de máquina 47 Ortogonalidade entre opcodes e modos de endereçamento • Do ponto de vista do software: quanto mais regular melhor ° Todos os opcodes devem permitir todos os modos de endereçamento (sempre que fizer sentido) ° Todos registradores (incluindo PC, SP, FP) devem estar disponíveis para todos os modos registradores Instruções de máquina 48 Ortogonalidade entre opcodes e modos de endereçamento: exemplo Projeto simples para formatos de instrução de uma máquina de três endereços com instruções de 32 bits Instruções de máquina 49 Ortogonalidade entre opcodes e modos de endereçamento: exemplo Projeto simples para os formatos de instrução de uma máquina de dois endereços que podem ser de 32 bits cada (pode usar uma palavra de memória para cada operando). Instruction fetch: 96 bits Ex: somar palavra de memória a registrador, registrador a registrador, palavra de memória a palavra de memória MODE + REG + OFFSET : 1 operando MODE: 3 bits : até 8 modos de endereçamento palavras extras para endereçamento direto Instruções de máquina 50 Modos de endereçamento nas CPUs • Pentium 4: muito irregulares e diferentes (instr. 16 ou 32 bits) ° Imediato, direto, registrador, indireto de registrador, indexado, e modo especial para endereçar elementos de vetores (SIB) ° Nem todos os modos se aplicam a todas as instruções e nem todos os registradores podem ser usados em todos os modos ° Tarefa do compilador fica + difícil, código pior Instruções de máquina 51 Modos de endereçamento nas CPUs • UltraSparc III: ° todas instruções usam endereçamento imediato ou de modo registrador, exceto as que endereçam memória ° Load/Store: endereçamento de base indexado (endereço calculado pela soma de 2 regs) ou indexado tradicional • 8051: razoavelmente regular (5 modos) ° modo implícito (uso do acumulador implícito no opcode) ° modo registrador, direto, indireto de registrador, imediato ° acesso a memória externa: indireto via registrador especial de 16 bits Instruções de máquina 52 Modos de endereçamento necessários • Na prática não são necessários muitos modos de endereçamento ° + importante para compilador: poucas opções mas que sejam claras • Endereçamento imediato, direto, registrador e indexado são suficientes • Outros métodos simplificam a programação mas complicam o processador ° Muitos métodos criam dilema na escolha da forma de representação de comandos ° VAX permitia todo tipo de operação com todo tipo de operando (ou quase) Instruções de máquina 53 Sumário • • • • • Introdução: arquitetura do conj. de instruções Formato de instruções Endereçamento de memória Tipos de instruções Fluxo de controle Tipos de instruções • Movimentação de dados • Operações diádicas (combinam dois operandos em um resultado) ° Lógicas/aritméticas (inteiros e ponto flutuante IEEE 754) • Operações monádicas (um operando) ° Deslocamentos / rotações / aritméticas • Testes/comparações / Desvios (condicionais/incondicionais) • Chamadas de procedimento • Controle de laço • Entrada e saída • Especiais (estado do processador) Instruções de máquina 55 Movimentação de dados • Copiar dados de um lugar para outro ° Instrução de atribuição ° Eficiência : copiar da memória para registradores ° r<-e, e<-r, e<-e, e<-const : • 4 instruções ou 1 única instrução • Pode separar Load/Store (e <-> r) e Move (r <-> r) • MOV • XCHG • PUSH/POP r<-e, e<-r, e<-const. r<->e ( e ou r) Instruções de máquina 56 Lógicas/aritméticas/deslocamentos • • • • • • ADD, ADC (some bit vai um) r<-e, e<-r, e<-const. SUB, SBB MUL, IMUL (multiplicação sem e com sinal) DIV, IDIV NOT/AND/OR/XOR SAR,SAL (deslocamento aritméticos para direita/esquerda preserva bit sinal – importante para SAR) • SHR, SHL (deslocamento lógico para direita/esquerda, preenche com 0) • ROR,ROL • INC, DEC, CRL, NEG Instruções de máquina 57 Testes/comparações • TEST : faz AND booleano dos operandos e seta flags • CMP : comparar dois valores e desviar caso sejam iguais/diferentes/menor/maior ° Abordagem comum (Pentium e Sparc): • compara dois dados e seta bit de condição • Instrução seguinte testa bit e desvia ° Opcode pode especificar se números comparados são com ou sem sinal Instruções de máquina 58 Desvios • Jxx addr: saltos condicionais com base nos flags setados pela instrução anterior ° JNA, JNB, JBE (not above, not below, below or equal) ° JAE, JNC (above or equal, not carry) ° JE, JZ (equal, if zero) ° JNLE, JG (not less or equal, greater) ° JGE, JNL (greater or equal, not less) ° ... above/below: inteiros sem sinal less/greater: inteiros com sinal • JMP addr : salto para endereço Instruções de máquina 59 Chamadas de procedimento • Chamada de procedimento: endereço de retorno pode ser colocado em: ° Posição fixa da memória : ruim (múltiplas chamadas) ° Registrador : ruim se fixo (recursão) ° Pilha : melhor opção • CALL addr • RET ° SPARC: endereço de retorno colocado no R15 na chamada. Este se torna R31 no retorno ° Pentium: CALL salva endereço de retorno (EIP) na pilha que é posteriormente usado por RET (restaura EIP) Instruções de máquina 60 Controle de laço (a) Laço do tipo “teste no final” Instruções de máquina (b) Laço do tipo “teste no início” 61 Controle de laço • Combina controle de índice de loop com desvio condicional • LOOP ° Decrementa ECX ° If ECX ≠ 0 desvie para endereço especificado, senão executa o código imediatamente a seguir ° Forma de usar: • Carrega # de iterações em registrador ECX • Grupo de instruções do corpo de loop • Instrução LOOP com endereço alvo para a primeira instrução do corpo ° E se ECX = 0 inicialmente???? Instruções de máquina 62 Controle de laço • LOOPZ, LOOPE: testa ECX e bit ZF = 1 • LOOPNZ, LOOPNE: testa ECX e bit ZF = 0 • REP: prefix byte que faz com que instrução seja repetida até que ECX chegue a 0. Instruções de máquina 63 Exemplo de programação assembly Endereçamento indireto de registrador: um programa genérico em linguagem de montagem para calcular a soma dos elementos de um vetor. Instruções de máquina 64 Exemplo de programação assembly Programa genérico em linguagem de montagem para calcular a operação OR de Ai AND Bi para dois vetores de 1024 elementos. Instruções de máquina 65 Entrada e saída • IN • OUT Instruções de máquina 66 Instruções de entrada e saída • Troca de dados entre CPU e dispositivo • A CPU precisa endereçar dispositivos para acessar dados e para controle dos mesmos • Esse endereçamento pode ser em: ° espaço de endereçamento só para dispositivos • requer instruções especiais ° mesmo espaço de endereços que a memória • simplifica o projeto da CPU Instruções de máquina 67 Técnicas de E/S • E/S programada (Programmed I/O, PIO) ° CPU lê e escreve dados diretamente ° Requer “espera ocupada” (busy waiting) Instruções de máquina 68 Técnicas de E/S • Controlado por interrupção ° CPU acionada por interrupção para mover dados ° Libera a CPU até que a operação possa ser feita Instruções de máquina 69 Técnicas de E/S • Acesso direto à memória (DMA) ° CPU programa o dispositivo para a operação ° Interrupção é usada apenas para indicar término Instruções de máquina 70 Operações especiais • STI, CLI • STC,CLC controle do flag de inter. controle do flag de “vai um” Instruções de máquina 71 Intruções do Pentium 4 • Ler seção no livro Instruções de máquina 72 Intruções do UltraSparc III • Ler seção no livro Instruções de máquina 73 Intruções do 8051 • Ler seção no livro Instruções de máquina 74 Sumário • • • • • Introdução: arquitetura do conj. de instruções Formato de instruções Endereçamento de memória Tipos de instruções Fluxo de controle Fluxo de controle de execução • Fluxo de controle = sequência em que as instruções são executadas durante a execução do programa • Fluxo sequencial e desvios/saltos • Procedimentos (recursividade) • Co-rotinas • Traps (interrupções de software/exceções) • Interrupções (hardware) Instruções de máquina 76 Fluxo sequencial e desvios • Operadores normais: PC Tempo • Desvios (JMP, JNZ, BLT, LOOP): PC Tempo Instruções de máquina 77 Procedimentos e funções Programa Biblioteca Semelhante ao desvio com a característica que quando o procedimento termina de executar, o controle é devolvido à instrução que vem após a chamada. Instruções de máquina 78 Procedimentos e funções • Código chamador salva parâmetros • CALL: salva endereço seguinte (p/ retorno) ° Início: • salva FP (pra restaurar pilha no retorno) • aloca variáveis locais (cria o quadro de pilha) ° Final: libera variáveis locais ° Valor de retorno no acumulador (convenção) ° RETURN: recupera endereço de retorno • Código chamador libera área dos parâmetros Instruções de máquina 79 Procedimentos e funções: uso da pilha Pilha oferece melhor solução para guardar parâmetros e variáveis locais • SP: apontador da pilha ° indica o topo da pilha controlada pelo processador em um dado momento • FP/BP: apontador de quadro ° identifica o trecho da pilha que é de interesse de um dado procedimento Instruções de máquina 80 Procedimentos, funções e a pilha Ordem dos parâmetros: convenção • C: empilha-se da direita para a esquerda • No livro, usa-e da esquerda para a direita ° Nas transparências a seguir usa-se C Instruções de máquina 81 Procedimentos, funções e a pilha Identificação do quadro: BP/FP • Registrador aponta “para o quadro” • Exatamente qual o ponto de referência, varia ° Em C (e outras) na arq. Intel: meio do quadro • Ao entrar na função, salva-se FP na pilha • Usa-se o SP naquele momento como base para atualizar FP (novo quadro em cima do anterior) ° No livro, figuras usam apontador para o início Instruções de máquina 82 Procedimentos, funções e a pilha Recursividade: • Cada chamada enxerga quadro diferente • Seqüência de chamadas empilhadas: ° Quadros empilhados ° Cada quadro mantém estado próprio • valores das suas variáveis locais • valores dos parâmetros da sua chamada • endereço de retorno Instruções de máquina 83 Utilização da pilha Exemplo: o problema da Torres de Hanói Configuração inicial para o problema Torres de Hanói para cinco discos. Instruções de máquina 84 Utilização da pilha Exemplo: o problema da Torres de Hanói Etapas requeridas para resolver o problema Torres de Hanói para três discos. Instruções de máquina 85 Procedimentos, funções e a pilha void towers( int n, int i, int j ) { int k; if (n==1) printf( “Move de %d p/ %d\n”, i, j ); else { k = 6 -i - j ; towers( n-1, i, k ); towers( 1, i, j ); towers( n-1, k, j ); } } Instruções de máquina 86 Procedimentos, funções e a pilha _towers: PUSH BP MOV BP,SP SUB SP,2 void towers( int n, int i, int j ) { int k; } if (n==1) printf( “Move de %d p/ %d\n”, i, j ); Supondo else { AX=n-1, BX=i, CX=k k = 6 -i - j ; towers( n-1, i, k ); towers( 1, i, j ); towers( n-1, k, j ); } SP ; reserva k PUSH PUSH PUSH CALL ADD CX BX AX _towers SP,6 ; limpa a pilha MOV POP RET SP,BP BP ; retira var. loc. k FP Old FP Ret addr n=3 i=1 Quadro anterior j=3 Instruções de máquina torres(3,1,3) Pilha cresce para endereços menores na memória 87 Procedimentos, funções e a pilha void towers( int n, int i, int j ) { int k; SP k FP Old FP Ret addr nj = 3 i=1 } if (n==1) printf( “Move de %d p/ %d\n”, i, j ); else { k = 6 -i - j ; towers( n-1, i, k ); towers( 1, i, j ); SP k towers( n-1, k, j ); FP Old FP } Ret addr k=3 FP Old FP Ret addr k=3 Old FP Ret addr n=2 n=2 i=1 i=1 j=2 j=2 k=2 k=2 Old FP Old FP Ret addr Ret addr n=3 nj = 3 i=1 i=1 i=1 j=3 j=3 torres(3,1,3) torres(2,1,2) torres(3,1,3) torres(2,1,2) torres(1,1,3) torres(3,1,3) Instruções de máquina SP n=3 j=3 Quadro anterior j=1 FP 88 Exemplo detalhado • O livro apresenta o código detalhado para a implementação do problema das Torres de Hanói em instruções do Pentium 4 e do UltraSparc III ° Atente para as instruções NOP e na passagem de parâmetro no código da UltraSparc III Instruções de máquina 89 Co-rotinas • Seqüências de execução interligadas por chamadas, mas cada seqüência sempre mantém o registro de onde parou • Passagem de controle de uma co-rotina para outra retoma a execução sempre no último ponto de parada (RESUME) • Diferença pra procedimento: assimetria ° A chama B (CALL B): B é executado a partir do início ° Quando B retorna, o controle volta para a instrução seguinte a CALL B Instruções de máquina 90 Co-rotinas Co-rotina A Co-rotina B Simulação de processamento paralelo em uma única CPU Instruções de máquina 91 Interrupções • Eventos internos interrompem a seqüência de execução normal • Estado do processador pode ser armazenado para ser retomado após o tratamento da mesma • Troca de contexto é controlada pelo HW Instruções de máquina 92 Interrupções: ações do hardware • Controlador de dispositivo ativa linha de interrupção no barramento • CPU ativa sinal de reconhecimento de interrupção no barramento • Controlador colocar um identificador (vetor de interrupção) nas linhas de dados • CPU retira vetor de interrupção • CPU Armazena o PC e PSW na pilha • Busca o endereço do tratador de interrupção em uma tabela prédefinida ° Usa vetor de interrupção como índice • Faz uma chamada ao código do tratador Instruções de máquina 93 Interrupções: ações do software • Tratador salva o contexto do processador (registradores) para posterior recuperação • Determina a causa da interrupção (pode exigir a leitura de flags externos) ° Vetor de interrupção compartilhado por todos os dispositivos de um tipo (ex: disco) ° Número do dispositivo: lido de algum registrador de dispositivo • Reage ao evento externo ° Pode implicar na atualização de estado do processo (variáveis globais, não do processador) • Retorna do tratador ° HW recupera o estado do processador (restaura registradores salvos) ° Executa RETURN FROM INTERRUPT: • CPU volta ao modo e estado anterior Instruções de máquina 94 Interrupções: transparência • Programas em execução não percebem o momento de uma interrupção • Quando tratamento de interrupção termina, computador retorna exatamente ao mesmo estado que estava antes da interrupção • Quaisquer efeitos devem ser observados pela inspeção de variáveis globais Instruções de máquina 95 Exceções (traps) • Eventos excepcionais na execução do SW • Gera o equivalente a uma interrupção ° Entretanto, é comandada pelo SW • E detectada pelo hardware ou microprograma (+ rápido do que programador ter que testar a cada operação aritmética) ° Ex: overflow, proteção contra violação, tentativa de iniciar dispositivo de E/S inexistente, divisão por zero, etc • Quando ocorre, o fluxo de controle passa para um localização fixa da memória na qual há um desvio para uma chamada do tratador de exceção Instruções de máquina 96 Traps (interrupções de software) • Síncronas com o programa ° reprodutibilidade • • • • • Ativadas por exceções nas instruções Estado do processador armazenado na pilha Transparentes (quase sempre) Retorno restaura estado do processador Podem ser registradas pelo programa Instruções de máquina 97 Interrupções • Assíncronas ° irreprodutibilidade • • • • • • Ativadas por sinal do hardware c/ identificador Estado do processador armazenado na pilha Completamente transparentes Retorno deve restaurar estado do processador Classificadas em níveis de prioridade Em níveis, com bloqueio hierárquico Instruções de máquina 98 Múltiplas interrupções ao mesmo tempo • Duas abordagens: ° Todo tratador de interrupção sempre desabilita interrupções ao iniciar • Simples, porém • Pode gerar problemas para dispositivos que não toleram atrasos (linha de comunicação serial) ° Designar prioridades para dispositivos de E/S • Diferentes níveis de prioridades • CPU também tem prioridade • Dispositivos com prioridade alta geram preempção Instruções de máquina 99 Interrupções com prioridades • Prioridades: RS232 > Disco > Impr. • Seqüência: impr., RS232, disco Interrupção de disco Prioridade 4 (pendente) RTI RS232 termina Ocorre interrupção de disco Interrupção RS232 Prioridade 5 Interrupção de impressora Prioridade 2 Programa do usuário RTI Disco termina RTI Impressora termina RTI Impressora RTI RS232 RTI Disco RTI Impressora usuário usuário usuário usuário Impressora Impressora Instruções de máquina Programa do usuário Pilha 100 Problemas do Pentium e o Itanium • ISA IA-32 da Intel (Pentium): no limite do desempenho ° ISA CISC com instruções com comprimento variável, muitos formatos diferentes de difícil decodificação rápida: ruim para tecnologia corrente (exige regularidade) ° Microprogramação CISC->RISC: + hardware (+ área no chip), + tempo, projeto + complexo (+ caro) ° Maioria das instruções referencia memória (gap CPU/memória) ° Poucos registradores (irregulares): • acessos a memória constantes • muitas dependências no pipeline (WAR) ° Velocidade vem do pipeline longo: previsão de branch é crítico ° Endereços de 32 bits limitam programas individuais a 4GB de memória Instruções de máquina 101 Problemas do Pentium e o Itanium “Uma enorme fração de todos os transistores do Pentium 4 é dedicada a decompor instruções CISC, distinguir o que pode ser feito em paralelo, resolver conflitos, fazer previsões, sanar as consequências de previsões incorretas e outros controles, sobrando uma quantidade surpreendentemente pequena deles para executar o trabalho real que o usuário solicitou” • Nova arquitetura IA-64 (Intel + HP) ° Máquina completa de 64 bits: ruptura em relação a Pentium ° Máquina RISC de última geração, com paralelismo, do tipo carregue/armazene, e três endereços ° Primeira implementação: série Itanium (Itanium 2) Instruções de máquina 102 IA-64 • Computação por instrução explicitamente paralela ° Trabalho de reordenar instruções, alocar registradores, escalonar unidades funcionais é passado todo para o compilador • Redução de referências à memória ° ° ° ° 128 registradores de uso geral de 64 bits 128 registradores de ponto flutuante 64 registradores de bits (predicação) Janelas de registradores com tamanho variável em função da necessidade dos procedimentos • Cada procedimento tem acesso a 32 registradores estáticos + um número variável de registradores de alocação dinâmica ° Vários outros registradores Instruções de máquina 103 IA-64 • Escalonamento das instruções feito pelo compilador ° Grupos de instrução: instruções dentro de um grupo não entram em conflito, não geram dependências, podem ser escalonadas juntas ° CPU está livre para escalonar instruções dentro de um grupo como preferir (sem preocupações com conflito) • Instruções LOAD especulativas : adianta execução de LOADs para que resultados estejam disponíveis quando necessários Instruções de máquina 104 IA-64 • Tratamento especial para desvios condicionais: predicação ° A execução de toda instrução é condicionada (não existe desvio) ° Teste embutido na instrução: • campo extra de 6 bits selecionado um dos 64 registradores de 1 bit (predicado) ° Instrução if <teste> then S1 else S2 • Se teste = V marca um dos registradores (P4) com 1 • Automaticamente, se teste = F marca P5 (emparelhado com P4) com 1 • Codifica S1 usando instruções predicadas em relação a P1 • Codifica S2 usando instruções predicadas em relação a P2 Instruções de máquina 105 IA-64 if (R1 == R2) R3 = R4 + R5; else R6 = R4 – R5; CMP R1, R2 BNE L1 MOV R3, R4 ADD R3 ,R5 BR L2 L1: MOV R6, R4 SUB R6, R5 L2: CMPEQ R1, R2, P4 <P4> ADD R3, R4, R5 <P5> SUB R6, R4, R5 Todas instruções são sempre alimentadas no paralelismo e executadas em sequência. No final do paralelismo, verifica-se se o predicado é verdadeiro. Se for, os resultados são escritos de volta no registrador de destino. Caso contrário, a instrução não tem efeito nenhum. Instruções de máquina 106