Documente Academic
Documente Profesional
Documente Cultură
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
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
variveis
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
Exemplo
no i=j sim h=i+j
dois registradores
#if ($s2 < $s3) $s1 = 1 #else $s1 = 0
slt
slti
Jump (j)
Desvio
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
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
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):
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
12
Procedimentos: Conjunto de instrues com funo definida Realizam uma srie de operaes como base em valores de parmetros Podem retornar valores computados
13
Permitir Permitir
que o programador se concentre em uma parte do cdigo (os parmetros funcionam como barreira)
14
16
Registrador que guarda o endereo de retorno (return address) para o ponto do programa que chamou o procedimento
17
$4 $5 $6 $7
Procedimento
$2 $3
$v0 $v1
18
jr
$ra
20
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):
24
$sp
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
antes
durante
depois
Endereos altos
26
Pilha
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
Pilha
, ,
Varivel local (deve ser salva, pois ser modificada pelo procedimento)
31
add
lw addi jr
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
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
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
$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
39
da pilha usado para salvar o contedo dos registradores e armazenar variveis locais de $sp indica o topo da pilha
Valor
40
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
$sp
Arranjos e estruturas Locais
$fp $sp
$sp
Endereos altos
$fp
$fp
42
Passagem de argumentos
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
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
Instruo (decimal):
op (3)h jal
Instruo (binrio):
000011
45
Instruo (decimal):
op 0 jr
rs 11 $t3
rt 0 --
rd 0 --
shamt 0 --
funct (8)h jr
Instruo (binrio):
001000
46
47
Instrues MIPS
48
lb sb lh sh ld sd
49
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
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
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
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
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
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
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
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
la
Rdest, Label
Exemplos:
$t2, label lui ori $at, upper 16 bits $t2, $at, lower 16 bits
la
62
Pseudo-instrues :: Exemplos
li
Rdest, Const
Exemplos:
$t2, const lui ori $at, upper 16 bits $t2, $at, lower 16 bits
li
63
Pseudo-instrues :: Exemplos
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
Exemplo:
target bgez $0, target *
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
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
## 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
## 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
li $v0, 10 syscall
74
Suporte a Procedimentos
Realizao Use
de registradores
Pilha
Assuntos da prova
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