Você está na página 1de 26

26

Captulo 4 O Conjunto de Instrues do Processador


O conjunto de instrues um dos pontos centrais na arquitetura de um processador. Vrios aspectos na definio e implementao da arquitetura so influenciados pelas caractersticas do conjunto de instrues. Por exemplo, as operaes realizadas pela unidade lgica e aritmtica, o nmero e funo dos registradores e a estrutura de interconexo dos componentes da seo de processamento. Alm disso, as operaes bsicas que acontecem dentro da seo de processamento dependem das instrues que devem ser executadas. O conjunto de instrues afeta o projeto da seo de controle. A sua estrutura e a sua complexidade so determinadas diretamente pelas caractersticas do conjunto de instrues. Este captulo discute os principais aspectos de um conjunto de instrues, como tipos de operaes, operandos e modos de endereamento.

4.1 Conjunto de Instrues no Contexto de Software


A Figura 4.1 situa o conjunto de instrues do processador dentro dos diversos nveis de software existentes em um sistema de computao.
Programa em Linguagem de Alto Nvel Comandos de Alto Nvel

Compilador

Programa em Linguagem Assembly

Instrues da Arquitetura

Assembler

Linker/Loader

Programa Executvel

Figura 4.1. O conjunto de instrues dentro do contexto de software.

27

Em geral, os programas so desenvolvidos em uma linguagem de alto nvel como FORTRAN, Pascal ou C. O compilador traduz o programa de alto nvel em uma seqncia de instrues de processador. O resultado desta traduo o programa em linguagem de montagem ou linguagem de mquina (assembly language). A linguagem de montagem uma forma de representar textualmente as instrues oferecidas pela arquitetura. Cada arquitetura possui uma linguagem de montagem particular. No programa em linguagem de montagem, as instrues so representadas atravs de mnemnicos, que associam o nome da instruo sua funo, por exemplo, ADD ou SUB, isto soma e subtrao, respectivamente. O programa em linguagem de montagem convertido para um programa em cdigo objeto pelo montador (assembler). O montador traduz diretamente uma instruo da forma textual para a forma de cdigo binrio. sob a forma binria que a instruo carregada na memria e interpretada pelo processador. Programas complexos so normalmente estruturados em mdulos. Cada mdulo compilado separadamente e submetido ao montador, gerando diversos mdulos em cdigo objeto. Estes mdulos so reunidos pelo ligador (linker), resultando finalmente no programa executvel que carregado na memria. O conjunto de instrues de uma arquitetura se distingue atravs de diversas caractersticas. As principais caractersticas de um conjunto de instrues so: tipos de instrues e operandos, nmero e localizao dos operandos em instrues aritmticas e lgicas, modos de endereamento para acesso aos dados na memria, e o formato dos cdigos de instruo. Estes aspectos so analisados a seguir.

4.2 Tipos de Instrues e de Operandos


As instrues oferecidas por uma arquitetura podem ser classificadas em categorias, de acordo com o tipo de operao que realizam. Em geral, uma arquitetura fornece pelo menos trs categorias de instrues bsicas: instrues aritmticas e lgicas: so as instrues que realizam operaes aritmticas sobre nmeros inteiros (adio, subtrao) e operaes lgicas bit-a-bit (AND , OR); instrues de movimentao de dados: instrues que transferem dados entre os registradores ou entre os registradores e a memria principal; instrues de transferncia de controle: instrues de desvio e de chamada de rotina, que transferem a execuo para uma determinada instruo dentro do cdigo do programa.

28

Vrias arquiteturas oferecem outras categorias de instrues, voltadas para operaes especializadas. Dentre estas, podemos citar: instrues de ponto flutuante: instrues que realizam operaes aritmticas sobre nmeros com ponto flutuante; instrues decimais: instrues que realizam operaes aritmticas sobre nmeros decimais codificados em binrio (BCD Binary Coded Decimal ); instrues de manipulao de bits: instrues para testar ou atribuir o valor de um bit; instrues de manipulao de strings: instrues que realizam operaes sobre cadeias de caracteres (strings), tais como movimentao, comparao ou ainda procura de um caracter dentro de um string. Existem muitas diferenas entre as arquiteturas quanto s categorias de instrues oferecidas. Arquiteturas de uso geral oferecem a maioria das categorias relacionadas anteriormente. Arquiteturas destinadas para uma aplicao especfica podem oferecer outros tipos de instrues, especializadas para aquela aplicao. Um exemplo seria uma arquitetura voltada para processamento grfico, que ofereceria instrues para realizar operaes sobre pixels. Os tipos de operandos que podem ser diretamente manipulados por uma arquitetura dependem, claro, dos tipos de instrues oferecidas. A Figura 4.2 mostra como os principais tipos de dados so normalmente representados em uma arquitetura de uso geral. A Figura 4.2(a) mostra a representao de inteiros, neste exemplo particular, inteiros com 32 bits. Nmeros inteiros podem ser representados com ou sem sinal. Em um nmero inteiro com sinal, o bit mais significativo reservado para indicar o estado do sinal (positivo ou negativo). Nmeros inteiros sem sinal assumem apenas valores positivos. Algumas arquiteturas oferecem instrues especficas para aritmtica com ou sem sinal. Estas instrues diferem no modo como so alterados os bits do registrador de estado associado a ALU. Algumas linguagens de programao tornam visvel para o programador esta distino entre inteiros com ou sem sinal. Na linguagem C, por exemplo, uma varivel declarada do tipo int representada por um inteiro com sinal. Ao contrrio, variveis do tipo unsigned int so representadas por inteiros sem sinal, sendo normalmente usadas para indexar elementos de vetores. A Figura 4.2(b) mostra a representao de nmeros com ponto flutuante, com preciso simples e dupla. A diferena entre precises est no nmero de bits usados para representar a mantissa e o expoente. Atualmente, a maioria das arquiteturas que operam nmeros com ponto flutuante obedecem a um padro, denominado IEEE 754, que define a

