Sie sind auf Seite 1von 77

Sistemas Processadores e Perifricos

Aula 3 - Reviso
Prof. Frank Sill Torres DELT Escola de Engenharia UFMG

Adaptado a partir dos Slides de Organizao de Computadores 2006/02 do professor Leandro Galvo DCC/UFAM - galvao@dcc.ufam.edu.br pelo Prof. Ricardo de Oliveira Duarte

Instrues MIPS :: Instrues Lgicas


Operao lgica
Shift esquerda Shift direita AND bit a bit OR bit a bit NOT bit a bit Instruo MIPS sll srl and, andi or, ori nor Significado Shift left logical Shift right logical E OR NOR
2

Instrues MIPS :: Processando instrues sequenciais


Memria
endereos
00000000h ... 00400000h 00400004h 00400008h 0040000ch 00400010h ... 0ffffffch 10000000h 10000004h 10000008h 1000000ch 10000010h ... 10007ffch 10008000h 10008004h 10008008h ... fffffffch

contedo
... 3c08 1000 8d09 0004 8d0a 0010 012a 4820 ad09 0008 ... 0000 0000 0000 0003 ffff fff0 0000 0000 0000 0000 0000 0003 ...

significado
lui lw lw add sw ... $8, 0x1000 $9, 4($8) $10,16($8) $9, $9, $10 $9, 8($8)

Regio de Cdigos

instrues

Regio de Dados

x y n[0] n[1] n[2] ...

variveis

Instrues MIPS :: Processando instrues seqenciais


Processador
endereos
00000000h ... 00400000h 00400004h 00400008h 0040000ch 00400010h ... 0ffffffch ...

Memria
contedo
... 3c08 1000 8d09 0004 8d0a 0010 012a 4820 ad09 0008 ... 0000 0000 ...

significado
lui lw lw add sw ... $8, 0x1000 $9, 4($8) $10,16($8) $9, $9, $10 $9, 8($8)

PC 00400008 IR 8d0a0010

Execuo da instruo lw na via de dados


4

Instrues MIPS :: Instrues de controle

Branch on not equal (bne)


Desvia
bne

o programa para <label1> se $t0 != $t1


#if ($t0 != $t1) goto label1

$t0, $t1, label1

Branch on equal (beq)


Desvia
beq

o programa para <label2> se $t0 == $t1


#if ($t0 == $t1) goto label2

$t0, $t1, label2

Instrues MIPS :: Instrues de controle :: Ex 01

Exemplo
no i=j sim h=i+j

bne $8, $9, sai add $10, $8, $9 sai: nop

Instrues MIPS :: Instrues de controle

Set on less than (slt)


Compara

dois registradores
#if ($s2 < $s3) $s1 = 1 #else $s1 = 0

slt

$s1, $s2, $s3

Set on less than immediate (slti)


Compara

um registrador e uma constante


#if ($s2 < 100) $s1 = 1 #else $s1 = 0
7

slti

$s1, $s2, 100

Instrues MIPS :: Instrues de controle

Jump (j)
Desvio

incondicional para um endereo de memria apontado por um label


j label

Instrues

do tipo branch indicam desvio da sequncia do programa mediante anlise de uma condio Instrues do tipo jump indicam desvio incondicional da sequncia do programa
8

Instrues MIPS :: Instrues de controle :: Ex 02

Exemplo
bne $8, $9, else add $10, $8, $9 j sai else: sub $10, $8, $9 sai: nop
no i=j sim h=i-j h=i+j

Instrues MIPS :: Instrues de controle :: Formato

Instrues BNE e BEQ:

Campo immediate possui quantidade de palavras (words) que devem ser saltadas para chegar a instruo marcada pelo label (rtulo) O Nmero pode ser positivo (desvio para frente) e negativo (desvio para trs) Definio do endereo da memria correspondente instruo marcada pelo label Novo endereo: 4 MSB do PC atual + 26 Bits da instruo deslocado a esquerda de 2 Bits (como o endereo da memria um mltiplo de 4 bytes)
10

Instruo J (jump):

Sistemas Processadores e Perifricos

Aula 4 - Conjunto de Instrues MIPS III


Prof. Frank Sill Torres DELT Escola de Engenharia UFMG

