Organiza ção e Arquitetura de computadores -...

18
Organiza Organizaç ão e Arquitetura ão e Arquitetura de computadores de computadores Prof. Dr. Luciano José Senger Instruções: a linguagem de máquina Conte Conteúdo 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 Introdu Introduç ão ão • Para controlar o hardware do computador, é necessário falar a sua linguagem • 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 Introdu Introduç ão ão É 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 Burks, Goldstine e von Neumann, 1947 • 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) Introdu Introduç ão ão Introdu Introduç ão ão 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 Fetch Decode Exec CPU Control Datapath Memory Devices Input Output • 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

Transcript of Organiza ção e Arquitetura de computadores -...

Page 1: Organiza ção e Arquitetura de computadores - deinfo.uepg.brdeinfo.uepg.br/~ljsenger/2006/orgearq/org2.pdf · Organiza ção e Arquitetura de computadores Prof. Dr. Luciano JoséSenger

OrganizaOrganizaçção e Arquitetura ão e Arquitetura de computadoresde computadores

Prof. Dr. Luciano José Senger

Instruções: a linguagem de máquina

ConteConteúúdodo• 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

IntroduIntroduççãoão

• Para controlar o hardware do computador, énecessário falar a sua linguagem

• 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

IntroduIntroduççãoão

• É 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– Burks, Goldstine e von Neumann, 1947

• 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, SiliconGraphics, 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)

IntroduIntroduççãoão IntroduIntroduççãoão

• Arquiteturas de programa armazenado

• Control necessita1. Instruções de entrada da

memória2. Sinais para controlar o fluxo de

informação entre oscomponentes do caminho de dados

3. Sequenciamento de instruções

Fetch

DecodeExec

CPU

Control

Datapath

Memory Devices

Input

Output

• 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

Page 2: Organiza ção e Arquitetura de computadores - deinfo.uepg.brdeinfo.uepg.br/~ljsenger/2006/orgearq/org2.pdf · Organiza ção e Arquitetura de computadores Prof. Dr. Luciano JoséSenger

ConteConteúúdodo

• 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

OperaOperaçções do hardware do computadorões do hardware do computador

• Todo computador precisa realizar operações aritméticasadd 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 # soma b+c é colocada em a

add a, a, d # soma b+c+d está em a

add a, a, e # soma b+c+d+e está em a

OperaOperaçções do hardware do computadorões do hardware do computador

• O número natural de operandos para uma operação de adição é três

• 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:

• Princípio de projeto 1: simplicidade favorece a regularidade

OperaOperaçções do hardware do computadorões do hardware do computador

• Contra-exemplo: IA-32 (p.e. Pentium)– ADD AX,BX

• Compilando duas instruções de atribuição C no MIPS:

a = b + c;

d = a – e;

– a tradução é realizada pelo compilador

– Em MIPS:

add a, b, c

sub d, a, e

OperaOperaçções no hardware do computadorões no hardware do computador

• Compilando uma instrução complexa no MIPSf = (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?

ConteConteúúdodo• 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

Page 3: Organiza ção e Arquitetura de computadores - deinfo.uepg.brdeinfo.uepg.br/~ljsenger/2006/orgearq/org2.pdf · Organiza ção e Arquitetura de computadores Prof. Dr. Luciano JoséSenger

OperandosOperandos no hardware do computadorno 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)

OperandosOperandos no hardware do computadorno hardware do computador

n.a.reserved for assembler1$at

yesreturn addr (hardware)31$rayesframe pointer30$fpyesstack pointer29$spyesglobal pointer28$gpnotemporaries24-25$t8 - $t9yessaved values16-23$s0 - $s7notemporaries8-15$t0 - $t7yesarguments4-7$a0 - $a3noreturned values2-3$v0 - $v1

n.a.constant 0 (hardware)0$zero

Preserve on call?

UsageRegister Number

Name

