Buscar

Operações e Chamadas de Procedimentos em MIPS

Prévia do material em texto

Operações para Tomada de Decisões Suporte a Procedimentos no Hardware do Computador
Organização de Computadores
Marcelo Lobosco
Universidade Federal de Juiz de Fora
Aula 06 - Instruções: a Linguagem de Máquina
Departamento de Ciência da Computação Universidade Federal de Juiz de Fora
Operações para Tomada de Decisões Suporte a Procedimentos no Hardware do Computador
Operações para Tomada de Decisões
Suporte a Procedimentos no Hardware do Computador
Departamento de Ciência da Computação Universidade Federal de Juiz de Fora
Operações para Tomada de Decisões Suporte a Procedimentos no Hardware do Computador
Operações para Tomada de Decisões
I Instruções de tomada de decisão alteram o fluxo de instruções
I Muda a próxima instrução a ser executada
I Instruções de desvio condicional do MIPS (beq e bne)
I beq registrador1, registrador2, L1
I Significa ir até instrução rotulada por L1 se conteúdos de
ambos os registradores forem iguais
I branch if equal (desviar se for igual)
I bne registrador1, registrador2, L1
I Significa ir até instrução rotulada por L1 se conteúdos de
ambos os registradores forem diferentes
I branch if not equal (desviar se diferente)
Departamento de Ciência da Computação Universidade Federal de Juiz de Fora
Operações para Tomada de Decisões Suporte a Procedimentos no Hardware do Computador
Exercício
I Transforme o fragmento de código C abaixo em código
assembly MIPS. Considere que a variável i é armazenada em
$s0, j em $s1 e h em $s3.
if (i==j) h = i + j;
I Uma das formas de se implementar em MIPS...
bne $s0, $s1, Label
add $s3, $s0, $s1
Label: ....
Departamento de Ciência da Computação Universidade Federal de Juiz de Fora
Operações para Tomada de Decisões Suporte a Procedimentos no Hardware do Computador
Operações para Tomada de Decisões
I Instrução de desvio incondicional do MIPS (j)
I Desvia para instruções que segue rótulo independente de
condição
I j label
I Exemplo: transformar o código C abaixo em assembly MIPS
i f ( i!=j )
h=i+j ;
e l s e
h=i−j ;
beq $s4, $s5, Lab1
add $s3, $s4, $s5
j Lab2
Lab1: sub $s3, $s4, $s5
Lab2: ...
Departamento de Ciência da Computação Universidade Federal de Juiz de Fora
Operações para Tomada de Decisões Suporte a Procedimentos no Hardware do Computador
Operações para Tomada de Decisões
I Sequências de instruções que terminam em um desvio são
chamados de bloco básico
I Não possuem destinos de desvio ou rótulos de desvio
I Exceto, possivelmente, no início
I Testes de igualdade/desigualdade não resolvem todos os
problemas
I E se decisão baseada em uma variável ser ou não menor do
que outra?
Departamento de Ciência da Computação Universidade Federal de Juiz de Fora
Operações para Tomada de Decisões Suporte a Procedimentos no Hardware do Computador
Operações para Tomada de Decisões
I Instrução slt (set on less than: atribui se menor que)
I slt $t0, $s3, $s4 # $t0 = 1 se $s3 < $s4
I Valor 1 atribuído ao registrador $t0 se o valor de $s3 for menor
que $s4, caso contrário atribuído valor 0
I Operadores constantes populares em atribuições
I slti $t0, $s2, 10 # $t0 = 1 se $s2 < 10
Departamento de Ciência da Computação Universidade Federal de Juiz de Fora
Operações para Tomada de Decisões Suporte a Procedimentos no Hardware do Computador
Chamadas de procedimento
I Procedimento (ou função)
I Sub-rotina armazenada que realiza uma tarefa com base nos
parâmetros com os quais ela é provida
I Usada para estruturar programas
I Permite que código seja reutilizado
Departamento de Ciência da Computação Universidade Federal de Juiz de Fora
Operações para Tomada de Decisões Suporte a Procedimentos no Hardware do Computador
Etapas na chamadas de procedimentos
I Seis etapas precisam ser seguidas:
I Colocar parâmetros onde procedimento possa acessá-los
I Transferir controle para o procedimento
I Adquirir recursos necessários para o procedimento
I Realizar tarefa desejada
I Colocar valor de retorno onde código que o chamou possa
acessá-lo
I Retornar controle para o ponto de origem
Departamento de Ciência da Computação Universidade Federal de Juiz de Fora
Operações para Tomada de Decisões Suporte a Procedimentos no Hardware do Computador
Etapas na chamadas de procedimentos
I Registradores usados para a chamada de procedimento:
I $a0 - $a3: usados para passar parâmetros
I $v0 - $v1: usados para valores de retorno
I $ra: registrador de endereço de retorno, usado para retornar ao
ponto de origem
I Instrução para invocar procedimentos: jal
I jal EndereçoProcedimento # jal (jump and link)
I Desvia para endereço e simultaneamente salva endereço da
instrução seguinte no registrador $ra
I Instrução seguinte dada por PC + 4
I PC (Program counter ou contador de programa): registrador
que contém o endereço da instrução que está sendo executada
Departamento de Ciência da Computação Universidade Federal de Juiz de Fora
Operações para Tomada de Decisões Suporte a Procedimentos no Hardware do Computador
Etapas nas chamadas de procedimentos
I Instrução jump register (jr) permite fazer desvio incondicional
para endereço especificado em um registrador
I jr $ra
I Cabe ao código que chama o procedimento (caller)
I Colocar valores dos parâmetros em $a0-$a3
I Utilizar jal X para desviar para o procedimento X
I Cabe ao código invocado (callee)
I Executar as instruções
I Colocar eventuais resultados em $v0 - $v1
I Retornar controle para caller usando jr $ra
Departamento de Ciência da Computação Universidade Federal de Juiz de Fora
Operações para Tomada de Decisões Suporte a Procedimentos no Hardware do Computador
Observações sobre chamada de procedimentos
I Durante execução, procedimento pode precisar usar
registradores
I Mas e se os registradores estavam sendo usados pelo caller?
I Depois de completar a chamada, caller espera que os valores
originais dos seus registradores sejam mantidos
I Se registradores usados durante execução do procedimento,
valores originais devem ser salvos e depois restaurados
Departamento de Ciência da Computação Universidade Federal de Juiz de Fora
Operações para Tomada de Decisões Suporte a Procedimentos no Hardware do Computador
Observações sobre chamadas de procedimentos
I Conceito de spilling registers utilizado
I Variáveis menos utilizadas armazenadas na memória
I Pilha usada para implementar spilling registers
I Organizada como fila do tipo “último a entrar, primeiro a sair”
I Ponteiro para endereço mais recentemente alocado na pilha
I Chamado de stack pointer ($sp)
I Indica onde valores antigos estão localizados e/ou
I Mostra onde próximo procedimento deverá alocar os spilling
registers
Departamento de Ciência da Computação Universidade Federal de Juiz de Fora
Operações para Tomada de Decisões Suporte a Procedimentos no Hardware do Computador
Observações sobre chamadas de procedimentos
Departamento de Ciência da Computação Universidade Federal de Juiz de Fora
Operações para Tomada de Decisões Suporte a Procedimentos no Hardware do Computador
Observações sobre chamadas de procedimentos
I Exemplo: Qual o código assembly MIPS compilado para a
seguinte função?
i n t exemplo ( i n t g , i n t h , i n t i , i n t j ) {
i n t f ;
f=(g+h)−(i+j ) ;
r e t u r n f ;
}
Departamento de Ciência da Computação Universidade Federal de Juiz de Fora
Operações para Tomada de Decisões Suporte a Procedimentos no Hardware do Computador
Exemplo
I Variáveis g, h, i e j correspondem aos registradores $a0, $a1,
$a2 e $a3
I Variável f corresponde a $s0
I Procedimento começa com rótulo (label) com o nome do
procedimento
exemplo:
Departamento de Ciência da Computação Universidade Federal de Juiz de Fora
Operações para Tomada de Decisões Suporte a Procedimentos no Hardware do Computador
Exemplo
I Próximo passo: salvar registradores usados pelo procedimento
I Valores antigos empilhados
I Importante: registradores temporários não precisam ser
preservados em uma chamada de procedimento
I Só precisamos salvar registrador $s0
Departamento de Ciência da ComputaçãoUniversidade Federal de Juiz de Fora
Operações para Tomada de Decisões Suporte a Procedimentos no Hardware do Computador
Exemplo
I Precisamos primeiro criar espaço na pilha: para isso
subtraímos de $sp o valor que precisamos
addi $sp, $sp, -4 # ajustamos a pilha
sw $s0, 0 ($sp) # salva registrador para uso posterior
I Corpo do procedimento
add $t0, $a0, $a1 # $t0 = g + h
add $t1, $a2, $a3 # $t1 = i + j
sub $s0, $t0, $t1 # f = $t0 - $t1
add $v0, $s0, $zero # retorna f ($v0 = $s0 + 0)
I Restauramos valores dos registradores antes do retorno
lw $s0, 0 ($sp) # restaura registrador utilizado
addi $sp, $sp, 4 # exclui um item da pilha
I Procedimento termina com salto para endereço de retorno
jr $ra # retorna para código que chamou procedimento
Departamento de Ciência da Computação Universidade Federal de Juiz de Fora
Operações para Tomada de Decisões Suporte a Procedimentos no Hardware do Computador
Exemplo
Departamento de Ciência da Computação Universidade Federal de Juiz de Fora
Operações para Tomada de Decisões Suporte a Procedimentos no Hardware do Computador
Observações sobre chamadas de procedimentos
I Procedimentos aninhados
I Procedimentos que não chamam outros procedimentos
chamados folha
I Procedimentos podem chamar outros procedimentos?
I O que ocorreria se seguinte sequência ocorresse:
I Programa principal chama procedimento A, passando 3 como
argumento
I Procedimento A chama procedimento B, passando 7 como
argumento
Departamento de Ciência da Computação Universidade Federal de Juiz de Fora
Operações para Tomada de Decisões Suporte a Procedimentos no Hardware do Computador
Observações sobre chamadas de procedimentos
I Poderíamos perder valores originais de $a0 e de $ra
I Solução: empilhar todos os registradores que precisam ser
preservados
I Neste caso, incluindo qualquer registrador temporário que
precise ser utilizado posteriormente
I Caller empilha registradores de argumento ($a0-$a3) e
temporários ($t0-$t9) que sejam necessários após chamada
I Callee empilha $ra e quaisquer registradores $s0-$s7 usados
por ele
I Stack pointer atualizado para refletir total de registradores
salvos na pilha
I No retorno, registradores restaurados e $sp reajustado
Departamento de Ciência da Computação Universidade Federal de Juiz de Fora
Operações para Tomada de Decisões Suporte a Procedimentos no Hardware do Computador
Observações sobre chamadas de procedimentos
I Exercício: Qual o código assembly para a função recursiva
abaixo?
i n t fact ( i n t n ) {
i f ( n < 1) r e t u r n 1 ;
e l s e r e t u r n ( n ∗ fact ( n −1)) ;
}
Departamento de Ciência da Computação Universidade Federal de Juiz de Fora
Operações para Tomada de Decisões Suporte a Procedimentos no Hardware do Computador
Exercício
I Parâmetro n corresponde ao registrador $a0
I Função começa com rótulo, e depois salva registradores na
pilha
fact:
addi $sp, $sp, -8 # ajusta pilha para dois itens
sw $ra, 4($sp) # salva endereço de retorno
sw $a0, 0($sp) # salva argumento n
I Primeira vez que fact chamado: salva endereço do código que
o chamou
I Instruções seguintes testam se n é menor que 1
slti $t0, $a0, 1 #teste se n < 1
beq $t0, $zero, L1 # se n >=1, vai para L1
Departamento de Ciência da Computação Universidade Federal de Juiz de Fora
Operações para Tomada de Decisões Suporte a Procedimentos no Hardware do Computador
Exercício
I Se n<1, fact retorna 1 e restaura valores da pilha
addi $v0, $zero, 1 # retorna 1
addi $sp, $sp, 8 # retira 2 itens da pilha
jr $ra # retorna para depois de jal
I Porque não restauramos $a0 e $ra?
I Porque seus valores não mudaram!
I Se n é maior ou igual à 1, argumento decrementado, e fact
chamado com valor decrementado
L1: addi $a0, $a0, -1 # n >=1 : argumento recebe (n-1)
jal fact # chama fact com (n-1)
Departamento de Ciência da Computação Universidade Federal de Juiz de Fora
Operações para Tomada de Decisões Suporte a Procedimentos no Hardware do Computador
Exercício
I Próxima instrução é onde fact retorna: endereço de retorno
antigo, argumento antigo e stack pointer restaurados
lw $a0, 0 ($sp) # retorna de jal, restaura argumento n
lw $ra, 4 ($sp) # restaura endereço de retorno
addi $sp, $sp, 8 # ajusta stack pointer para retirar 2 itens
I Operação final antes do retorno: cálculo do produto do
argumento antigo pelo valor retornado
mul $v0, $a0, $v0 # retorna n * fact (n - 1)
I Salto para endereço de retorno original
jr $ra # retorna para que chamou
Departamento de Ciência da Computação Universidade Federal de Juiz de Fora
Operações para Tomada de Decisões Suporte a Procedimentos no Hardware do Computador
Observações sobre chamadas de procedimentos
I Alocando espaço para novos dados na pilha
I Pilha também usada para armazenar variáveis locais ao
procedimento que não cabem nos registradores
I Segmento da pilha que contém registradores salvos e variáveis
locais de um procedimento chamado de registro de ativação
(ou frame de procedimento)
I $fp aponta para primeira palavra do registro de ativação
I Como $sp pode mudar ao longo da execução do código,
referência a variáveis locais poderia ter offsets diferentes,
dependendo de onde estiverem no código
I Evitaremos seu uso
Departamento de Ciência da Computação Universidade Federal de Juiz de Fora
Operações para Tomada de Decisões Suporte a Procedimentos no Hardware do Computador
Observações sobre chamadas de procedimentos
Departamento de Ciência da Computação Universidade Federal de Juiz de Fora
Operações para Tomada de Decisões Suporte a Procedimentos no Hardware do Computador
Observações sobre chamadas de procedimentos
I Alocando espaço para novos dados na heap
I Programas C possuem dois tipos de variáveis
I Automáticas: escopo local a um procedimento, sendo
descartadas quanto este termina
I Estáticas: escopo global para variáveis declaradas fora de um
procedimento ou com uso da palavra reservada static
I Registrador $gp simplifica acesso aos dados estáticos
Departamento de Ciência da Computação Universidade Federal de Juiz de Fora
Operações para Tomada de Decisões Suporte a Procedimentos no Hardware do Computador
Observações sobre chamadas de procedimentos
I Variáveis estáticas e estruturas de dados dinâmicas alocadas
segundo uma convenção
Departamento de Ciência da Computação Universidade Federal de Juiz de Fora
Operações para Tomada de Decisões Suporte a Procedimentos no Hardware do Computador
Observações sobre chamadas de procedimentos
I Pilha começa na parte alta da memória e “cresce” para baixo,
como já visto
I Primeira parte da extremidade baixa da memória é reservada
I Código de máquina do MIPS na sequência
I Denominado segmento de texto
I Segmento seguinte chamado de segmento de dados estáticos
I Local para constantes e outras variáveis estáticas
I Heap na sequência
I Armazena dados dinâmicos (malloc do C e new do Java)
Departamento de Ciência da Computação Universidade Federal de Juiz de Fora
Operações para Tomada de Decisões Suporte a Procedimentos no Hardware do Computador
Observações sobre chamadas de procedimentos
I E se houver mais de quatro parâmetros?
I Quatro primeiros parâmetros alocados nos registradores
I Parâmetros extras alocados na pilha
Departamento de Ciência da Computação Universidade Federal de Juiz de Fora
Operações para Tomada de Decisões Suporte a Procedimentos no Hardware do Computador
Próxima aula...
I Instruções: a Linguagem de Máquina
I Comunicando-se com as Pessoas
I Endereçamento no MIPS
I Traduzindo e Iniciando um Programa
Departamento de Ciência da Computação Universidade Federal de Juiz de Fora
	Operações para Tomada de Decisões
	Suporte a Procedimentos no Hardware do Computador

Continue navegando