Adaptado a partir dos Slides de Organizao de Computadores 2006/02 do professor Leandro Galvo DCC/UFAM - galvao@dcc.ufam.edu.br pelo Prof. Ricardo de Oliveira Duarte

Instrues MIPS

Transferncia de Dados Lgicas Controle Suporte a procedimentos

12

Instrues MIPS :: Suporte a Procedimentos

Procedimentos: Conjunto de instrues com funo definida Realizam uma srie de operaes como base em valores de parmetros Podem retornar valores computados

13

Instrues MIPS :: Suporte a Procedimentos

Motivos para o uso de procedimentos:


Tornar

o programa mais fcil de ser entendido a reutilizao do cdigo do procedimento

Permitir Permitir

que o programador se concentre em uma parte do cdigo (os parmetros funcionam como barreira)

14

Instrues MIPS :: Suporte a Procedimentos

Passos para a execuo:


1. O programa coloca os parmetros em um lugar onde o procedimento chamado possa acess-los 2. O programa transfere o controle para o procedimento 3. O procedimento acessa os valores necessrios realizao de sua tarefa 4. O procedimento executa sua tarefa, gerando valores 5. O procedimento (chamado) coloca os valores gerados em um lugar onde o programa (chamador) pode acess-los 6. O procedimento transfere o controle de volta para o ponto do programa que o chamou
15

Instrues MIPS :: Suporte a Procedimentos

Caracterstica dos procedimentos tpicos


Tm poucos parmetros Retornam poucos parmetros, muitas vezes um nico

Parmetros podem ser passados em registradores

16

Instrues MIPS :: Suporte a Procedimentos

MIPS aloca alguns registradores para implementar o uso de procedimentos: $a0-$a3


Quatro registradores usados como argumentos para passagem de parmetros
$v0-$v1

Dois registradores usados para retornar valores


$ra

Registrador que guarda o endereo de retorno (return address) para o ponto do programa que chamou o procedimento

17

Instrues MIPS :: Suporte a Procedimentos

$a0 $a1 $a2 $a3

$4 $5 $6 $7

Procedimento

$2 $3

$v0 $v1

18

Instrues MIPS :: Suporte a Procedimentos

Jump and link (jal)


Salta

para o endereo especificado, salvando o endereo da prxima instruo em $ra


jal label #desvia para o endereo indicado #por label. $ra PC + 4

Jump register (jr)


Desvio

incondicional para endereo guardado em $ra


#desvia para o endereo da #memria guardado em $ra
19

jr

$ra

Instrues MIPS :: Suporte a Procedimentos

Passos no MIPS para execuo de procedimentos


1. Chamador coloca os valores dos parmetros em $a0-$a3 2. Chamador chama jal X para saltar ao procedimento X (chamado) 3. Chamado realiza suas tarefas 4. Chamado coloca os resultados em $v0-$v1 5. Chamado retorna o controle ao chamador usando jr $ra

20

Usando mais registradores

Se forem necessrios mais que quatro argumentos e/ou dois resultados?


$t0-$t9:

Dez registradores temporrios que NO SO preservados pelo chamador


$s0-$s7:

Oito registradores que DEVEM ser preservados se utilizados no procedimento chamado


21

Usando mais registradores

Registradores caller-saved: $t0-$t9


Chamador responsvel por salv-los em memria caso seja necessrio us-los novamente depois que um procedimento chamado

Registradores callee-saved: $s0-$s7


Chamado responsvel por salv-los em memria antes de utiliz-los e restaur-los antes de devolver o controle ao chamador
22

Preservao de Contexto

Qualquer registrador usado pelo chamador deve ter seu contedo restaurado para o valor que tinha antes da chamada Contedo dos registradores salvo na memria. Depois da execuo do procedimento, estes registradores devem ter seus valores restaurados Se as chamadas forem recursivas, conveniente o uso de uma pilha

23

Pilha

Espao da memria organizada com uma fila do tipo ltimo a entrar, primeiro a sair (LIFO):

Reg A Reg B Reg C Reg D

24

Apontador de Pilha (Stack Pointer)

$sp

Registrador usado para guardar o endereo do topo da pilha da chamada de procedimentos