OperandosOperandos no hardware do computadorno 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

– 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

OperandosOperandos no hardware do computadorno hardware do computador

• A convenção no MIPS é usar nomes com um sinal de $ seguido de dois caracteres para representar um registrador.– $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

OperandosOperandos no hardware do computadorno hardware do computador

• Operandos na memória– 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

OperandosOperandos no hardware do computadorno hardware do computador

• A instrução que copia dados da memória para um registrador tradicionalmente é chamada de load

• 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

Page 4: Organiza ção e Arquitetura de computadores - deinfo.uepg.brdeinfo.uepg.br/~ljsenger/2006/orgearq/org2.pdf · Organiza ção e Arquitetura de computadores Prof. Dr. Luciano JoséSenger

OperandosOperandos no hardware do computadorno hardware do computador

• Compilando uma atribuição quando um operando está na memória– 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]

OperandosOperandos no hardware de computadorno hardware de computador

• Compilando uma atribuição quando um

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

OperandosOperandos no hardware do computadorno hardware do computador

• Interface hardware/software– 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

OperandosOperandos no hardware do computadorno hardware do computador

• No MIPS, palavras precisam começar em endereços que sejam múltiplos de 4 (restrição de alinhamento)

• 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

OperandosOperandos no hardware do computador 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]

OperandosOperandos no hardware do computadorno 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 storepara movimentar os dados

– O processo de colocar variáveis menos utilizadas na memória ou aquelas que só serão empregadas mais tarde é denominado spillingregisters

– 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

Page 5: Organiza ção e Arquitetura de computadores - deinfo.uepg.brdeinfo.uepg.br/~ljsenger/2006/orgearq/org2.pdf · Organiza ção e Arquitetura de computadores Prof. Dr. Luciano JoséSenger

OperandosOperandos no hardware do computadorno 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

OperandosOperandos no hardware do computadorno hardware do computador

• 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

ConteConteúúdodo

• 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

Representando instruRepresentando instruçções no computadorões no computador

• Embora quando programa-se em assembly utiliza-se 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 instruRepresentando instruçções no computadorões no computador

• Traduzindo uma instrução assembly MIPS para uma instrução de máquina:

add $t0, $s1, $s2

320818170

• 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

Representando instruRepresentando instruçções no computadorões no computador

• 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

– 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

Funct

(6 bits)

shamt

(5 bits)

rd

(5 bits)

rt

(5 bits)

rs

(5 bits)

op

(6 bits)

Page 6: Organiza ção e Arquitetura de computadores - deinfo.uepg.brdeinfo.uepg.br/~ljsenger/2006/orgearq/org2.pdf · Organiza ção e Arquitetura de computadores Prof. Dr. Luciano JoséSenger

Representando instruRepresentando instruçções no computadorões no computador

• Problemas de endereçamento– Existe um problema quando uma instrução precisa de campos

maiores do que aqueles mostrados. Por exemplo, a instrução lwprecisa 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 instruRepresentando instruçções no computadorões no computador

• Formato IConstante ou endereço

(16 bits)

rt

(5 bits)

rs

(5 bits)

op

