Conteú Conteúdo Organização e Arquitetura de computadores Instruções: a linguagem de máquina Prof. Dr. Luciano José Senger Introdução Operações no hardware do computador Operandos do hardware do computador Representando instruções no computador Operações lógicas Instruções para tomada de decisões Suporte para procedimentos no hardware do computador Comunicando-se com as pessoas Endereçamento no MIPS para operados imediatos e endereços de 32 bits Traduzindo e iniciando um programa Como os compiladores otimizam Um exemplo de ordenação na linguagem C para juntar tudo isso Vida real: instruções do IA-32 Falácias e armadilhas Comentários finais Leituras e exercícios • • • • • • • • • • • • • • • • Introduç Introdução Introduç Introdução • Para controlar o hardware do computador, é necessário falar a sua linguagem • É fácil ver, por métodos lógicos formais, que existem certos [conjuntos de instruções] que são adequados para controlar e causar a execução de qualquer seqüência de operações... As considerações decisivas, do ponto de vista atual, na seleção de um [conjunto de instruções], são mais de natureza prática: a simplicidade do equipamento exigido pelo [conjunto de instruções] e a clareza de sua aplicação para os problemas realmente importantes, junto com a velocidade com que tratam esses problemas • Palavras da linguagem do computador são chamadas de instruções = vocabulário é chamado de conjunto de instruções • Apresentação das instruções através de uma abordagem top-down • Linguagens de computadores são semelhantes (entre diferentes arquiteturas), ao contrário da linguagem dos humanos – Burks, Goldstine e von Neumann, 1947 Introduç Introdução Introduç Introdução • Conjunto de instruções (a ponta do iceberg) • • Exemplo: MIPS (http://en.wikipedia.org/wiki/MIPS_architecture) – Conjunto de instruções criados a partir da década de 80 – 100 milhões de processadores fabricados em 2002 – ATI, Broadcom, Cisco, NEC, Nintendo, Silicon Graphics, Sony, Texas Instruments e Toshiba • Processador RISC (conjunto reduzido de instruções) – – – – Tamanho de instruções fixo (fixed instruction lengths) Instruções de load-store (load-store instruction sets) Modos de endereçamento limitado (limited addressing modes) Operações limitadas (limited operations) • Arquiteturas de programa armazenado Control necessita 1. Instruções de entrada da memória 2. Sinais para controlar o fluxo de informação entre os componentes do caminho de dados 3. Sequenciamento de instruções CPU Memory Control Devices Input Datapath Output Fetch Exec Decode • Datapath tem – componentes – unidades funcionais e banco de registradores – Interconexões - componentes que são conectados de forma que as instruções possam ser executadas e os dados possam ser trazidos e armazenados na memória Conteú Conteúdo • • • • • • • • • • • • • • • • Introdução Operações no hardware do computador Operandos do hardware do computador Representando instruções no computador Operações lógicas Instruções para tomada de decisões Suporte para procedimentos no hardware do computador Comunicando-se com as pessoas Endereçamento no MIPS para operados imediatos e endereços de 32 bits Traduzindo e iniciando um programa Como os compiladores otimizam Um exemplo de ordenação na linguagem C para juntar tudo isso Vida real: instruções do IA-32 Falácias e armadilhas Comentários finais Leituras e exercícios Operaç Operações do hardware do computador • Todo computador precisa realizar operações aritméticas add a, b, c • Instrui o computador para realizar a soma entre as variáveis b e c e armazenar o resultado em a • Exemplo: colocar a soma de b, c, d, e e na variável a: • Em linguagem de alto nível a = b + c + d + e • Em Assembly MIPS: add a, b, c add a, a, d add a, a, e # soma b+c é colocada em a # soma b+c+d está em a # soma b+c+d+e está em a Operaç Operações do hardware do computador Operaç Operações do hardware do computador • O número natural de operandos para uma operação de adição é três • Contra-exemplo: IA-32 (p.e. Pentium) • Exigir que cada instrução tenha exatamente três operações nem mais nem menos, está de acordo com manter o hardware simples: o hardware para um número variável de operandos é mais complicado do que o hardware para um número fixo: • Compilando duas instruções de atribuição C no MIPS: – ADD AX,BX a = b + c; d = a – e; – a tradução é realizada pelo compilador – Em MIPS: add a, b, c • Princípio de projeto 1: simplicidade favorece a regularidade sub d, a, e Operaç Operações no hardware do computador Conteú Conteúdo • Compilando uma instrução complexa no MIPS • • • • • • • • • f = (g + h) – (i + j) • O compilador precisa desmembrar essa instrução em várias instruções assembly, pois somente uma operação é realizada por instrução MIPS add t0, g, h # var. temp. t0 contém g+h add t1, i, j # var. temp. t1 contém i+j sub f, t0, t1 # f recebe t0 – t1 • Note que uma expressão na linguagem C gera 3 instruções assembly para o MIPS • Reflexão: um número maior de instruções de máquina por expressão é melhor ou pior? • • • • • • • Introdução Operações no hardware do computador Operandos do hardware do computador Representando instruções no computador Operações lógicas Instruções para tomada de decisões Suporte para procedimentos no hardware do computador Comunicando-se com as pessoas Endereçamento no MIPS para operados imediatos e endereços de 32 bits Traduzindo e iniciando um programa Como os compiladores otimizam Um exemplo de ordenação na linguagem C para juntar tudo isso Vida real: instruções do IA-32 Falácias e armadilhas Comentários finais Leituras e exercícios Operandos no hardware do computador • Ao contrário dos programas nas linguagens de alto nível, os operandos das instruções aritméticas são restritos, precisam ser de um grupo limitado de locais especiais, embutidos diretamente no hardware, chamados registradores (registers) • Os registradores são os tijolos da construção do computador – primitivas usadas no projeto do computador e são visíveis para o programador • O tamanho dos registrados na arquitetura MIPS é 32 bits; grupos de 32 bits ocorrem com tanta freqüência no MIPS que recebem o nome de palavra (word) Operandos no hardware do computador Name $zero $at $v0 - $v1 $a0 - $a3 $t0 - $t7 $s0 - $s7 $t8 - $t9 $gp $sp $fp $ra Register Number 0 1 2-3 4-7 8-15 16-23 24-25 28 29 30 31 Usage Preserve on call? constant 0 (hardware) n.a. reserved for assembler n.a. returned values no arguments yes temporaries no saved values yes temporaries no global pointer yes stack pointer yes frame pointer yes return addr (hardware) yes Operandos no hardware do computador Operandos no hardware do computador • Uma diferença entre variáveis de um programa em linguagem de alto nível e os registradores é que o número de registradores é limitado • O computador MIPS tem 32 registradores • Princípio de projeto 2: menor significa mais rápido • A convenção no MIPS é usar nomes com um sinal de $ seguido de dois caracteres para representar um registrador. – Uma quantidade muito grande de registradores pode aumentar o tempo do ciclo de clock simplesmente porque os sinais eletrônicos levam mais tempo quando precisam atravessar uma distância maior • Deve-se equilibrar o “desejo” dos programas por mais registradores com o desejo do projetista de manter o ciclo de clock mais rápido • Um número maior de registradores necessita de um número maior de bits para representação: influência no tamanho da instrução – $S0, $S1, $T0, $T1 • Compilando uma atribuição em C usando registradores: f = (g + h) – (i + j) add $t0, $s1, $s2 add $t1, $s3, $s4 sub $s0, $t0, $t1 Operandos no hardware do computador Operandos no hardware do computador • Operandos na memória • A instrução que copia dados da memória para um registrador tradicionalmente é chamada de load – Operações aritméticas só ocorrem com os registradores nas instruções MIPS; assim o MIPS deve ter instruções que transferem os dados entre o processador e a memória: instruções de transferência de dados – Para acessar uma word na memória, é necessário passar o endereço de memória a ser utilizado • O formato da instrução load é o nome da operação seguido pelo registrador a ser carregado, depois uma constante e o registrador usado para acessar a memória. • A soma da parte constante da instrução com o conteúdo do segundo registrador forma o endereço de memória Operandos no hardware do computador Operandos no hardware de computador • Compilando uma atribuição quando um operando está na memória • Compilando uma atribuição quando um – Vamos supor que A seja uma sequência de 100 words e que o compilador tenha associado as variáveis g e h aos registradores $s1 e $s2. Vamos supor que o endereço inicial da seqüência esteja no endereço armazenado em $s3 (endereço base) g = h + A[8]; – embora haja uma única operação nessa instrução de atribuição, um dos operandos está na memória, de modo que precisamos transferir A[8] para um registrador ($s3 contém elemento base) : lw $t0, 8($s3) #registrador temporário recebe A[8] operando está na memória (cont.) – A instrução seguinte (add) pode operar sobre o valor em $t0, já que é um registrador: lw $t0, 8($s3) add $s1, $s2, $t0 – A constante na instrução é chamada de offset e o registrador acrescentado para formar o endereço é chamado de registrador base Operandos no hardware do computador Operandos no hardware do computador • Interface hardware/software • No MIPS, palavras precisam começar em endereços que sejam múltiplos de 4 (restrição de alinhamento) – Além de associar variáveis a registradores, o compilador aloca estrutura de dados, como vetores, em locais na memória – Como os bytes de 8 bits são úteis em muitos programas, a maioria das arquiteturas endereça bytes individuais – Endereços de words combinam os endereços dos 4 bytes dentro da palavra • No MIPS, palavras precisam começar em endereços que sejam múltiplos de 4 • O endereçamento em bytes afeta o índice do array: para obter o endereço em bytes de maneira apropriada o offset necessita ser igual a 4x8=32 • A instrução complementar ao load chama-se store; ela copia dados de um registrador para a memória • A instrução store é representada pelo mnemônico sw Operandos no hardware do computador • Compilando com load e store – Suponha que a variável h esteja associada ao registrador $s2 e o endereço base do vetor A esteja armazenado em $s3. Qual código assembly do MIPS para a instrução de atribuição C a seguir? – A[12] = h + A[8] – Embora seja uma instrução na linguagem C, dois operandos estão na memória; são necessárias instruções para buscar os dois operandos da memória: lw $t0, 32($s3) # reg. temp. $t0 recebe A[8] add $t0, $s2, $t0 # reg. temp. $t0 recebe h + A[8] sw $t0, 48($s3) # armazena resultado em A[12] Operandos no hardware do computador • Interface hardware/software – Muitos programas têm mais variáveis do que os computadores têm registradores – O compilador tenta manter as variáveis mais utilizadas nos registradores e coloca as restantes na memória, usando load e store para movimentar os dados – O processo de colocar variáveis menos utilizadas na memória ou aquelas que só serão empregadas mais tarde é denominado spilling registers – Registradores, apesar de serem mais reduzidos e terem um tamanho menor que a memória principal, são mais rápidos: isso define a preocupação com a utilização correta dos registradores • Constantes ou operandos imediatos – Muitas vezes, os valores que necessitam ser trabalhados são passados na instrução como constantes, e não como endereços de memória; quando os dados são passados dessa forma, como constantes, é utilizado o modo de endereçamento imediato Operandos no hardware do computador Operandos no hardware do computador • Trabalhando com constantes – Usando apenas instruções, teríamos de ler uma constante da memória para utilizá-la: lw $t0, EndConstante4($s1) add $s3, $s3, $t0 – Supondo que EndConstante4 seja o endereço de memória para a constante 4 – Uma alternativa que evita a instrução load, e assim uma leitura em memória, é oferecer instruções aritméticas em que o operando seja uma constante – Essa instrução (no caso de uma soma) é chamada de add imediato, ou addi: addi $s3, $s3, 4 # $s3 = $s3 + 4 Conteú Conteúdo • • • • • • • • • • • • • • • • • Trabalhando com constantes (cont.) – Princípio de projeto 3: agilize os casos mais comuns – Os operandos com constantes ocorrem com bastante freqüência e, incluindo constantes dentro das instruções aritméticas, as operações tornam-se mais rápidas para serem executadas Representando instruç instruções no computador Introdução Operações no hardware do computador Operandos do hardware do computador Representando instruções no computador Operações lógicas Instruções para tomada de decisões Suporte para procedimentos no hardware do computador Comunicando-se com as pessoas Endereçamento no MIPS para operados imediatos e endereços de 32 bits Traduzindo e iniciando um programa Como os compiladores otimizam Um exemplo de ordenação na linguagem C para juntar tudo isso Vida real: instruções do IA-32 Falácias e armadilhas Comentários finais Leituras e exercícios • Embora quando programa-se em assembly utilizase mnemônicos (como lw, sw, add e sub), as instruções são representadas e executadas através de um conjunto de bits • Além disso, como os registradores são parte de quase todas as instruções, é preciso haver uma convenção para mapear os nomes dos registradores em números binários – $s0 a $s7 são mapeados nos registradores de 16 a 23; – $t0 a $t7 são mapeados nos registradores de 8 a 15; • Exercício: qual é o código binário para o registrador $s7? Representando instruç instruções no computador Representando instruç instruções no computador • Traduzindo uma instrução assembly MIPS para uma instrução de máquina: add $t0, $s1, $s2 • Esse layout da instrução é chamado de formato de instrução • As instruções no MIPS tem todas 32 bits de tamanho • Os campos do MIPS 0 17 18 8 0 32 • Cada um desse segmentos de uma instrução é chamado campo; o primeiro e o último campos combinados dizem ao computador MIPS que essa instrução realiza soma • O segundo campo indica o número do registrador que é o primeiro operando de origem da operação de soma (17 = $t1) • O terceiro campo indica o outro operando de origem (18 = $t2) • O quarto campo contém o número do registrador que receberá o resultado (8 = $s0) • O quinto campo não é empregado nessa instrução op (6 bits) – – – – – – rs (5 bits) rt (5 bits) rd (5 bits) shamt (5 bits) Funct (6 bits) op: operação básica, tradicionalmente chamada de opcode rs: o registrador do primeiro operando de origem rt: o registrador do segundo operando de origem rd: o registrador do operando de destino shamt: shift amount; quantidade de deslocamento funct: função; esse campo seleciona a variante específica da operação no campo op, e as vezes, é chamado de código de função Representando instruç instruções no computador Representando instruç instruções no computador • Problemas de endereçamento • Formato I – Existe um problema quando uma instrução precisa de campos maiores do que aqueles mostrados. Por exemplo, a instrução lw precisa especificar dois registradores e uma constante; se o endereço tivesse apenas 5 bits do formato anterior, a constante estaria limitada a 32 (2^5) – Existe então um conflito entre manter entre o desejo de manter todas as instruções com o mesmo tamanho e o desejo de ter uma instrução único – Princípio de Projeto 4: um bom projeto exige bons compromissos – O compromisso escolhido pelos projetistas do MIPS é manter todas as instruções com o mesmo tamanho, exigindo assim diferentes formatos para os campos para diferentes tipos de instruções – O formato anterior é chamado de tipo R (de registrador) ou formato R. – Um segundo tipo de formato de instrução é chamado de formato I, utilizando pelas instruções imediatas e de transferência de dados. Representando instruç instruções no computador op (6 bits) rs (5 bits) rt (5 bits) Constante ou endereço (16 bits) – O endereço de 16 bits significa que uma instrução lw pode carregar qualquer word dentro de uma região de +/- 2^15 do endereço do registrador base (8192 words) – De modo semelhante, a soma imediata é limitada a constantes que não sejam maiores do que 2^15 lw $t0, 32($s3) – Aqui, 19 (para $s3) é colocado no campo rs, 8 (para $t0) é colocado no campo rt e 32 é colocado no campo de endereço (veja que o formato mudou: o campo rt especifica o registrador de destino, que recebe o resultado do lw Representando instruç instruções no computador • Traduzindo do assembly MIPS para a linguagem de máquina – A instrução lw é representada por 35 no opcode – Se $t1 possui a base do array A e $s2 corresponde a h: – A[300] = h + A[300]; – É compilada para: – O registrador base 9 ($t1) é especificado no segundo campo (rs) e o registrador de destino 8 ($t0) é especificado no terceiro campo (rt) – O offset para selecionar A[300] (1200=300x4) aparece no campo final lw $t0, 1200($t1) # reg. $t0 recebe A[300] add $t0, $s2, $t0 # reg. $t0 recebe h + A[300] sw $t0, 1200($t1) # armazena h +A[300] na mem. – A instrução add é especificada com opcode 0 e funct 32 – A instrução sw é identificada com 43 no opcode – Importante: lembre-se que os valores estão representados em decimal, mas na verdade são representados em binário. 35 9 8 0 18 8 43 9 8 1200 8 0 32 1200 Representando instruç instruções no computador • Por que o MIPS não tem uma instrução de subtração imediata? – Constantes negativas aparecem com muito menos frequência em C e Java, e por isso não são o caso comum e não merecem suporte especial – Como o campo imediato mantém constantes negativas e positivas, a soma imediata de um valor negativo é igual a subtração imediata com um número positivo, de modo que a subtração imediata é supérflua 35 9 8 0 18 8 43 9 8 1200 8 0 32 1200 Conteú Conteúdo • • • • • • • • • • • • • • • • Introdução Operações no hardware do computador Operandos do hardware do computador Representando instruções no computador Operações lógicas Instruções para tomada de decisões Suporte para procedimentos no hardware do computador Comunicando-se com as pessoas Endereçamento no MIPS para operados imediatos e endereços de 32 bits Traduzindo e iniciando um programa Como os compiladores otimizam Um exemplo de ordenação na linguagem C para juntar tudo isso Vida real: instruções do IA-32 Falácias e armadilhas Comentários finais Leituras e exercícios Operaç Operações ló lógicas Operaç Operações ló lógicas • Embora o projeto do primeiros computadores se • Operações de deslocamento (shifts) concentrasse em words completas, logo ficou claro que é útil atuar sobre campos de bits de uma word – Operações lógicas servem para empacotar e desempacotar grupos de bits em words – Movem todos os bits de uma word para esquerda ou para direita, preenchendo com zero os bits que ficaram vazios – Shift left logical: sll $t2, $s0, 4 # reg $t2 = reg $s0 << 4 bits Operações lógicas Operadores C Operadores Java Instruções MIPS Shift a esquerda << << Shift a direita >> >> AND bit a bit & & OR bit a bit | | NOT bit a bit ~ ~ sll srl and, andi or, ori nor – O campo da instrução MIPS chamado de shamt (shift amount) é usado nas instruções de deslocamento – ssl é codificada com zeros nos campos op e funct, rd contém $t2, rt contém $s0 e shamt contém 4 – rs não é utilizado. 0 (op) 0 (rs) 16 (rt) Operaç Operações ló lógicas Operaç Operações ló lógicas • Operações de deslocamento • Operações lógicas – O deslocamento lógico à esquerda de i bits gera o mesmo resultado que multiplicar por 2^i 10 (rd) 4 (shamt) 0 (funct) – Os projetistas do MIPS decidiram incluir a instrução NOR no lugar de NOT: se um operando for zero, a instrução é equivalente a NOT: • A NOR 0 = NOT (A OR 0) = NOT (A) • Operações lógicas nor $t0, $t1, $t3 # $t0 = ~($t1 | $t3) – A operação AND é útil para isolar bits de uma palavra (operações com máscara) and $t0, $t1, $t2 # $t0 = $t1 & $t2 – Para colocar um bit em 1 em um grupo de bits, pode-se utilizar a operação OR – O MIPS oferece instruções lógicas para trabalhar com constantes (modo de endereçamento imediato) • AND imediato (andi) • OR imediato (ori) or $t0, $t1, $t2 # $t0 = $t1 | $t2 Conteú Conteúdo • • • • • • • • • • • • • • • • Introdução Operações no hardware do computador Operandos do hardware do computador Representando instruções no computador Operações lógicas Instruções para tomada de decisões Suporte para procedimentos no hardware do computador Comunicando-se com as pessoas Endereçamento no MIPS para operados imediatos e endereços de 32 bits Traduzindo e iniciando um programa Como os compiladores otimizam Um exemplo de ordenação na linguagem C para juntar tudo isso Vida real: instruções do IA-32 Falácias e armadilhas Comentários finais Leituras e exercícios Instruç Instruções para tomada de decisões • O que diferencia o computador de uma calculadora simples é a capacidade de tomar decisões – Em linguagens de alto nível: if, else, goto • Instruções de desvio condicional no MIPS – Branch if equal (desvie se igual) beq registrador1, registrador2, L1 – Essa instrução significa ir até a instrução rotulada por L1 se o valor no registrador1 for igual ao valor no registrador2 – O rótulo é alterado pelo compilador por endereços de memória Instruç Instruções para tomada de decisões Instruç Instruções para tomada de decisões • Instruções de desvio condicional no MIPS – Branch if not equal (desvie se não for igual) Bne registrador1, registrador2, L1 – Significa desviar o fluxo de execução para o rótulo L1 caso os valores contidos nos registradores registrador1 e registrador2 forem diferentes • Compilando if-then-else em desvios condicionais – No segmento de código a seguir f, g, h, i e j são variáveis. Se as cinco variáveis correspondem aos cinco registradores de $s0 a $s4, qual é o código compilado para esta instrução if em C? if (i == j) f = g + h; else f = g – h; Instruç Instruções para tomada de decisões • Interface hardware/software – Compiladores criam estruturas mais próximas a linguagem humana como while, do until, etc. – Compilando um loop while em C bne $s3, $s4, Else add $s0, $s1, $s2 j Exit Else: sub $s0, $s1, $s2 Exit: A instrução j implementa o desvio incondicional (jump) Instruç Instruções para tomada de decisões While (save[i] == k) i+= 1; Suponha que i e k correspondam aos registradores $s3 e $s5 e base do vetor save esteja em $s6. Qual o código em MIPS que corresponde a esse segmento C? While (save[i] == k) i+= 1; – Suponha que i e k correspondam aos registradores $s3 e $s5 e base do vetor save esteja em $s6. Qual o código em MIPS que corresponde a esse segmento C? loop: sll $t1, $s3, 2 # $t1 = 4 * i add $t1, $t1, $s6 # $t1 = endereço de save[i] lw $t0, 0($t1) #$t0 = save[i] bne $t0, $s5, Exit # vá para Exit se save[i] <> k addi $s3, $s3, 1 # i += 1 j Loop Exit: Instruç Instruções para tomada de decisões Instruç Instruções para tomada de decisões • Bloco básico • Testes de igualdade em assembly MIPS – Uma seqüência de instruções sem desvios (exceto, possivelmente no final) e sem destinos de desvio ou rótulos de desvio (exceto, possivelmente, no início – Uma das primeiras fases da compilação é desmembrar o programa em blocos básicos • Testes de igualdade em assembly MIPS – Comparações são realizadas de forma que a instrução compara dois registradores e atribui 1 a um terceiro registrador se o primeiro for menor que o segundo; caso contrário, é atribuído 0 – Set on less than (atribuir se menor que) slt $t0, $s3, $s4 – Significa que é atribuído 1 ao registrador $t0 se o valor no registrador $s3 for menor que o valor no registrador $s4 – Operadores constantes são populares nas comparações – Como o registrador $zero sempre tem 0, pode-se comparar com zero; para comparar com outros valores, existe uma versão com endereçamento imediato da instrução slt: slti $t0, $s2, 10 # $t0 =1 se $s2 < 10 • Interface hardware/software – Os compiladores MIPS utilizam as instruções slt, slti, beq, bne e o valor fixo 0 para criar todas as condições relativas: igual, diferente, menor que, menor ou igual,maior que, maior ou igual – Assim, as construções lógicas de linguagens de alto nível, como C e Java, são mapeadas em instruções assembly de desvio condicional Conteú Conteúdo • • • • • • • • • • • • • • • • Introdução Operações no hardware do computador Operandos do hardware do computador Representando instruções no computador Operações lógicas Instruções para tomada de decisões Suporte para procedimentos no hardware do computador Comunicando-se com as pessoas Endereçamento no MIPS para operados imediatos e endereços de 32 bits Traduzindo e iniciando um programa Como os compiladores otimizam Um exemplo de ordenação na linguagem C para juntar tudo isso Arrays versus ponteiros Vida real: instruções do IA-32 Falácias e armadilhas Leituras e exercícios Suporte para procedimentos • Procedimentos ou funções – – construções das linguagens de programação que servem para estruturar programas, tornando-os mais fáceis de entender, depurar e reutilizar Seis etapas 1. Colocar parâmetros em um lugar onde o procedimento possa acessá-lo 2. Transferir o controle para o procedimento 3. Adquirir os recursos de armazenamento necessários para o procedimento 4. Realizar a tarefa desejada 5. Colocar o valor de retorno em um local onde o programa que o chamou possa acessá-lo 6. Retornar o controle para o ponto de origem , pois um procedimento pode ser chamado de vários pontos de um programa Suporte para procedimentos Suporte a procedimentos no hardware • O software do MIPS utiliza a seguinte convenção na alocação de seus 32 registradores para chamada de procedimentos: • Instrução jump-and-link (jal) – $a0 - $a3: quatro registradores de argumento, para passar parâmetros; – $v0 - $v1: dois registradores de valor, para valores de retorno – $ra: um registrador de endereço de retorno, para retornar ao ponto de origem do programa que efetuou a chamada – Além de alocar esses registradores, o assembly do MIPS inclui uma instrução apenas para os procedimentos: ela desvia para um endereço e simultaneamente salva o endereço da instrução seguinte no registrador $ra (instrução jump-and-link) – Jal EnderecoProcedimento – O “link” é armazenado no registrador $ra, denominado endereço de retorno – Implícita na idéia de programa armazenado é a necessidade de ter um registrador para manter o endereço da instrução atual que está sendo executada, chamado de contador de programa ou PC (program counter) – A instrução jal salva PC+4 no registrador $ra para o link com a instrução seguinte, a fim de preparar o retorno do procedimento – Para apoiar tais situações, computadores como o MIPS utilizam uma instrução de jump register (jr), significando um desvio incondicional para o endereço especificado no registrador: Jr $ra – Assim, o programa que chama o procedimento, coloca os valores de parâmetro em $a0 - $a3 e utiliza jal X par desviar para o procedimento X. – O procedimento X realiza as suas operações, coloca os resultados em $v0 - $v1 e retorna o controle para o caller usando jr $ra Suporte a procedimentos no hardware Suporte a procedimentos no hardware • Usando mais registradores • Compilando um procedimento em C – Suponha que um compilador precise de mais registradores para um procedimento do que os quatro disponíveis: utiliza-se a pilha (stack) • Pilha – Estrutura de dados – fila em que o último que entra é o primeiro que sai – Stack pointer é ajustado em uma word para cada registrador salvo ou restaurado • Push insere itens • Pop remove itens – O MIPS tem o registrador $sp, stack pointer, usado para salvar os registradores necessários pelo procedimento chamado – As pilhas crescem de endereços maiores para menores int exemplo_folha (int g, int h, int i, int j){ int f; f = ( g + h ) – ( i + j ); Return f; } – As variáveis de parâmetro g, h, i e j correspondem ao registradores de argumento $a0 - $a3 e f corresponde a $s0 exemplo_folha: addi $sp, $sp, itens) sw $t1, 8($sp) sw $t0, 4($sp) sw $s0, 0($sp) -12 # ajusta a pilha (3 # salva registrador # salva registrador # salva registrador Suporte a procedimentos no hardware Suporte a procedimentos no hardware • Preparando o retorno exemplo_folha: addi $sp, $sp, -12 # ajusta a pilha (3 itens) sw $t1, 8($sp) # salva registrador sw $t0, 4($sp) # salva registrador sw $s0, 0($sp) # salva registrador add $t0, $a0, $a1 # $t0 contém g+h add $t1, $a2, $a3 # $t1 contém i+j sub $s0, $t0, $t1 # f = (g+h) – (i+j) add $v0, $s0, $zero # copia f para reg. de retorno exemplo_folha: addi $sp, $sp, -12 # ajusta a pilha (3 itens) sw $t1, 8($sp) # salva registrador sw $t0, 4($sp) # salva registrador sw $s0, 0($sp) # salva registrador add $t0, $a0, $a1 # $t0 contém g+h add $t1, $a2, $a3 # $t1 contém i+j sub $s0, $t0, $t1 # f = (g+h) – (i+j) add $v0, $s0, $zero # copia f para reg. de retorno lw $s0, 0($sp) lw $t0, 4($sp) lw St1, 8($sp) addi $sp, $sp, 12 # exclui 3 itens da pilha jr $ra Suporte a procedimentos no hardware Suporte a procedimentos no hardware • O software do MIPS separa 18 dos registradores em dois grupos (convenção) int fact (int n){ if (n < 1) return(1); else return (n * fact(n-1)); } fact: addi $sp, $sp, -8 # ajusta pilha para 2 itens sw $ra, 4($sp) # salva endereço de retorno sw $a0, 0($sp) # salva o argumento n slti $t0, $a0, 1 # teste para n < 1 beq $t0, $zero, L1 # se n>= 1, desvia para L1 addi $v0, $zero, 1 # prepara o “retorna 1” addi $sp, $sp, 8 # retira dois itens da pilha jr $ra # retorna L1: addi $a0,$a0, -1 # argumento recebe n-1 jal fact # chama fact com n-1 lw $a0, 0($sp) # retorna de jal: restaura o arg. N lw $ra, 4($sp) # restaura o endereço de retorno addi $sp, $sp, 8 # ajusta pilha para remover 2 itens mul $v0, $a0, $v0 # calcula n * fact(n-1) jr $ra # retorna para o procedimento que chamou – $t0-$t9: 10 registradores temporários que não são preservados pelo procedimento chamado – $s0-$s7: 8 registradores que precisam ser preservados em uma chamada (se forem usados, o procedimento chamado os salva e restaura) • Procedimentos aninhados – A solução é empilhar os valores dos registradores que vão ser utilizados • Código que chama: empilha $a?, $t? • Procedimento chamado: empilha $ra e registradores usados por ele • Resumo: sempre é interessante empilhar registradores usados pelo procedimento Suporte a procedimentos no hardware Suporte a procedimentos no hardware • Interface hardware/software • Reservando espaço para novos dados na pilha – Uma variável em C é um local na memória, e sua interpretação depende tanto do seu tipo quanto da classe de armazenamento – A linguagem C possui duas classes de armazenamento: estáticas e automáticas – As variáveis automáticas são locais a um procedimento e são descartadas quando o procedimento termina. – As variáveis estáticas permanecem durante entradas e saídas de procedimento – As variáveis C declaradas fora de procedimentos são consideradas estáticas, assim como as variáveis declaradas dentro de procedimento com a palavra reservada static – Para simplificar o acesso aos dados estáticos, o software do MIPS reserva outro registrador, chamado de ponteiro global, e referenciado como $gp – $gp é um ponteiro global que referencia a memória para facilitar o acesso através de operações simples de load e store. – A pilha também é utilizada para armazenar variáveis que são locais ao procedimento, que não cabem nos registradores, como arrays ou estruturas locais – O segmento da pilha que contém todos os registradores salvos e as variáveis locais de um procedimento é chamado de frame de procedimento ou registro de ativação Suporte a procedimentos no hardware Suporte a procedimentos no hardware • Reservando espaço para novos dados no heap • Reservando espaço para novos dados no heap – Além de variáveis que são locais ao procedimentos, programadores precisam de espaço para variáveis estáticas e para estrutura de dados dinâmicas O segmento de um arquivo-objeto Unix que contém o código em linguagem de máquina para as rotinas do arquivo-fonte – A forma de reservar memória permite que a pilha e o heap cresçam um em direção ao outro, permitindo o uso eficiente da memória enquanto os dois segmentos aumentam e diminuem – A forma pela qual os endereços são usados são convenções do software e não fazem parte da arquitetura MIPS – A linguagem C aloca e libera espaço no heap com funções explícitas • malloc(): aloca espaço no heap • free(): libera espaço no heap Conteú Conteúdo • • • • • • • • • • • • • • • • ComunicandoComunicando-se com as pessoas Introdução Operações no hardware do computador Operandos do hardware do computador Representando instruções no computador Operações lógicas Instruções para tomada de decisões Suporte para procedimentos no hardware do computador Comunicando-se com as pessoas Endereçamento no MIPS para operados imediatos e endereços de 32 bits Traduzindo e iniciando um programa Como os compiladores otimizam Um exemplo de ordenação na linguagem C para juntar tudo isso Vida real: instruções do IA-32 Falácias e armadilhas Comentários finais Leituras e exercícios ComunicandoComunicando-se com as pessoas • Compilando um procedimento de cópia de string para demonstrar o uso de strings em C void strcpy(char x[], char y[]){ int i; i = 0; while ( (x[i] = y[i]) != ‘\0’) i += 1; } – Considerando que os endereços base para os arrays x e y são encontrados em $a0 e $a1 strcpy: addi $sp, $sp, -4 sw $s0, 0($sp) add $s0, $zero, $zero L1: • Representação de caracteres – Código ASCII de 8 bits – Computadores necessitam de instruções que realizem a movimentação de grupos de bits de palavras lb $t0, 0($sp) Sb $t0, 0($sp) – Caracteres são representados por conjuntos de strings, com geralmente três opções para representação: • A primeira posição da string é reservada para indicar o tamnho de uma string; • Uma variável acompanhante possui o tamanho da string (como uma estrutura); • A última posição da string é ocupada por um caractere que serve para marcar o final da string ( ‘\0’ na linguagem C; ‘$’ x86) ComunicandoComunicando-se com as pessoas strcpy: addi $sp, $sp, -4 sw $s0, 0($sp) add $s0, $zero, $zero L1: add $t1, $s0, $a1 # endereço de y[i] em $t1 lb $t2, 0($t1) # $t2 = y[i], como é um byte, não i * 4 add $t3, $s0, $a0 # endereço de x[i] em $t3 sb $t2, 0($t3) # x[i] = y[i] beq $t2, $zero, L2 # se y[i]== 0 , vai para L2 addi $s0, $s0, 1 # i = i + 1 j L1 L2: lw $s0, 0 ($sp) addi $sp, $sp, 4 jr $ra ComunicandoComunicando-se com as pessoas Conteú Conteúdo • Caracteres e strings em Java • • • • • • • • • – Unicode é uma codificação universal dos alfabetos da maior parte das linguagens humanas – 16 bits para representar um caractere lh $t0, 0($sp) sh $t0, 0($sp) – Ao contrário da linguagem C, Java reserva uma word para indicar o tamanho da string • • • • • • • Introdução Operações no hardware do computador Operandos do hardware do computador Representando instruções no computador Operações lógicas Instruções para tomada de decisões Suporte para procedimentos no hardware do computador Comunicando-se com as pessoas Endereçamento no MIPS para operados imediatos e endereços de 32 bits Traduzindo e iniciando um programa Como os compiladores otimizam Um exemplo de ordenação na linguagem C para juntar tudo isso Vida real: instruções do IA-32 Falácias e armadilhas Comentários finais Leituras e exercícios Endereç Endereçamento no MIPS para imediatos Endereç Endereçamento no MIPS para imediatos • Endereçamento no MIPS para operandos imediatos e endereços de 32 bits • Carregando uma constante de 32 bits – Embora manter todas as instruções com 32 bits de tamanho seja interessante, em certas situações é conveniente ter uma constante de 32 bits ou endereços de 32 bits – Embora as constantes na maioria das vezes sejam curtas e caibam em um campo de 16 bits, às vezes elas são maiores – O conjunto de instruções MIPS inclui a instrução load upper immediate (lui) especificamente para atribuir os 16 bits mais altos de uma constante a um registrador, permitindo que uma instrução subseqüente atribua os 16 bits mais baixos de uma constante – Exemplo lui $t0, 255 – Qual é o código em assembly do MIPS para carregar esta constante de 32 bits no registrador $s0? – 0000 0000 0011 1101 0000 1001 0000 0000 lui $s0, 61 ori $s0, $s0, 2304 • Endereçamento em desvios condicionais e jumps – As instruções de jump no MIPS possuem o endereçamento mais simples possível. Elas utilizam o último formato de instruções do MIPS, chamado de J, que consiste em 6 bits para o campo de operação e o restante dos bits para o campo de endereço Endereç Endereçamento MIPS para imediatos Endereç Endereçamento do MIPS para desvios • Desvios condicionais e jumps • Desvios condicionais – 26 bits são alocados para o campo de endereço (32 – 6) – Em desvios condicionais, é necessário especificar dois operandos além do endereço de desvio: 6 bits de opcode, 5 bits para registrador, 5 bits para registrador, 16 bits para endereço – Se os endereços do programa tivessem que caber nesse campo de 16 bits, nenhum programa poderia ser maior que 2**16 – Uma alternativa seria especificar um registrador que sempre seria somado ao endereço de desvio, de mode que uma instrução de desvio pudesse calcular o seguinte: • Contador de programa = Registrador + endereço de desvio – Qual registrador usar? – A resposta vem da observação de como os desvios condicionais são usados – Os desvios condicionais são encontrados em loops e em instruções if, de modo que costumam desviar para uma instrução próxima. – Por exemplo, cerca de metade de todos os desvios condicionais nos benchmarks SPEC2000 vão para locais a menos de 16 instruções – Como o contador de instruções contém o endereço da instrução atual, podemos desviar em +/- 2**15 palavras da instrução atual se o usarmos o PC como registrador a ser somado ao endereço. Endereç Endereçamento no MIPS para desvios Endereç Endereçamento de desvios no MIPS • Desvios condicionais • Exemplo – Essa forma de endereçamento é denominada endereçamento relativo ao PC – Como na maioria dos computadores atuais, o MIPS utiliza o endereçamento relativo ao PC para todos os desvios condicionais. – Instruções JAL chamam procedimentos que não tem motivos para estarem próximas à instrução atual: a arquitetura MIPS utiliza o formato longo (J) para instruções de chamada de procedimento – Como todas as instruções tem tamanho de 4 bytes, o MIPS aumenta o alcance do endereçamento interpretando o campo de endereçamento relativo a word, e não ao byte: assim, o campo de 16 bits pode se desviar para uma distância quatro vezes maior; da mesma forma, o campo de 28 bits nas instruções de jump também endereçam words. Endereç Endereçamento de desvios no MIPS – Se considerarmos que o loop inicia na posição de memória 80000, qual é o código de máquina para esse loop? loop: sll $t1, $s3, 2 # $t1 = 4 * i add $t1, $t1, $s6 # $t1 = endereço de save[i] lw $t0, 0($t1) #$t0 = save[i] bne $t0, $s5, Exit # vá para Exit se save[i] <> k addi $s3, $s3, 1 # i += 1 j Loop Exit: Endereç Endereçamento no MIPS 80000 0 0 19 9 4 0 80004 0 9 22 9 0 32 80008 35 9 8 0 80012 5 8 21 2 80016 8 19 19 1 80020 2 • Resumo dos modos de endereçamento – Endereçamento de registrador: onde o operando é um registrador; – Endereçamento de base e deslocamento: onde o operando está no local de memória cujo endereço é a soma de um registrador e uma constante de instrução – Endereçamento imediato: onde o operando é uma constante dentro da própria instrução – Endereçamento relativo ao PC: onde o endereçamento é a soma do PC e uma constante na instrução – Endereçamento pseudodireto: onde o endereço de jump são os 26 bits da instrução concatenados com os bits mais altos do PC 2000 Endereç Endereçamento no MIPS Conteú Conteúdo • Interface hardware/software • • • • • • • • • – Embora as instruções estudadas tem 32 bits em tamanho, a arquitetura MIPS tem extensões de 64 bits, em resposta a necessidade de software para programas maiores • Uma única instrução pode trabalhar com modos de endereçamento diferentes: • • • • • • • Introdução Operações no hardware do computador Operandos do hardware do computador Representando instruções no computador Operações lógicas Instruções para tomada de decisões Suporte para procedimentos no hardware do computador Comunicando-se com as pessoas Endereçamento no MIPS para operados imediatos e endereços de 32 bits Traduzindo e iniciando um programa Como os compiladores otimizam Um exemplo de ordenação na linguagem C para juntar tudo isso Vida real: instruções do IA-32 Falácias e armadilhas Comentários finais Leituras e exercícios Traduzindo e iniciando um programa Traduzindo e iniciando um programa • Hierarquia de tradução para a linguagem C • Compilador – Um programa em alto nível é inicialmente compilado para um programa em assembly, e depois montado em um módulo objeto em linguagem de máquina. O link-editor combina os vários módulos com as rotinas de biblioteca para resolver todas as referências. O loader, então, coloca o código de máquina nos locais apropriados em memória, para ser executado pelo processador. – O compilador transforma o programa C em um programa em assembly, uma forma simbólica daquilo que a máquina entende. • Montador – As arquiteturas aceitam a programação em pseudo-instruções e mnemônicos, que são convertidos em linguagem de máquina pelo montador – O montador transforma o programa assembly em um arquivo objeto, que é uma combinação de instruções em linguagem de máquina, dados e informações necessárias para colocar instruções na memória – Para produzir a versão binária das instruções, precisa determinar os endereços de todos os rótulos - os montadores registram os rótulos utilizados nos desvios e nas instruções de transferência de dados por meio de uma tabela de símbolos, que contém pares de símbolo e endereço Traduzindo e iniciando um programa Traduzindo e iniciando um programa • Arquivo objeto em sistemas UNIX • Linkeditor (link-edição) – Cabeçalho: descreve o tamanho e posições das outras partes do código – Segmento de texto: código em linguagem de máquina – Segmento de dados: contém os dados alocados por toda a vida do programa (dados estáticos) – Informações de relocação: identificam instruções e words que dependem de endereços absolutos quando o programa é carregado na memória – Tabela de símbolos: contém os rótulos restantes que não estão definidos, como referências externas – Informações de depuração Conteú Conteúdo • • • • • • • • • • • • • • • • Introdução Operações no hardware do computador Operandos do hardware do computador Representando instruções no computador Operações lógicas Instruções para tomada de decisões Suporte para procedimentos no hardware do computador Comunicando-se com as pessoas Endereçamento no MIPS para operados imediatos e endereços de 32 bits Traduzindo e iniciando um programa Como os compiladores otimizam Um exemplo de ordenação na linguagem C para juntar tudo isso Vida real: instruções do IA-32 Falácias e armadilhas Comentários finais Leituras e exercícios – Colocar os módulos de código e dados simbolicamente na memória – Determinar os endereços de rótulos de dados e instruções – Remendar referências internas e externas – O linkeditor produz um arquivo executável, que tem o mesmo formato do arquivo objeto, exceto que não tem referências não resolvidas – Linkedição estática x dinâmica – Desvantagens da linkedição estática: • Rotinas de biblioteca fazem parte do código e não podem ser atualizadas • Carrega a biblioteca inteira, mesmo se parte da biblioteca nunca seja chamada – Desvantagens da linkedição dinâmica: • Execução dos programas pode se tornar mais lenta • Erros de execução em programas que necessitam de bibliotecas dinâmicas não existentes. Como os compiladores otimizam • Compiladores – Construídos considerando um conjunto de fases de otimização – Otimização: espaço de armazenamento e velocidade de execução Como os compiladores otimizam Como os compiladores otimizam • Compilador • Otimizações locais – Eliminação de sub-expressões comuns – Afeta significantemente o desempenho dos programas – Transformação de alto nível: procedimentos inline – Loop unrolling – desdobramento de loops • x[i] = x[i] + 4 • O cálculo do endereço de x[] ocorre duas vezes – Outras otimizações • for (i = 0; i < 100; i++) g (); • Depois do loop unrolling. • for (i = 0; i < 100; i += 2) { g (); g (); } • Redução de força: substitui operações complexas por outras mais simples, por exemplo um mult por um deslocamento à esquerda • Propagação de constante: encontram constantes no código e as propagam, encolhendo os valores de constante sempre que possível – Otimizações • Propagação de cópia: propaga valores que são cópias simples, eliminando a necessidade de ler valores • Otimizações locais atuam dentro de um bloco básico • Otimizações globais atuam entre blocos básicos • Alocação de registradores • Eliminação de local de armazenamento: encontra locais com armazenamento não utilizados • Eliminação de código morto: encontra fragmentos de código que nunca são utilizados – código morto ocorre com bastante freqüência. Como os compiladores otimizam Conteú Conteúdo • Otimizações globais • • • • • • • • • – Movimentação de código • Encontra código que é invariante no loop; um trecho que código que calcula o mesmo valor, independente da iteração corrente do loop; – Eliminação de variável de indução • É um combinação de transformações que reduz o trabalho na indexação de arrays • • • • • • • Introdução Operações no hardware do computador Operandos do hardware do computador Representando instruções no computador Operações lógicas Instruções para tomada de decisões Suporte para procedimentos no hardware do computador Comunicando-se com as pessoas Endereçamento no MIPS para operados imediatos e endereços de 32 bits Traduzindo e iniciando um programa Como os compiladores otimizam Um exemplo de ordenação na linguagem C para juntar tudo isso Vida real: instruções do IA-32 Falácias e armadilhas Comentários finais Leituras e exercícios Exemplo de ordenaç ordenação na linguagem C Exemplo de ordenaç ordenação na linguagem C • O procedimento swap • O procedimento swap completo void swap(int v[], int k){ int temp; temp = v[k]; v[k] = v[k+1]; v[k+1] = temp; } sll $t1, $a1, 2 # registrador $t1 = k * 4 add $t1, $a0, $t1 # $t1 = v + (k*4) lw $t0, 0($t1) # $t0 = v[k] (temp) lw $t2, 4($t1) # $t2 = v[k+1]; sw $t2, 0($t0) # v[k] = registrador $t2 sw $t0, 4($t1) # v[k+1] = registrador $t0 (temp) swap: sll $t1, $a1, 2 # registrador $t1 = k * 4 add $t1, $a0, $t1 # $t1 = v + (k*4) lw $t0, 0($t1) # $t0 = v[k] (temp) lw $t2, 4($t1) # $t2 = v[k+1]; sw $t2, 0($t0) # v[k] = registrador $t2 sw $t0, 4($t1) # v[k+1] = registrador $t0 (temp) jr $ra Exemplo de ordenaç ordenação na linguagem C Exemplo de ordenaç ordenação na linguagem C • O procedimento sort • Código para o procedimento sort (primeiro loop) void sort(int v[], int n){ int i, j; for(i=0; i < n; i++){ for(j=i-1; j >=0 && v[j] > v[j+1]; j --){ swap(v,j); } } • Alocação de registradores para sort – Os dois parâmetros do procedimento sort, v e n, estão nos registradores de parâmetro $a0 e $a1, e alocamos o registrador $s0 a i e o registrador $1 a j – loops são compostos de 3 partes: • Inicialização das variáveis de controle • Teste da condição de controle • Incremento da variável de controle move $s0, $zero #i=0 For1tst: slt $t0, $s0, $a1 beq $t0, $zero, exit1 ... addi $s0, S0,1 j for1slt exit1 Exemplo de ordenaç ordenação da linguagem C Exemplo de ordenaç ordenação em C • Código para o procedimento sort (segundo loop) • Chamada de procedimento em sort – for(j=i-1; j >=0 && v[j] > v[j+1]; j --) – Teste de loop composto de duas partes: • J >-0 • V[j] > v[j+1] – swap(i,j) – jal swap • Passando parâmetros em sort – Os procedimentos sort e swap utilizam como parâmetros os registradores $a0, $a1 – É necessário então salvar os registradores em $s2 e $3 antes da chamada do procedimento (melhor que salvar na pilha) addi $s1, $1, -1 #j=i-1 For2tst: slti $t0, $1, 0 # $t0 = 1 se j < 0 bne $t0, $zero, exit2 sll $t1, $s1, 2 # $t1 = j * 4 add $t2, $a0, $t1 # $t2 = v + (j+4) lw $t3, 0($t2) # $t3 = v[j] lw $t4, 4($t2) # $t4 = v[j+1] slt $t0, $t4, $t3 # $t0 $t4 >= $t3 beq $t0, $zero, exit2 ... (corpo do for 2) add $1, $1, -1 # j -= 1 j for2tst exit2: • move $s2, $a0 • move $s3, $a1 – Depois passamos os parâmetros para swap da seguinte forma: • move $a0, $s2 • move $a1, $s1 Exemplo de ordenaç ordenação em C Conteú Conteúdo • Preservando registradores em sort • • • • • • • • • – Deve-se salvar o endereço de retorno $ra (lembre-se que são loops aninhados) – O procedimento sort também utiliza registradores salvos, de modo que precisam ser salvos addi $sp, $sp, -20 # 5 registradores sw $ra, 16($sp) # salva $ra na pilha sw $s3, 12($sp) # sala $s3 na pilha sw $s2, 8($sp) sw $s1, 4($sp) sw $s0, 0($sp) – Ao final do procedimento, os registradores devem ser restaurados na ordem inversa • • • • • • • Introdução Operações no hardware do computador Operandos do hardware do computador Representando instruções no computador Operações lógicas Instruções para tomada de decisões Suporte para procedimentos no hardware do computador Comunicando-se com as pessoas Endereçamento no MIPS para operados imediatos e endereços de 32 bits Traduzindo e iniciando um programa Como os compiladores otimizam Um exemplo de ordenação na linguagem C para juntar tudo isso Vida real: instruções do IA-32 Falácias e armadilhas Comentários finais Leituras e exercícios Vida real: instruç instruções do IAIA-32 Vida real: instruç instruções do IAIA-32 • Os projetistas • IA-32 – Oferecem às vezes um conjunto de operações mais poderosas do que aquelas encontradas no MIPS • O objetivo é reduzir o número de instruções executadas por um programa • O perigo é que essa redução pode ocorrer ao custo da simplicidade, aumentando o tempo que um programa leva para executar, pois as instruções são mais lentas. • Essa lentidão pode ser o resultado de um ciclo de clock mais lento ou a requisição de mais ciclos de clock do que uma seqüência mais simples – Arquitetura que evoluiu ao longo do tempo, sendo produto de diferentes grupos independentes, que modificaram a arquitetura por 20 anos, acrescentando novos recursos ao conjunto de instruções original, como alguém poderia acrescentar roupas em uma mala pronta – Marcos importantes: • 1978: Intel 8086 – extensão do assembly para o 8080; arquitetura de 16 bits com registradores de 16 bits, com usos dedicados, ao contrário do MIPS, que tem registradores de propósito geral; endereçamento de memória com 20 bits • 1980: coprocessador 8087 anunciado; estende o conjunto original de instruções em 60 instruções de ponto flutuante • 1982: 80286 com endereçamento de memória de 24 bits com um modelo de proteção de memória • 1985: 80386, processador de 32 bits com novos modos de endereçamento e registradores de 32 bits • 1989-95: 80486, Pentium, ... • 1997: instruções MMX nos processadores Pentium • 1999: melhorias nas instruções SIMD e oito registradores adicionais; instruções SSE (Streaming SIMD extensions) • 2001: extensões com 144 instruções adicionais para lidar com operações multimídia, exploração da computação paralela nos chips • 2003: AMD anuncia extensões arquitetônicas para aumentar o espaço de endereçamento de memória de 32 para 64 bits, alargando os registradores para 64 bits Vida real: instruç instruções do IAIA-32 Falá Falácias e armadilhas • Registradores e instruções • Falácias – Instruções mais poderosas significam maior desempenho – Escreva em assembly para ter melhor desempenho • Armadilha – Esquecer que os endereços seqüenciais de word em máquinas com endereçamento em bytes não diferem em 1. Comentá Comentários finais Comentá Comentários finais • Programa armazenado • Instruções MIPS – Permite a construção de máquinas de propósito geral – A seleção de um conjunto de instruções que a máquina possa entender exige um equilíbrio delicado entre a quantidade de instruções necessárias para executar programas, a quantidade de ciclos de clock por instrução e a velocidade do – Princípios de projeto: • Simplicidade favorece a regularidade: instruções de mesmo tamanho e se possível com o mesmo significado quanto aos operandos • Menor é mais rápido: o desejo de velocidade é o motivo para que o MIPS tenha apenas 32 registradores • Torne os casos comuns mais velozes: alguns exemplos são os desvios em relação ao contador de programa e endereçamento imediato para constantes • Um bom projeto exige bons compromissos: exemplo é o compromisso de manter todas as instruções com o mesmo tamanho frente à necessidade de representação de constantes que necessitam de mais bits para a representação – Cada categoria de instruções MIPS está associada a construções que aparecem nas linguagens de programação • Instruções aritméticas correspondem às operações encontradas nas instruções de atribuição • Instruções de transferência de dados provavelmente ocorrerão quando se lida com estruturas de dados, como arrays e estruturas • Os desvios condicionais são usados em instruções if e em loops • Os jumps incondicionais são usados em chamadas de procedimento e retornos, e para instruções case/switch Leituras e exercí exercícios • Leituras – Patterson, capítulo 2 • Exercícios – Patterson, capítulo 2