Indica:

a posio de memria que contm os valores dos registradores salvos na memria pela ltima chamada a posio a partir da qual a prxima chamada de procedimento pode salvar seus registradores

A pilha cresce do endereo mais alto para o mais baixo


25

Apontador de Pilha (Stack Pointer)

Valor do stack pointer ($sp) em momentos diferentes da chamada de procedimento:


Endereos baixos
Contedo de $1 Contedo de $2 Contedo de $3 $sp $sp $sp

antes

durante

depois

Endereos altos
26

Pilha

Exemplo: Valor do stack pointer ($sp) em momentos diferentes da chamada de procedimento:

Reg s3

$sp = FF000004
Reg s2

$sp = FF000008
Reg s1

$sp = FF00000B
Reg s0

$sp = FF00000F
27

Pilha
Para todo programa, o sistema operacional aloca trs segmentos de memria: Segmento de texto: armazena o cdigo de mquina Segmento de dados: alocado para constantes e variveis globais Segmento de pilha: local onde so passados parmetros, alocado espao para variveis locais e armazenados endereos de retorno para chamadas de funes aninhadas/recursivas Memria Principal

Texto

Dados

Pilha
28

Pilha
Texto

Dados estticos Dados dinmicos

Pilha

Suporte a Procedimentos :: Exemplo 1

Compilar o seguinte cdigo C em cdigo assembly do MIPS:

int leaf_example(int g, int h, int i, int j) { int f; f = (g + h) (i + j); return f; }


30

Suporte a Procedimentos :: Exemplo 1


int leaf_example(int g, int h, int i, int j) { int f; f = (g + h) (i + j); return f; }

$a0 corresponde a g $a2 corresponde a i $s0 corresponde a f

, ,

$a1 corresponde a h $a3 corresponde a j

Varivel local (deve ser salva, pois ser modificada pelo procedimento)
31

Valor de retorno deve ser colocado em $v0

Suporte a Procedimentos :: Exemplo 1


leaf_example: addi sw $sp, $sp, -4 $s0, 0($sp) # label para chamada # avana o stack pointer # empilha o valor de $s0 # $t0 g + h # $t1 i + j # f $t0 - $t1

add add sub

$t0, $a0, $a1 $t1, $a2, $a3 $s0, $t0, $t1

add

$v0, $s0, $zero

# coloca resultado em $v0

lw addi jr

$s0, 0($sp) $sp,$sp,4 $ra

# restaura $s0 # desempilha o topo # volta para o chamador


32

Suporte a Procedimentos :: Procedimentos Aninhados

Chamadas Sucessivas: Programa principal chama procedimento A com um argumento A chama procedimento B com um argumento Chamadas recursivas: A chama A Possveis problemas: $a0 ser sobreposto quando B chamado e o valor do parmetro passado na chamada de A ser perdido Quando B for chamado pela instruo jal, o registrador $ra ser sobreposto
33

Suporte a Procedimentos :: Procedimentos Aninhados

O procedimento chamador coloca na pilha todos os registradores de argumento ($a0-$a3) e/ou registradores temporrios ($t0$t9) necessrios aps a chamada O procedimento chamado salva na pilha o endereo de retorno ($ra) e todos os registradores de salvamento usados por ele ($s0-$s7) O apontador da pilha ($sp) ajustado para acomodar a quantidade de registradores colocados na pilha Quando do retorno, os valores dos registradores so restaurados a partir da pilha e $sp atualizado
34

Suporte a Procedimentos :: Exemplo de Recurso

Compilar o seguinte cdigo C em cdigo assembly do MIPS:


z = fact(x); int fact(int n) { if (n < 1) return(1); else return(n * fact(n-1)); }
35

Suporte a Procedimentos :: Exemplo de Recurso

Algoritmo:
1) 2) 3) 4) Subtrair o valor 1 do registrador $a0 Guardar novo valor de $a0 na pilha Guardar endereo de retorno ($ra) Repetir 1, 2 e 3 at que $a0 seja 1

5) Recuperar da pilha, passo a passo, os diversos valores $a0, multiplicando o valor atual do fatorial pelo valor recuperado 6) Repetir 5 at que o endereo de retorno ($ra) seja o da funo principal
36