(6 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 instruRepresentando instruçções no computadorões no computador

• Traduzindo do assembly MIPS para a linguagem de máquina– Se $t1 possui a base do array A e $s2 corresponde a h:

– A[300] = h + A[300];– É compilada para:

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.

12008935

12008943

32088180

Representando instruRepresentando instruçções no computadorões no computador

– A instrução lw é representada por 35 no opcode

– 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

– 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.

12008935

12008943

32088180

Representando instruRepresentando instruçções no computadorõ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

ConteConteúúdodo

• 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

Page 7: Organiza ção e Arquitetura de computadores - deinfo.uepg.brdeinfo.uepg.br/~ljsenger/2006/orgearq/org2.pdf · Organiza ção e Arquitetura de computadores Prof. Dr. Luciano JoséSenger

OperaOperaçções lões lóógicasgicas

• Embora o projeto do primeiros computadores se

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

nor~~NOT bit a bit

or, ori||OR bit a bit

and, andi&&AND bit a bit

srl>>>>Shift a direita

sll<<<<Shift a esquerda

Instruções MIPSOperadores JavaOperadores COperações lógicas

OperaOperaçções lões lóógicasgicas

• Operações de deslocamento (shifts)– 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

– O campo da instrução MIPS chamado de shamt (shiftamount) é usado nas instruções de deslocamento

– ssl é codificada com zeros nos campos op e funct, rdcontém $t2, rt contém $s0 e shamt contém 4

– rs não é utilizado.

0 (funct)4 (shamt)10 (rd)16 (rt)0 (rs)0 (op)

OperaOperaçções lões lóógicasgicas

• Operações de deslocamento

– O deslocamento lógico à esquerda de i bits gera o mesmo

resultado que multiplicar por 2^i

• Operações lógicas

– 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

or $t0, $t1, $t2 # $t0 = $t1 | $t2

OperaOperaçções lões lóógicasgicas

• Operações lógicas– 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)

nor $t0, $t1, $t3 # $t0 = ~($t1 | $t3)

– O MIPS oferece instruções lógicas para trabalhar com

constantes (modo de endereçamento imediato)

• AND imediato (andi)

• OR imediato (ori)

ConteConteúúdodo

• 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

InstruInstruçções para tomada de decisõesõ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

Page 8: Organiza ção e Arquitetura de computadores - deinfo.uepg.brdeinfo.uepg.br/~ljsenger/2006/orgearq/org2.pdf · Organiza ção e Arquitetura de computadores Prof. Dr. Luciano JoséSenger

InstruInstruçções para tomada de decisõesõ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 L1caso 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;

InstruInstruçções para tomada de decisõesões para tomada de decisões

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)

InstruInstruçções para tomada de decisõesõ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

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?

InstruInstruçções para tomada de decisõesões para tomada de decisões

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:

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?

InstruInstruçções para tomada de decisõesões para tomada de decisões

• Bloco básico– 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

InstruInstruçções para tomada de decisõesões para tomada de decisões

• Testes de igualdade em assembly MIPS– 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

Page 9: Organiza ção e Arquitetura de computadores - deinfo.uepg.brdeinfo.uepg.br/~ljsenger/2006/orgearq/org2.pdf · Organiza ção e Arquitetura de computadores Prof. Dr. Luciano JoséSenger

ConteConteúúdodo• 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 procedimentosSuporte 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 etapas1. Colocar parâmetros em um lugar onde o procedimento possa

acessá-lo2. Transferir o controle para o procedimento3. Adquirir os recursos de armazenamento necessários para o

procedimento4. Realizar a tarefa desejada5. Colocar o valor de retorno em um local onde o programa que

o chamou possa acessá-lo6. Retornar o controle para o ponto de origem , pois um

procedimento pode ser chamado de vários pontos de um programa

Suporte para procedimentosSuporte para procedimentos

• O software do MIPS utiliza a seguinte convenção na alocação de seus 32 registradores para chamada de procedimentos:– $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)

Suporte a procedimentos no hardwareSuporte a procedimentos no hardware

• Instrução jump-and-link (jal)– 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 hardwareSuporte a procedimentos no hardware

• Usando mais registradores– 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

Suporte a procedimentos no hardwareSuporte a procedimentos no hardware

• Compilando um procedimento em Cint 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, -12 # ajusta a pilha (3 itens)

sw $t1, 8($sp) # salva registrador

sw $t0, 4($sp) # salva registrador

sw $s0, 0($sp) # salva registrador

Page 10: Organiza ção e Arquitetura de computadores - deinfo.uepg.brdeinfo.uepg.br/~ljsenger/2006/orgearq/org2.pdf · Organiza ção e Arquitetura de computadores Prof. Dr. Luciano JoséSenger