29

representao e um conjunto de operaes aritmticas e lgicas para nmeros com ponto flutuante.

31

0 inteiro sem sinal (unsigned integer)

31 s

0 inteiro com sinal (signed integer)

(a)
31 s 63 s e 51 m e 0 m 0 ponto flutuante preciso dupla ponto flutuante preciso simples

22

(b)

7 d2 d1

0 BCD empacotado (packed BCD)

(c)

7 cn

0 c1 cadeia de caracteres

...

c2

(d)
Figura 4.2. Representao dos tipos de operandos mais comuns.

A Figura 4.2(c) mostra a representao de nmeros BCD empacotados (packed Binary Coded Decimal). Nesta representao, dois dgitos decimais codificados em binrio so representados dentro de um byte, cada dgito sendo codificado em quatro bits do byte. Finalmente, a Figura 4.2(d) mostra a representao de cadeias de caracteres, onde cada byte dentro de uma seqncia de bytes codifica um caracter segundo um certo padro (por exemplo, o padro ASCII).

30

4.3 Nmero e Localizao dos Operandos


Uma outra caracterstica de um conjunto de instrues o nmero de operandos explicitamente indicados em uma instruo aritmtica ou lgica. Em algumas arquiteturas, estas instrues referenciam explicitamente trs operandos, dois operandos-fonte e um operando-destino, como por exemplo em ADD R1, R2, R3 onde R1 e R2 so os operandos-fonte e R3 o operando-destino. Em outras arquiteturas, instrues aritmticas/lgicas especificam apenas dois operandos. Neste caso, um dos operandos-fonte tambm o operando-destino. Por exemplo, na instruo ADD R1, R2 R2 contm um dos operandos-fonte e tambm usado como operando-destino. Quanto localizao dos operandos especificados por uma instruo aritmtica/lgica, podemos encontrar arquiteturas onde podem ser realizados acessos aos operandos diretamente a partir da memria principal. Por exemplo, nestas arquiteturas podemos ter instrues tais como: ADD M1,R1,R2 ADD M1,M2,R1 ADD M1,M2,M3 onde M1, M2 e M3 so endereos de locaes de memria. Em um outro extremo, existem arquiteturas onde todos os operandos encontram-se apenas em registradores. As instrues aritmticas/lgicas so todas do tipo: ADD R1,R2,R3 ADD R1,R2 A partir do nmero de operandos explicitamente referenciados e da localizao destes operandos, podemos classificar as arquiteturas nos seguintes tipos: arquiteturas memria-memria: as instrues aritmticas/lgicas usam trs operandos e todos os operandos podem estar na memria; arquiteturas registrador-memria: as instrues aritmticas/lgicas usam dois operandos, sendo que apenas um deles pode residir na memria; arquiteturas registrador-registrador: as instrues aritmticas/lgicas usam trs operandos, todos em registradores. Neste caso, apenas duas instrues acessam diretamente a memria: LOAD e STORE. A instruo LOAD carrega em um registrador um dado armazenado na memria e instruo STORE armazena na memria o contedo de um registrador.

31

Arquiteturas memria-memria e registrador-memria apresentam como vantagem um menor nmero de instrues no cdigo do programa, j que no necessrio carregar previamente em registradores os operandos-fonte de uma instruo aritmtica/lgica, como acontece em uma arquitetura registrador-registrador. Por outro lado, a existncia de instrues aritmticas/lgicas mais poderosas torna mais complexa a implementao da arquitetura. As arquiteturas Intel 80x86 e Motorola MC680x0 so do tipo registradormemria. Dentre as arquiteturas memria-memria podemos citar o DEC VAX 11.

4.4 Modos de Endereamento


Os operandos de uma instruo podem encontrar-se em registradores, na memria principal ou ainda embutidos na prpria instruo. O modo de endereamento refere-se maneira como uma instruo especifica a localizao dos seus operandos. Existem trs modos de endereamento bsicos: modo registrador: a instruo indica o nmero de um registrador de dados onde se encontra um operando (fonte ou destino); modo imediato: a instruo referencia um operando que se encontra dentro do prprio cdigo da instruo; modo implcito: a localizao do operando no est explicitamente indicada na instruo. Por exemplo, nas chamadas arquiteturas acumulador, um dos operandos-fonte e o operando-destino nas instrues aritmticas/lgicas encontra-se sempre em um registrador especial, o acumulador. Assim, no necessrio que este registrador seja explicitamente referenciado pela instruo. A Figura 4.3 mostra exemplos de instrues que usam os modos de endereamento implcito, registrador e imediato.

Modo Implcito Registrador Imediato

Exemplo ADD R1 ADD ADD R1,R2 R1,#4

Significado Ac Ac + R1 R2 R1 + R2 R1 R1 + 4

Figura 4.3. Exemplos de uso dos modos de endereamento implcito, registrador e imediato.

32

Os modos de endereamento citados referenciam apenas operandos que se encontram em registradores ou na instruo. Existem ainda os modos de endereamento usados para referenciar dados armazenados na memria principal. Entre as diferentes arquiteturas, existe uma enorme variedade de modos de endereamento referentes memria principal, e que formam, na realidade, uma classe de modos de endereamento parte. Um modo de endereamento referente memria indica como deve ser obtido o endereo da locao de memria onde se encontra o dado que ser acessado. Este endereo chamado endereo efetivo. Apesar da variedade mencionada, possvel identificar alguns modos de endereamento referentes memria que so oferecidos pela maioria das arquiteturas. Estes modos de endereamento mais comuns esto relacionados na Figura 4.4.

Modo Direto Indireto Relativo base Indexado

Exemplo ADD (100),R1 ADD (R1),R2 ADD 100(R1),R2 ADD (R1+R2),R3

Significado R1 M[100] + R1 R2 M[R1] + R2 R2 M[100+R1] + R2 R3 M[R1+R2] + R3

Uso acesso variveis estticas acesso via ponteiros acesso a elementos em estruturas acesso a elementos em um vetor