Suporte a Procedimentos :: Exemplo de Recurso


Pilha $ra (main) $a0 $ra (fact) $a0 - 1 $ra (fact) ... $ra (fact) 1
37

$v0*...*($a0-1) $v0*...*($a0) $v0*1*2 $v0*1 $v0

Suporte a Procedimentos :: Exemplo de Recurso


fact: addi sw sw slti beq addi addi jr L1: addi jal lw lw add mul jr $sp, $ra, $a0, $t0, $t0, $sp, $v0, $ra $sp, -8 4($sp) 0($sp) $a0, 1 $zero, L1 $sp, 8 $zero, 1 # # # # # # # # abre espao para 2 itens na pilha salva o endereo de retorno salva o argumento n testa se n < 1 se n >= 1, desvia para L1 elimina 2 itens da pilha retorna o valor 1 retorna para ponto de chamada

$a0, $a0, -1 fact $a0, 0($sp) $ra, 4($sp) $sp, $sp, 8 $v0, $a0, $v0 $ra

# n>=1, o argumento recebe (n-1) # chama fact com argumento (n-1) # restaura argumento n # restaura o endereo de retorno # ajusta $sp para eliminar 2 itens # retorna n*fact(n-1) # retorna para o chamador

38

Suporte a Procedimentos :: Procedimentos Aninhados


No precisam ser preservados pelo chamador Se usados, o chamador precisa salvar seus valores e depois restaur-los

39

Suporte a Procedimentos :: Quadro de Procedimento

Quadro de Procedimento (Procedure Frame) ou Registro de Ativao:


Segmento

da pilha usado para salvar o contedo dos registradores e armazenar variveis locais de $sp indica o topo da pilha

Valor

40

Suporte a Procedimentos :: Quadro de Procedimento

$fp - first word procedure frame


Pode

ser usado para indicar a primeira palavra do quadro de pilha como registrador base estvel dentro de um procedimento para referncia de memria local uso no obrigatrio, mas necessrio quando $sp alterado durante a execuo do procedimento

Atua

Seu

41

Quadro de Procedimento $sp e $fp


Endereos baixos

$sp
Arranjos e estruturas Locais

Outros registradores salvos $ra salvo Registradores com Argumentos salvos

$fp $sp

$sp

Endereos altos

$fp

$fp
42

Quadro de Procedimento :: Aes do Chamador

Passagem de argumentos

Os 4 primeiros so colocados nos registradores $a0-$a3 O restante colocado na pilha


Outros

argumentos armazenados no quadro do procedimento $sp aponta para o ltimo argumento

Registradores caller-saved

$a0-$a3 e $t0-$t9 Salvar se e somente se o chamador precisar do contedo intacto depois que a chamada retornar
43

Quadro de Procedimento :: Aes do Chamado


Alocar memria na pilha: $sp $sp tamanho do quadro Salvar registradores callee-saved no quadro antes de alter-los: $s0-$s7, $fp e $ra O chamador espera encontr-los intactos depois da chamada Salvar $fp a cada procedimento que aloca um novo quadro na pilha S necessrio salvar $ra se o chamado fizer alguma chamada Ao final: Retornar o valor em $v0 Restaurar registradores callee-saved salvos no incio da chamada Remover o quadro adicionando o tamanho do quadro a $sp Executar jr $ra
44

Instrues MIPS :: Suporte a Procedimentos :: Formato

Jump and link (jal)


jal label #desvia para o endereo indicado #por label. $ra PC + 4 target xxx endereo da instruo xxx (26 bits)

Instruo (decimal):

op (3)h jal

Instruo (binrio):

000011

45

Instrues MIPS :: Suporte a Procedimentos :: Formato

Jump register (jr)


jr $t3 # PC endereo[$t3]

Instruo (decimal):

op 0 jr

rs 11 $t3

rt 0 --

rd 0 --

shamt 0 --

funct (8)h jr

Instruo (binrio):

000000 01011 00000 00000 00000

001000

46

Instrues MIPS :: Suporte a Procedimentos :: Resumo

47

Instrues MIPS

Transferncia de Dados Lgicas Controle Suporte a procedimentos

48

Instrues MIPS :: Transferncia de dados