Suporte a procedimentos no hardwareSuporte a procedimentos no hardware

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

Suporte a procedimentos no hardwareSuporte 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

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 hardwareSuporte a procedimentos no hardware

• O software do MIPS separa 18 dos registradores em dois grupos (convenção)– $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 hardwareSuporte a procedimentos no hardwareint 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

Suporte a procedimentos no hardwareSuporte a procedimentos no hardware

• Interface hardware/software– 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.

Suporte a procedimentos no hardwareSuporte a procedimentos no hardware

• Reservando espaço para novos dados na pilha– 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

Page 11: Organiza ção e Arquitetura de computadores - deinfo.uepg.brdeinfo.uepg.br/~ljsenger/2006/orgearq/org2.pdf · Organiza ção e Arquitetura de computadores Prof. Dr. Luciano JoséSenger

Suporte a procedimentos no hardwareSuporte a procedimentos no hardware

• 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

Suporte a procedimentos no hardwareSuporte a procedimentos no hardware

• Reservando espaço para novos dados no heap– 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

ConteConteúúdodo

• 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 pessoasse com as pessoas

• 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 palavraslb $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 tamnhode 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 pessoasse 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:

ComunicandoComunicando--se com as pessoasse 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

Page 12: Organiza ção e Arquitetura de computadores - deinfo.uepg.brdeinfo.uepg.br/~ljsenger/2006/orgearq/org2.pdf · Organiza ção e Arquitetura de computadores Prof. Dr. Luciano JoséSenger

ComunicandoComunicando--se com as pessoasse com as pessoas

• 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 wordpara indicar o tamanho da string

ConteConteúúdodo

• 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

EndereEndereççamento no MIPS para imediatosamento no MIPS para imediatos

• Endereçamento no MIPS para operandosimediatos e endereços 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 loadupper 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

EndereEndereççamento no MIPS para imediatosamento no MIPS para imediatos

• Carregando uma constante de 32 bits– 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

EndereEndereççamento MIPS para imediatosamento MIPS para imediatos

• Desvios condicionais e jumps– 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 modeque uma instrução de desvio pudesse calcular o seguinte:

• Contador de programa = Registrador + endereço de desvio

EndereEndereççamento do MIPS para desviosamento do MIPS para desvios

• Desvios condicionais– 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.

Page 13: Organiza ção e Arquitetura de computadores - deinfo.uepg.brdeinfo.uepg.br/~ljsenger/2006/orgearq/org2.pdf · Organiza ção e Arquitetura de computadores Prof. Dr. Luciano JoséSenger

EndereEndereççamento no MIPS para desviosamento no MIPS para desvios

• Desvios condicionais– 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.

EndereEndereççamento de desvios no MIPSamento de desvios no MIPS

• Exemplo– 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:

EndereEndereççamento de desvios no MIPSamento de desvios no MIPS

2000280020

11919880016

2218580012

0893580008

3209229080004

049190080000

EndereEndereççamento no MIPSamento no MIPS

• 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 jumpsão os 26 bits da instrução concatenados com os bits mais altos do PC

EndereEndereççamento no MIPSamento no MIPS

• 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:

ConteConteúúdodo

• 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

Page 14: Organiza ção e Arquitetura de computadores - deinfo.uepg.brdeinfo.uepg.br/~ljsenger/2006/orgearq/org2.pdf · Organiza ção e Arquitetura de computadores Prof. Dr. Luciano JoséSenger

Traduzindo e iniciando um programaTraduzindo e iniciando um programa• Hierarquia de tradução

para a linguagem C– 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.

Traduzindo e iniciando um programaTraduzindo e iniciando um programa

• Compilador– 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 programaTraduzindo e iniciando um programa

• Arquivo objeto em sistemas UNIX– 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

Traduzindo e iniciando um programaTraduzindo e iniciando um programa