Figura 4.4. Modos de endereamento memria mais comuns.

No modo direto, o endereo efetivo um valor imediato contido no cdigo da instruo. Por exemplo, na instruo ADD (100),R1, um dos operandos encontra-se na locao de memria com endereo 100. O modo de endereamento direto usado principalmente no acesso s variveis estticas de um programa, cujo endereo em memria pode ser determinado durante a compilao do programa. No modo indireto, o endereo efetivo encontra-se em um registrador. Por exemplo, na instruo ADD (R1),R2, um dos operandos encontra-se na locao de memria cujo endereo est no registrador R1. Ou seja, o operando na memria indicado indiretamente, atravs de um registrador que contm o endereo efetivo. Este modo de endereamento usado no acesso a variveis dinmicas, cujo endereo na memria conhecido apenas durante a execuo do programa. O acesso a uma varivel dinmica realizado atravs de um ponteiro, que nada mais do que o endereo da varivel. Para realizar o acesso varivel dinmica, o ponteiro carregado em um registrador, e a instruo que acessa a varivel usa este registrador com o modo de endereamento indireto. No modo relativo base, o endereo efetivo a soma do contedo de um registrador, chamado endereo-base, com um valor imediato contido na instruo, chamado deslocamento. Por exemplo, na instruo ADD 100(R1),R2, R1 contm o endereo-base e 100 o deslocamento. O endereo efetivo do operando em memria a soma do contedo

33

de R1 com o valor 100. O modo relativo base usado no acesso a componentes de variveis dinmicas estruturadas (por exemplo, record em Pascal ou struct em C). A Figura 4.5 mostra como calculado o endereo efetivo no modo de endereamento relativo base.

~ ~
D endereo C = (ponteiro + 2) C B ponteiro A

~ ~
2 +

R1

~ ~

~ ~

Figura 4.5. Acesso a estruturas dinmicas com o modo de endereamento relativo base.

A figura mostra a localizao na memria de uma estrutura com quatro campos A, B, C e D. O endereo inicial da estrutura indicado por um ponteiro, que torna-se conhecido apenas durante a execuo do programa. No entanto, a posio de cada campo em relao ao incio da estrutura fixo, sendo conhecido durante a compilao. O endereo de um campo obtido somando-se a posio do campo (o deslocamento) ao ponteiro que indica o incio da estrutura (o endereo-base). Por exemplo, na Figura 4.5, para somar um valor ao campo C, o compilador pode usar a instruo ADD 2(R1),R2, precedida de uma instruo para carregar em R1 o endereo-base da estrutura. No modo indexado, o endereo efetivo dado pela soma de um ndice com um endereo-base, ambos armazenados em registradores. Por exemplo, na instruo ADD (R1+R2),R3, R1 contm o endereo-base, e R2 o ndice. O modo indexado normalmente usado no acesso aos elementos de um vetor. A Figura 4.6 mostra como calculado o endereo efetivo no modo de endereamento indexado.

34

~ ~

~ ~

ponteiro + 10

v[10]

. . .

R1

v[1] ponteiro + 1 ponteiro ~ ~ v[0] ~ ~

. . .

R2=10

R1

R2=0

Figura 4.6. Acesso aos elementos de um vetor com o modo de endereamento indexado.

A Figura 4.6 representa a localizao na memria de um vetor V. Um ponteiro indica o endereo-base do vetor, onde se encontra o primeiro elemento. O endereo de cada elemento obtido somando o ndice do elemento ao endereo-base. Para realizar o acesso seqencialmente os elementos do vetor, o ndice inicialmente carregado no registrador com o valor 0. O ndice ento incrementado dentro de um loop aps o acesso a cada elemento. Por exemplo, para somar um valor em registrador aos elementos do vetor, o compilador pode usar as seguintes instrues em um loop: ADD R1,(R2+R3) ADD 1,R3 onde R1 contm o valor a ser somado, R2 contm o ponteiro para o vetor e R3 o registrador com o ndice, com valor inicial 0.

4.5 Formatos de Instruo


Como mencionado no incio deste captulo, as instrues de um programa compilado so armazenadas na memria sob a forma de um cdigo em binrio, ou cdigo de instruo. Um cdigo de instruo logicamente formado por campos de bits, que contm as informaes necessrias execuo da instruo. Estes campos de bits indicam, por exemplo, qual a operao a ser realizada e quais os operandos a serem usados. A Figura 4.7 mostra um exemplo de cdigo de instruo com seus campos de bits.
01011100 codop 00001 opf1 00010 00011 opf2 opdst

Figura 4.7. Cdigo de instruo e seus campos de bits.

35

Neste cdigo de instruo, o campo codop contm o cdigo da operao a ser realizada, enquanto os campos opf1, opf2 e opdst indicam os operandos fonte e destino, respectivamente. Suponha que o cdigo 01011100 no campo codop indique uma operao de adio, e que os valores 00001, 00010 e 00011 nos campos opf1, opf2 e opdst indiquem os registradores R1, R2 e R3, respectivamente. Assim, este cdigo de instruo a representao binria da instruo ADD R1,R2,R3. O formato de instruo refere-se as caractersticas do cdigo de instruo tais como tamanho do cdigo, tipos de campos de bits e localizao dos campos de bits dentro do cdigo. Uma arquitetura se caracteriza por apresentar instrues com formato irregular ou com formato regular. No primeiro caso, as instrues podem apresentar cdigos com tamanhos diferentes, e um certo campo de bits pode ocupar posies diferentes nas instrues onde aparece. Em uma arquitetura com instrues regulares, todos os cdigos de instruo possuem o mesmo tamanho, e um certo campo de bits sempre ocupa a mesma posio nas instrues onde aparece. As arquiteturas com formatos de instruo irregular possibilitam programas com menor tamanho de cdigo executvel. Isto acontece porque aqueles campos de bits no necessrios a uma instruo so eliminados, economizando espao de armazenamento na memria. Por outro lado, arquiteturas com formatos de instruo regular apresentam uma grande vantagem quanto simplicidade no acesso s instrues. Se todas as instrues possuem um tamanho de n bits, basta que o processador realize um nico acesso de n bits memria principal para obter uma instruo completa. Considere agora um processador com cdigos de instruo com tamanho varivel. Neste caso, o processador no sabe, a priori, quantos bits deve buscar para obter uma instruo completa. Aps realizar um acesso, tornase necessrio que o processador interprete parcialmente o cdigo da instruo para determinar se deve realizar um outro acesso memria para completar a busca da instruo. A decodificao parcial e o acesso adicional podem comprometer o desempenho ao aumentar o tempo de execuo da instruo. A segunda vantagem de instrues regulares a simplicidade na decodificao das instrues. Em instrues regulares, um certo campo de bits sempre ocupa a mesma posio. Isto permite, por exemplo, que os operandos da instruo sejam acessados ao mesmo tempo em que o cdigo de operao interpretado, j que o processador conhece antecipadamente onde encontrar as informaes sobre os operandos. Em instrues irregulares, os campos que indicam os operandos podem aparecer em qualquer posio dentro do cdigo da instruo. Assim, necessrio antes interpretar o cdigo de operao, para determinar as posies dos campos de operando dentro daquele cdigo de instruo em particular. Agora, a