MIPS oferece instrues para mover bytes, halfwords e doublewords:


Load Store Load Store Load Store

byte: byte: halfword: halfword: doubleword: doubleword:

lb sb lh sh ld sd
49

Instrues MIPS :: Transferncia de dados

Load byte (lb): l um byte da memria, colocando-o nos 8 bits mais direita de um registrador Demais bits do registrador: conservam sinal do byte carregado
Processador
endereos

Memria
contedo

12 9 F F 8 F C F D F 7 F 0 A E B F

34

56 AB

lb $reg1, 0($reg2)
50

Instrues MIPS :: Transferncia de dados

Store byte (sb): separa o byte mais direita de um registrador e o escreve na memria Demais bits da memria: permanecem inalterados

Processador
endereos

Memria
contedo

12 9 8 C D 7 0 E F

34

56

E F 00

sb $reg1, 0($reg2)
51

Instrues MIPS :: Transferncia de dados

Store byte (sb): separa o byte mais direita de um registrador e o escreve na memria Demais bits da memria: permanecem inalterados

Processador
endereos

Memria
contedo

12 9 8 C D 7 0 E F

E F 34

56

00

sb $reg1, 2($reg2)
52

Instrues MIPS :: Transferncia de dados

Load halfword (lh) e Store halfword (sh):


Mesma

lgica que lb e sb, mas trabalham com halfwords (2 bytes), em vez de bytes isolados

Processador
endereos

Memria
contedo

10 7 2 9 8 C D 7 0 E F

E F 34

56

00

sh $reg1, 2($reg2)
53

Instrues MIPS :: Transferncia de dados


Load byte unsigned (lbu)/Load halfword unsigned (lhu) Lem um byte/halfword da memria, colocando-o nos 8 bits mais direita de um registrador Demais bits do registrador: preenche-se com zeros
Processador
endereos

Memria
contedo

12 9 0 8 0 C 0 D 0 7 0 A E B F 0

34

56 AB

lbu $reg1, 0($reg2)


54

Instrues MIPS :: Transferncia de dados


Load double word (ld) Le 8 bytes da memria, colocadando-os no registrador e no registrador seguinte

Processador
endereos

Memria
contedo

78 12 34 56 $reg0 0 0 0 0 0 0 0 0 $reg1 0 0 0 0 0 0 0 0 9A BC DE F0

12

34

56

78

9A BC DE F0 ld $reg0, 0($reg2)
55

Instrues MIPS :: Transferncia de dados


Store double word (sd) Escreve dois words de um registrador e do registrador seguinte na memria

Processador
endereos

Memria
contedo

$reg0 1 2 3 4 5 6 7 8 $reg1 9 A B C D E F 0

0 10 2

0 30 4

0 50 6

7 08 0

9 0A 0 B 0C 0 D 0E 0 F 00 sd $reg0, 0($reg2)
56

Pseudo-Instrues

57

Hierarquia de Traduo
Programa C Compilador Programa em linguagem de montagem Montador Objeto: Mdulo em Ling. de Mquina Objeto: Biblioteca de rotinas (Ling. Maq.) Ligador

Executvel: Programa em Ling. de Mquina Carregador Memria


58

Pseudo-instrues

So instrues fornecidas por um montador mas no implementadas pelo hardware MIPS O montador as aceita como instrues comuns, mas as traduzem para instrues equivalentes em linguagem de mquina Facilitam o trabalho do programador por oferecer um conjunto mais rico de instrues que aquele implementado em hardware, sem complicar este
59

Pseudo-instrues

O montador utiliza o registrador $at para traduzir as pseudo-instrues em linguagem de mquina Ao se considerar o desempenho (nmero de instrues por programa Ninstr), deve-se contar as instrues reais do MIPS

60

Pseudo-instrues

MAL (MIPS Assembly Language): conjunto de instrues que o programador pode utilizar para escrever um cdigo assembly MIPS, o que inclui pseudo-instrues TAL (True Assembly Language): conjunto de instrues que podem realmente ser traduzidas em instrues de linguagem de mquina (strings de 32 bits binrios)

61

Pseudo-instrues :: Exemplos

Instrues de transferncia de dados:


Carregar

endereo (load address)