• Linkeditor (link-edição)– 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.

ConteConteúúdodo

• 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

Como os compiladores otimizamComo 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

Page 15: Organiza ção e Arquitetura de computadores - deinfo.uepg.brdeinfo.uepg.br/~ljsenger/2006/orgearq/org2.pdf · Organiza ção e Arquitetura de computadores Prof. Dr. Luciano JoséSenger

Como os compiladores otimizamComo os compiladores otimizam

• Compilador– Afeta significantemente o desempenho dos programas– Transformação de alto nível: procedimentos inline

– Loop unrolling – desdobramento de loops• for (i = 0; i < 100; i++) g ();

• Depois do loop unrolling. • for (i = 0; i < 100; i += 2) { g (); g (); }

– Otimizações• Otimizações locais atuam dentro de um bloco básico• Otimizações globais atuam entre blocos básicos• Alocação de registradores

Como os compiladores otimizamComo os compiladores otimizam

• Otimizações locais– Eliminação de sub-expressões comuns

• x[i] = x[i] + 4

• O cálculo do endereço de x[] ocorre duas vezes

– Outras otimizações• 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

• Propagação de cópia: propaga valores que são cópias simples, eliminando a necessidade de ler valores

• 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 otimizamComo os compiladores otimizam• Otimizações globais

– Movimentação de código

• Encontra código que é invarianteno 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

ConteConteúúdodo

• 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 ordenaExemplo de ordenaçção na linguagem Cão na linguagem C

• O procedimento swap

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)

Exemplo de ordenaExemplo de ordenaçção na linguagem Cão na linguagem C

• O procedimento swap completo

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

Page 16: Organiza ção e Arquitetura de computadores - deinfo.uepg.brdeinfo.uepg.br/~ljsenger/2006/orgearq/org2.pdf · Organiza ção e Arquitetura de computadores Prof. Dr. Luciano JoséSenger

Exemplo de ordenaExemplo de ordenaçção na linguagem Cão na linguagem C

• O procedimento sort

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

Exemplo de ordenaExemplo de ordenaçção na linguagem Cão na linguagem C

• Código para o procedimento sort (primeiro loop)– 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 ordenaExemplo de ordenaçção da linguagem Cão da linguagem C

• Código para o procedimento sort (segundo loop)– 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]

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:

Exemplo de ordenaExemplo de ordenaçção em Cão em C

• Chamada de procedimento em sort– 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)• move $s2, $a0

• move $s3, $a1

– Depois passamos os parâmetros para swap da

seguinte forma:

• move $a0, $s2

• move $a1, $s1

Exemplo de ordenaExemplo de ordenaçção em Cão em C

• 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

– Ao final do procedimento, os registradores devem ser restaurados na ordem inversa

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)

ConteConteúúdodo• 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

Page 17: Organiza ção e Arquitetura de computadores - deinfo.uepg.brdeinfo.uepg.br/~ljsenger/2006/orgearq/org2.pdf · Organiza ção e Arquitetura de computadores Prof. Dr. Luciano JoséSenger

Vida real: instruVida real: instruçções do IAões do IA--3232

• Os projetistas– 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

Vida real: instruVida real: instruçções do IAões do IA--3232• IA-32

– 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: instruVida real: instruçções do IAões do IA--3232

• Registradores e instruções

FalFaláácias e armadilhascias e armadilhas

• 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.

ComentComentáários finaisrios finais

• Programa armazenado– 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

ComentComentáários finaisrios finais

• Instruções MIPS– 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

Page 18: Organiza ção e Arquitetura de computadores - deinfo.uepg.brdeinfo.uepg.br/~ljsenger/2006/orgearq/org2.pdf · Organiza ção e Arquitetura de computadores Prof. Dr. Luciano JoséSenger

Leituras e exercLeituras e exercíícioscios

• Leituras– Patterson, capítulo 2

• Exercícios– Patterson, capítulo 2