36

decodificao e o acesso aos operandos so realizados seqencialmente, o que contribui para aumentar o tempo de execuo das instrues.

4.6 Resumo Inicial sobre o Conjunto de Instrues do Processador


Este captulo, at este ponto, discutiu as principais caractersticas de um conjunto de instrues. Praticamente todas as arquiteturas oferecem instrues aritmticas e lgicas, instrues de movimentao de dados e instrues de transferncia de controle. A presena de outros tipos de instrues depende da orientao da arquitetura (Complex Instruction Set Computer - CISC ou Reduced Instruction Set Computer -RISC) e se est voltada para aplicaes gerais ou especficas. As arquiteturas tambm diferem quanto ao nmero de operandos e localizao destes operandos nas instrues aritmticas/lgicas. Quanto estes dois aspectos, as arquiteturas podem ser classificadas em memria-memria, memria-registrador ou registrador-registrador. O modo de endereamento a maneira como uma instruo especifica a localizao dos seus operandos. Os modos de endereamento registrador e imediato so oferecidos por praticamente todas as arquiteturas. Alguns modos de endereamento, como o relativo base e o indexado, so teis no acesso a alguns tipos de variveis normalmente encontrados em linguagens de alto nvel. O formato de uma instruo diz respeito a caractersticas dos cdigos de instruo, tais como o seu tamanho e localizao dos campos de bits. Em arquiteturas com formato de instrues regular, os cdigos de instruo possuem tamanho fixo e os campos de bits ocupam a mesma posio dentro do cdigo. Instrues regulares facilitam as operaes de busca e decodificao das instrues.

4.7 Instrues Bsicas: A Linguagem da Mquina


Para exercitar os conceitos apresentados nas sees anteriores, discutimos nesta seo o conjunto de instrues do processador MIPS. O objetivo ensinar um conjunto de instrues to simples quanto possvel, mostrando tanto a interface do conjunto de instrues com o hardware quanto relao entre as linguagens de alto nvel e o conjunto de instrues. No projeto de qualquer conjunto de instrues importante lembrar o que os projetistas tm como objetivos comuns. Os dois objetivos principais so: encontrar um conjunto de instrues que facilite tanto a construo do hardware quanto do compilador e maximizar o desempenho e minimizar o custo.

37

Para atingir estes objetivos existem quatro princpios bsicos do projeto do hardware: 1. A simplicidade favorecida pela regularidade instrues regulares; 2. Quanto menor mais rpido menor quantidade de componentes possvel; 3. Um bom projeto demanda compromisso mesmo tamanho x diferentes tipos de instruo e 4. Torne o caso comum mais rpido operaes com inteiros e transferncia entre registradores. 4.7.1 Operandos do Hardware e da Mquina Os registradores da arquitetura do processador MIPS so de 32 bits. So nesses registradores que ficam armazenados os operandos que vo ser manipulados (palavra de 32 bits). As operaes aritmticas do processador MIPS utilizam trs operandos (dois fontes e um destino). Por conveno a linguagem de montagem do MIPS usa um cifro $ seguido de dois caracteres para referenciar um registrador. Por exemplo, $s0, $s1, para os registradores que correspondem s variveis dos programas escritos em linguagem de alto nvel, e $t0, $t1, para os registradores temporrios, necessrios a traduo do programa para as instrues do MIPS. Compilao de um Comando de Atribuio em C usando Registradores O compilador responsvel pela associao entre as variveis de um programa e os registradores do hardware. Suponha o seguinte comando em linguagem de alto nvel f = (g + h) (i + j). Os mnemnicos para a soma e a subtrao do processador MIPS so iguais a add e sub, respectivamente. Como seria o cdigo em linguagem de montagem do MIPS resultado deste comando? Supondo que as variveis f, g, h, i e j so atribudas aos registradores $s0, $s1, $s2, $s3 e $s4 temos: add $t0, $s1, $s2 add $t1, $s3, $s4 sub $s0, $t0, $t1 Na verdade as linguagens de alto nvel do suporte a estruturas de dados mais complexas, como vetores (arrays). Esta estrutura, em geral, contm mais elementos que o nmero de registradores disponveis na arquitetura. Assim, estas estruturas ficam armazenadas em memria.

38