la

Rdest, Label

Exemplos:
$t2, label lui ori $at, upper 16 bits $t2, $at, lower 16 bits

la

62

Pseudo-instrues :: Exemplos

Instrues de transferncia de dados:


Carregar

imediato (load immediate)

li

Rdest, Const

Exemplos:
$t2, const lui ori $at, upper 16 bits $t2, $at, lower 16 bits

li

63

Pseudo-instrues :: Exemplos

Instrues de transferncia de dados:


Mover

(move) Rdest, Rsrc

move

Exemplos:
move $t2, $t1 addu $t2, $zero, $t1

64

Pseudo-instrues :: Exemplos

Instrues de rotao:
rol ror Rdest, Rsrc1, Shamt Rdest, Rsrc1, Shamt

Exemplo:
$t2, $t2, 31 sll srl or $at, $t2, 1 $t2, $t2, 31 $t2, $t2, $at

ror

65

Pseudo-instrues :: Exemplos

Instrues de desvio:
Desviar

para endereo relativo de 16-bits (branch) label

Exemplo:
target bgez $0, target *

*bgez - Branch if greater or equal zero


66

Pseudo-instrues :: Exemplos

Instrues de desvio:
Desviar

se Rsrc1 > Rsrc2 Rsrc1, Rsrc2 se Rsrc1 Rsrc2 Rsrc1, Rsrc2 se Rsrc1 < Rsrc2 Rsrc1, Rsrc2 se Rsrc1 Rsrc2 Rsrc1, Rsrc2
67

bgt
Desviar

bge
Desviar

blt
Desviar

ble

Pseudo-instrues :: Exemplos

Pseudo-cdigo

Instruo MIPS

Branch if Greater than bgt Rs, Rt, Label

slt $at, Rt, Rs bne $at, $0, Label

Mais exemplos: Apndice A do livro do Patterson


68

Chamadas de Sistema

69

Chamadas de sistema

A instruo syscall suspende a execuo do programa usurio e transfere o controle para o sistema operacional O sistema operacional acessa ento o contedo do registrador $v0 para determinar qual tarefa o programa usurio est solicitando para ser realizada Quando o sistema operacional termina de cumprir sua tarefa, o controle retorna ao programa usurio, onde a prxima instruo executada
70

Chamadas de sistema

float

71

Chamadas de sistema :: Exemplo de leitura de inteiros

## Get first number from user, put into $t0 li $v0, 5 syscall move $t0, $v0 # load syscall read_int into $v0 # make the syscall # move the number read into $t0

72

Chamadas de sistema :: Exemplo de escrita de inteiros

## Print out $t2 move $a0, $t2 li $v0, 1 syscall # move the number to print into $a0 # load syscall print_int into $v0 # make the syscall.

73

Chamadas de sistema :: Exemplo de sada do programa

li $v0, 10 syscall

# syscall code 10 is for exit. # make the syscall.

74

O que vocs aprenderam hoje?

Suporte a Procedimentos
Realizao Use

dos procedimentos com MIPS

de registradores

Pilha

Transferncia de dados avanada Pseudo-Instrues Chamadas de Sistema

Assuntos da prova

1 prova na prxima aula (13/09/2013) com assuntos seguintes:


Todos os assuntos das primeiras 4 aulas (livro: captulos 1 e 2) Organizao de um computador Ciclos de instrues Caractersticas da arquitetura e das instrues do MIPS (mas no o nome e o opcode da cada instruo) Converso para assembly e cdigo de mquina Procedimentos ...

Questes
Converta o cdigo em linguagem de alto nvel para o cdigo assembly correspondente! funcao: addi $sp, $sp, -4
-- Suponha que os valores das variveis -- x e y do main() estejam armazenados em $s1 e $s2 -- f do funcao esteja armazenado em $s3

sw $s3, 0($sp) sll $s3,$a0,1 add $v0,$zero,$s3 lw $s3, 0($sp) addi $sp, $sp, 4 jr $ra

main () { int x, y; x = 2; y = funcao (x); } int funcao (a) { int f; f = 2 * a; return(f); } main:

addi $s1, $zero,2 add $a0, $zero, $s1 jal funcao add $s2, $v0, $zero