O processador MIPS s manipula dados armazenados em registradores. Dessa forma, necessrio ter instrues de acesso memria. Estas instrues no processador MIPS so denominadas lw (load word) e sw (store word). A instruo lw transfere dados da memria para o processador. A instruo sw transfere dados do processador para a memria. Compilao de um Comando de Atribuio em C com Operandos em Memria Suponha que A seja um arrays com tamanho igual a 100 palavras e que o compilador tenha associado as variveis g e h aos registradores $s1 e $s2, respectivamente. Suponha, tambm, que o endereo inicial do array esteja armazenado em $s3. Como traduzir o comando de atribuio g = h + A[8] para a linguagem de montagem do processador MIPS? Qual o modo de endereamento utilizado? lw $t0, 32 ($s3) add $s1, $s2, $t0 No processador MIPS as palavras precisam sempre comear em endereos que sejam mltiplos de 4. Esta uma restrio de alinhamento porque o tamanho da palavra igual a 4 bytes. As mquinas que endeream bytes podem ser divididas em duas categorias: big endian e little endian. Estas categorias se diferenciam em relao posio do byte que representa o endereo da palavra. Na categoria big endian o byte mais esquerda que representa o endereo da palavra, j na categoria little endian o byte mais direita. O processador MIPS pertence categoria big endian. 4.7.2 Representao de Instrues As instrues so representadas no computador como nmeros binrios. Cada parte de uma instruo, denominada campo e, pode ser considerada como um nmero separado. Esses nmeros colocados um ao lado do outro formam a instruo. Como os registradores comumente so utilizados nas instrues necessrio haver uma conveno para mapear o nome dos registradores em nmeros. Na linguagem de montagem do MIPS os nomes $s0 a $s7 so mapeados nos registradores de 16 a 23 e os nomes $t0 a $t7 nos registradores de 8 a 15. Cada um dos campos de uma instruo possui sua representao binria. No MIPS todas as instrues tm exatamente 32 bits (princpio da simplicidade). Campos das Instrues de Mquina do Processador MIPS Para simplificar a compreenso sobre o formato das instrues os campos recebem nomes.

39

- Instrues Lgicas e Aritmticas A Figura 4.8 mostra o formato de uma instruo lgica e aritmtica do processador MIPS.
31-26 25-21 rs 20-16 15-11 10-6 shmat 5-0 func 0

Tipo R

Figura 4.8. Formato de instruo lgica e aritmtica.

Estas instrues tambm so denominadas como instrues tipo R, onde os campos tm os seguintes significados: op operao bsica a ser realizada pela ALU, opcode; rs primeiro operando fonte; rt segundo operando fonte; rd operando destino, armazena resultado produzido pela ALU; shmat quantidade de bits a serem deslocados (usado em instrues de deslocamento) e func seleciona funo da operao apontada no campo op. As instrues do tipo R possuem opcode igual a 0. - Instrues de Acesso Memria A Figura 4.9 mostra o formato de uma instruo de acesso memria do processador MIPS.
31-26

25-21 rs

20-16 rt

15-0 endereo

lw/sw

35/43

Figura 4.9. Formato de instruo de acesso memria.

O formato de uma instruo de acesso memria, denominada do tipo I, mostrado na Figura 4.9 e possui os campos op, rs, rt e endereo. O campo de endereo de 16 bits maior para abranger uma extensa faixa de endereos na memria. Numa instruo de lw pode ser acessado um operando dentro de uma faixa entre o registrador base (dado pelo contedo de rs) acrescido ou decrescido de 215 (ou 32.768 palavras). Nesta instruo o campo rt possui outro significado. Ele indica o registrador que armazena o valor fornecido pela memria. O opcode da instruo lw igual a 35. Numa instruo de sw o formato da instruo idntico ao da instruo de lw. O nico campo que possui um significado diferente o campo rt que indica o registrador que possui o valor que vai ser transferido para a memria. O opcode da instruo de sw igual a 43.

40

Exemplo: Suponha o seguinte comando em linguagem de alto nvel, A[300] = h + A[300]. Uma possvel representao em linguagem de montagem do processador MIPS dada por: lw $t0, 1200 ($t1) add $t0, $s2, $t0 sw $t0, 1200 ($t1) Como podemos saber o cdigo binrio correspondente a este comando? Para facilitar o entendimento, primeiro podemos especificar cada uma dessas instrues com nmero decimais, de acordo com os seus formatos que so: op rs rt endereo lw $t0, 1200 ($t1) add $t0, $s2, $t0 35 9 8 1200 op rs rt rd shmat func 0 18 8 8 0 32 op rs rt endereo

sw $t0, 1200 ($t1) 43 9 8 1200 Em seguida, podemos traduzir cada um dos campos das instrues, definidos em nmeros decimais, para os seus respectivos correspondentes em nmeros binrios. Esta correspondncia est mostrada na Figura 4.10.

100011 000000 101011

01001 10010 01001

01000 01000 01000

0000 0100 1011 0000 01001 00000 100000 0000 0100 1011 0000

Figura 4.10. Formato das instrues do exemplo em nmeros binrios.

- Instrues de Desvio Durante a execuo de um programa, dependendo dos dados de entrada e dos valores gerados, diferentes instrues podem vir a ser executadas. Em linguagem de alto nvel o comando if representa fluxos de execuo diferentes. O processador MIPS possui duas instrues de desvio, denominadas beq e bne, que so similares a um if e um go to combinados. Elas possuem a seguinte sintaxe. beq reg1, reg2, L1 bne re1, reg2, L1

41

O mnemnico beq significa branch equal. Essa instruo quando executada fora um desvio na execuo para o label L1 (endereo de memria L1), se o valor de registrador 1 for igual ao valor do registrador 2. J o mnemnico bne significa branch not equal e a instruo desvia o fluxo de execuo do programa para o endereo L1 se o valor dos registradores 1 e 2 forem diferentes. Estas instrues so denominadas instrues de desvio condicional. A Figura 4.11 mostra o formato das instrues de desvio condicional.
31-26 25-21 rs 20-16 rt 15-0 endereo

beq

Figura 4.11. Formato de instrues de desvio condicional.

O campo op define a operao beq ou bne. Os campos rs e rt definem os registradores que contm os valores que devem ser comparados. O campo de endereo manipulado por uma lgica para produzir um valor de 32 bits, que combinado com o valor do PC + 4 produz o endereo alvo de desvio, caso o desvio seja realizado de fato. Os opcodes das instrues de beq e bne so iguais a 4 e 5, respectivamente. Uma outra instruo de desvio muito utilizada a instruo de desvio incondicional denominada jump (j). Nesta instruo o desvio sempre realizado. O formato desta instruo est mostrado na Figura 4.12. O seu opcode igual a 2.
25-0 31-26

endereo

Figura 4.12. Formato de instruo de desvio incondicional

Compilao de um Comando if em uma Instruo de Desvio Condicional Considere o seguinte trecho de cdigo em linguagem de alto nvel. if (i == j) go to L1; f = g + h; L1: f = f i; Supondo que as cinco variveis f, g, h, i e j correspondem aos cinco registradores de $s0 a $s4, qual o cdigo do processador MIPS gerado pelo compilador? beq $s3, $s4, L1 add $s0, $s1, $s2 L1: sub $s0, $s0, $s3 onde L1 corresponde ao endereo da instruo sub armazenada na memria.

42

Compilao de um Comando if-then-else em Instrues de Desvio Condicional Considere o seguinte trecho de cdigo em linguagem de alto nvel. if (i == j) f = g + h; else f = g - h; Supondo que as cinco variveis f, g, h e i correspondem aos cinco registradores de $s0 a $s3, qual o cdigo do processador MIPS gerado pelo compilador? Este comando pode ser representado atravs do seguinte diagrama de fluxo. i=j i=j? ij

f=g+h

f=g-h

Exit A primeira expresso compara dois valores em busca da igualdade. Em geral, realizamos o teste com a condio oposta para que possamos desviar sobre o cdigo que executa a parte subseqente, correspondente ao then. Para controlar os desvios so necessrios dois labels, um para o then (Else) e outro para ir para o fim do comando if (Exit). bne $s3, $s4, Else add $s0, $s1, $s2 j Exit Else: sub $s0, $s1, $s2 Exit: Loops Os comandos de desvio so tambm importantes para o controle de iteraes de uma determinada computao, como o caso dos loops. As mesmas instrues de linguagem de montagem so usadas nas construes dos loops. Compilao de um Loop Contendo um Array com ndice Varivel Suponha o seguinte loop escrito em linguagem de alto nvel. Loop: g = g + A[i]; i = i + j; if ( i != h) go to Loop;

43

Suponha tambm que A seja um array de 100 elementos e que o compilador associe as variveis g, h, i e j aos registradores de $s1 a $s4, respectivamente. Alm disso, que o registrador $s5 contm o endereo base do array A. Qual o cdigo em linguagem de montagem do processador MIPS que corresponde a este loop? Loop: add $t1, $s3, $s3 add $t1, $t1, $t1 add $t1, $t1, $s5 lw $t0, 0 ( $t1) // t1 recebe 2 * i // t1 recebe 4 * i // t1 recebe endereo de A[i] // t0 recebe recebe contedo de A[i]

add $s1, $s1, $t0 add $s3, $s3, $s4 bne $s3, $s2, Loop As seqncias de instrues terminadas em um desvio so to fundamentais para a compilao que recebem definio prpria. Elas so chamadas de bloco bsico. Uma das principais tarefas do compilador identificar nos programas os blocos bsicos. While Considere o seguinte loop tradicional escrito em linguagem de alto nvel. while ( save[i] == k) i = i + j; Suponha que i, j e k correspondam as variveis $s3, $s4 e $s5, e que o endereo inicial do array save esteja armazenado em $s6. Qual o cdigo em linguagem de montagem correspondente a este trecho de cdigo? Loop: add $t1, $s3, $s3 add $t1, $t1, $t1 add $t1, $t1, $s6 lw $t0, 0 ( $t1) bne $t0, $s5, Exit add $s3, $s3, $s4 j Loop Exit: Para testar se uma varivel menor que outra, a linguagem de montagem do processador MIPS possui uma instruo denominada set on less than. Esta instruo compara o contedo de dois registradores e atribui o valor 1 a um terceiro registrador se o contedo do primeiro registrador for menor do que o contedo do segundo registrador. Caso contrrio, atribudo o valor 0 ao terceiro registrador. O mnemnico desta instruo slt. Ela do tipo R,

44

seu opcode igual a 0 e o campo func igual a 42. O formato desta instruo pode ser visto na Figura 4.13
31-26 25-21 rs 20-16 rt 15-11 rd 10-6 0 5-0 42

slt

Figura 4.13. Formato da instruo set on less than.

O processador MIPS possui um registrador com valor fixo em zero. Ele o registrador $zero, mapeado no registrador 0 e tem acesso somente de leitura. Este registrador usado para criar todas as demais condies como maior ou igual e menor ou igual. Exemplo: Como seria o cdigo do processador MIPS para testar se uma varivel a ($s0) menor que outra varivel b ($s1) e desviar para Less se a condio for verdadeira. slt $t0, $s0, $s1 bne $t0, $zero,Less Switch/Case O comando switch/case permite ao programador de alto nvel selecionar uma entre muitas alternativas. Estas alternativas so selecionadas dependendo do valor de uma varivel. As alternativas podem ser codificadas como uma tabela de endereos em seqncias de instrues. Esta tabela denominada tabela de endereos de desvio. O programa precisa indexar esta tabela e desviar para a seqncia desejada. A tabela de desvios nada mais do que um array de palavras contendo endereos que correspondem aos labels dentro do cdigo. O processador MIPS possui uma instruo de desvio que considera o contedo de um registrador. Esta instruo desvia incondicionalmente para o endereo armazenado no registrador especificado pela instruo. O formato desta instruo pode ser visto na Figura 4.14.
31-26 25-21 rs 20-16 0 15-11 0 10-6 0 5-0 8

jr

Figura 4.14. Formato da instruo de desvio incondicional jump register.

O mnemnico dessa instruo de desvio incondicional jr. Ela do tipo R, seu opcode igual a 0 e o campo func igual a 8.

45

Compilao de um Comando Switch a partir de uma Tabela de Endereos de Desvio O trecho de cdigo, a seguir, seleciona uma entre quatro alternativas dependendo do valor assumido pela varivel k, cujo domnio 0, 1, 2 e 3. switch (k) { case 0: f = i + j; break; case 1: f = g + h; break; case 2: f = g - h; break; case 3: f = i - j; } Suponha que as variveis de f a k correspondem as seis variveis de $s0 a $s5, e que o registrador $t2 contenha o valor 4 e o registrador $t4 o valor inicial dos labels L0, L1, L2 e L3 armazenados na memria. Qual o cdigo correspondente em linguagem de montagem? slt $t3, $s5, $zero bne $t3, $zero, Exit slt $t3, $s5, $t2 beq $t3, $zero, Exit add $t1, $s5, $s5 add $t1, $t1, $t1 add $t1, $t1, $t4 lw $t0, 0 ($t1) jr $t0 add $s0, $s3, $s4 j Exit add $s0, $s1, $s2 j Exit sub $s0, $s1, $s2 j Exit sub $s0, $s3, $s4

L0: L1: L2: L3: Exit:

4.7.3 Suporte a Chamada de Procedimentos A utilizao de um procedimento, ou sub-rotina, tem a finalidade de estruturar os programas. Dessa forma, os programas podem ser mais facilmente entendidos e permitem a reutilizao do cdigo dos procedimentos. Durante a execuo de um procedimento, o programa e o procedimento precisam executar seis passos:

46

1. 2. 3. 4. 5. 6.

armazenar os parmetros em um local onde eles possam ser acessados pelo procedimento; transferir o controle para o procedimento; garantir os recursos de memria necessrios execuo do procedimento; realizar a tarefa desejada; colocar o resultado num lugar acessvel ao programa que chamou o procedimento e retornar o programa para o ponto de origem. A linguagem de montagem do processador MIPS utiliza os seguintes registradores na implementao da chamada de procedimentos: 1. $a0 - $a3: quatro registradores para passagem de parmetros; 2. $v0 - $v1: dois registradores para retorno de valores para o programa 3. $ra: um registrador que contm o endereo de retorno ao ponto de origem. Alm desses registradores, a linguagem de montagem do MIPS possui uma instruo usada unicamente desviar para um endereo e simultaneamente salvar o endereo da prxima instruo no registrador $ra. Esta instruo chamada de jump and link, cujo mnemnico dado por jal. O seu opcode igual a 3 e o seu formato idntico ao da instruo de desvio incondicional jump. O valor armazenado no registrador $ra chamado de endereo de retorno. A instruo jal armazena o valor PC + 4 no registrador $ra para estabelecer o link de retorno, e a instruo que implementa o retorno a instruo jump register. s vezes necessrio passar mais do que quatro parmetros para o procedimento ou mais de dois valores de retorno para o programa. Nestes casos necessrio usar a memria para passar estas informaes. A pilha a estrutura de dados utilizada para esta finalidade. Ela implementa uma estrutura LIFO (Last In First Out) e possui um ponteiro para o ltimo dado inserido. O processador MIPS possui um registrador para auxiliar nas operaes realizadas sobre a pilha. Este registrador o stack pointer ($sp). Ele armazena o endereo do topo da pilha. Quando um dado inserido ou retirado do topo da pilha dizemos que uma operao de push ou de pop, respectivamente. Por conveno, as pilhas crescem dos endereos mais altos para os endereos mais baixos. Assim, quando colocamos um dado na pilha o valor corrente do stack pointer diminui. No caso inverso ao retirarmos dados da pilha o valor do stack pointer aumenta. A pilha tambm utilizada para armazenar variveis que so locais ao procedimento, se as variveis forem em maior nmero do que a quantidade de registradores disponveis. O segmento da pilha que contm os registradores com os contedos salvos do procedimento e suas variveis locais chamado de registro de ativao. A Figura 4.15 mostra o estado da pilha antes, durante e depois da chamada ao procedimento.

47

$fp $sp $fp

$fp $sp
Regs de argumentos End. retorno Regs salvos Arrays e estruturas

$sp a

Figura 4.15. Alocao de espao na pilha (a) antes (b) durantes e (c) depois da chamada.

Alguns softwares do processador MIPS usam um registrador chamado frame pointer ($fp) para apontar para o registro de ativao. Eles atuam como um registrador base para as variveis locais a um procedimento referenciarem a memria. Alguns registradores devem ser preservados nas chamadas aos procedimentos. A Tabela 4.1 resume as convenes empregadas pela linguagem de montagem do processador MIPS para utilizar os registradores. Nome $zero $at $v0-$v1 $a0-$a3 $t0-$t7 $s0-$s7 $t8-$t9 $k0-$k1 $gp $sp $fp $ra Nmero do Registrador 0 1 2-3 4-7 8-15 16-23 24-25 26-27 28 28 30 31 Utilizao
Valor da constante 0 Reservado para o montador Armazenar resultados e avaliar expresses Argumentos Temporrios Salvos Temporrios Reservado para o sistema operacional Global pointer Stack pointer Frame pointer Endereo de retorno de procedimento

Preservado? No se aplica No se aplica No Sim No Sim No No se aplica Sim Sim Sim Sim

Tabela 4.1. Convenes para os registradores da linguagem de montagem doprocessador MIPS.

48

4.7.4 Outras Instrues do Processador MIPS Os projetistas do processador MIPS desenvolveram duas maneiras diferentes de acesso a operandos. Estes operandos podem ser operandos imediatos ou constantes. A partir deles possvel tornar mais rpido o acesso a constantes pequenas e mais eficientes os desvios. A seguir abordamos as instrues mais comuns que usam esses dois modos de acesso a operandos. - Instrues Lgicas e Aritmticas com Operando Imediato As instrues que utilizam operandos imediatos tm acrescentado em seus mnemnicos a letra i. Estas instrues so do tipo I e o campo do valor imediato tem extenso igual a 16 bits. Por exemplo, a instruo de soma com um operando imediato, onde desejamos somar a constante 4 ao contedo do registrador $sp, pode ser simplesmente escrita da seguinte forma: addi $sp, $sp, 4 O mnemnico da instruo de soma com operando imediato addi. Em particular, o opcode da instruo addi igual a 8. - Instrues de Comparao com Operando Imediato Os operandos imediatos so muito teis em comparaes. O registrador $zero contm a constante 0 proporcionando um meio fcil de realizar comparaes com 0. Para proporcionar a mesma funcionalidade de comparao com outros valores, existe uma verso imediata da instruo set on less than. Por exemplo, para saber se o contedo do registrador $s2 menor do que a constante 10 podemos simplesmente escrever: slti $t0, $s2, 10 O mnemnico da instruo set on less than com operando imediato slti. - Instrues de Carga com Operando Imediato s vezes necessrio obter operandos imediatos que ultrapassem a capacidade de 16 bits imposta pelo campo de valor imediato das instrues citadas. Para resolver este problema o conjunto de instrues do processador MIPS possui a instruo load upper immediate. O seu mnemnico igual a lui. Esta instruo carrega os 16 bits mais significativos de um registrador com o valor imediato fornecido na instruo. Uma instruo subseqente pode especificar os 16 bits menos significativos do registrador, formando assim um valor de 32

49

bits. A Figura 4.16 mostra a operao da instruo de carga do registrador, cujo exemplo dado a seguir. lui $t0, 255
31-26 25-21 rs 31-16 20-16 rt 15-0 valor imediato 15-0 0000 0000 0000 0000

mnemnico lui

op

registrador $t0

0000 0000 1111 1111

Figura 4.16. Efeito de instrues de load upper immediate.

Todas as instrues citadas que possuem operando imediato so do tipo I e o campo do valor imediato tem extenso igual a 16 bits. A Figura 4.17 mostra o formato dessas instrues.
31-26 25-21 rs 20-16 rt 15-0 valor imediato

mnemnico

op

Figura 4.17. Formato de instrues com operando imediato.

O conjunto completo das instrues do processador MIPS pode ser encontrado no apndice A do livro texto. Exerccios 1) Quais so os tipos de instrues que devem existir em qualquer conjunto de instrues de um processador? 2) Quais so os tipos mais comuns de operandos que so manipulados pelos processadores? 3) O nmero e a localizao dos operandos do origem a diferentes classes de arquiteturas. Quais so estas classes? 4) Onde podemos encontrar os operandos? Resuma cada um dos modos de endereamento bsicos. 5) O formato de uma instruo pode ser regular ou irregular. Quais as vantagens e desvantagens de cada um destes formatos? 6) Descreva a funo de cada um dos nveis do contexto de software abordado na primeira seo deste captulo.

50

7) Adicione comentrios ao cdigo do processador MIPS, a seguir, e expresse em uma frase o que este trecho de cdigo faz. Suponha que os registradores $a0 e $v0 so usados para a entrada e a sada, respectivamente. Alm disso, suponha que inicialmente o registrador de entrada contm um valor n que um inteiro positivo. begin: addi $t0, $zero,0 addi $t1, $zero, 1 loop: slt $t2, $a0, $t1 bne $t2, $zero ,finish add $t0, $t0, $t1 addi $t1, $t1, 2 j loop finish: add $v0, $t0, $zero 8) Mostre a nica instruo ou o menor nmero de instrues do processaador MIPS para gerar o seguinte comando em linguagem de alto nvel. Suponha que as variveis a e b estejam associadas aos registradores $t0 e $t1, respectivamente. a = b + 100; 9) Mostre a nica instruo ou o menor nmero de instrues do processador MIPS para gerar o seguinte comando em linguagem de alto nvel. Suponha que a varivel c esteja associada ao registrador $t0 e que o endereo base do array x comea em 4096. x[10] = x[11] + c; 10) Considere o seguinte trecho de cdigo escrito em linguagem de alto nvel: for (i = 0; i <= 100; i ++) { a[i] = b[i] + c; } Suponha que a e b so arrays de palavras e que o endereo base de a est em $a0 e o endereo de b est em $a1. O registrador $t0 est associado a varivel i e $s0 a varivel c. Escreva o cdigo MIPS correspondente a este fragmento de cdigo. Quantas instrues so executadas durante o processamento deste trecho de cdigo? Quantas referncias a palavras de dados na memria sero feitas durante a execuo? 11) O fragmento de cdigo mostrado, a seguir, processa um array e calcula dois valores armazenados nos registradores $v0 e $v1. Suponha que o array possua 500 palavras, indexadas de 0 a 499, e que seu endereo base e tamanho estejam armazenado nos registradores $a0 e $a1. Descreva o que faz este trecho de cdigo. Mais especificamente o que retornado nos registradores $v0 e $v1?

51

add $a1, $a1, $a1 add $a1, $a1, $a1 add $v0, $zero, $zero add $t0, $zero, $zero outer: add $t4, $a0, $t0 lw $t4, 0 ($t4) add $t5, $zero, $zero add $t1, $zero, $zero inner: add $t3, $a0, $t1 lw $t3, 0 ($t3) bne $t3, $t4, skip addi $t5, $t5, 1 skip: addi $t1, $t1, 4 bne $t1, $a1, inner slt $t2, $t5, $v0 bne $t2, $zero, next add $v0, $t5, $zero add $v1, $t4, $zero next: addi $t0, $t0, 4 bne $t0, $a1, outer 12) Suponha que o cdigo do exerccio 10 seja executado em uma mquina com clock igual a 500Mhz. Alm disso, a quantidade de ciclos gastos em cada instruo, para esta mquina, dada pela tabela a seguir. No pior caso quantos segundos sero necessrios para executar todo este cdigo? Instruo add, addi, slt lw, bne Ciclos 1 2

Você também pode gostar