O documento descreve instruções em assembly MIPS para condicionais e laços. Ele explica que existem dois tipos de condicionais em MIPS (beq e bne) e fornece exemplos de como implementar estruturas if/else. Também mostra como implementar laços while usando desvios para rótulos já definidos no código.
O documento apresenta um resumo sobre casamento de padrões. Ele introduz o problema de casamento de padrões, definindo texto, padrão e alfabeto. Também descreve as principais categorias de algoritmos para casamento exato de padrões: (1) Algoritmo Naive, que não pré-processa o padrão e tem complexidade O(mn); (2) Algoritmos baseados em autômatos finitos, que pré-processam o padrão e tem complexidade O(n).
O documento discute estimativas de erro em modelos de aprendizagem de máquina. Explica que o erro esperado no conjunto de teste tende a ser maior que no conjunto de treino, devido ao ajuste do modelo aos dados de treino. Também aborda medidas como viés e variância para avaliar estimadores, e como o erro quadrático médio equilibra ambos para medir o desvio total esperado entre a estimativa e o valor real.
O documento discute a avaliação de desempenho de classificadores treinados. Explica que é necessário testar o modelo em um conjunto de dados independente para medir seu desempenho em dados novos. Também apresenta métricas como taxa de erro e curva de aprendizagem para avaliar quantitativamente o modelo.
O documento descreve o algoritmo de máquina de vetor de suporte (SVM), explicando como ele busca encontrar o hiperplano separador de margem máxima entre os dados de treinamento de duas classes. O SVM define fronteiras lineares ótimas para dados linearmente separáveis, maximizando a distância entre o hiperplano separador e os exemplos de treinamento mais próximos, chamados de vetores de suporte. O problema é formulado como um problema de otimização para encontrar os parâmetros ω e b que maximizam essa distância de separação.
O documento descreve as redes neurais e o perceptron. Ele explica que as redes neurais se inspiram nos neurônios biológicos e como o perceptron funciona como a unidade básica de uma rede neural, recebendo sinais de entrada e aplicando uma função de ativação. Também discute possíveis funções de ativação como a função degrau e sigmóide e como os pesos das conexões, incluindo o viés, determinam se um perceptron é ativado ou não.
O documento discute árvores de decisão e florestas aleatórias. Ele explica que árvores de decisão são uma das formas mais simples de aprendizado de máquina, representando uma sequência de regras "se...então" para classificar ou prever saídas com base em atributos de entrada. O documento também descreve características como nós internos representando testes de atributos e folhas especificando saídas, e discute expressividade e variações de árvores de decisão.
O documento apresenta um resumo sobre casamento de padrões. Ele introduz o problema de casamento de padrões, definindo texto, padrão e alfabeto. Também descreve as principais categorias de algoritmos para casamento exato de padrões: (1) Algoritmo Naive, que não pré-processa o padrão e tem complexidade O(mn); (2) Algoritmos baseados em autômatos finitos, que pré-processam o padrão e tem complexidade O(n).
O documento discute estimativas de erro em modelos de aprendizagem de máquina. Explica que o erro esperado no conjunto de teste tende a ser maior que no conjunto de treino, devido ao ajuste do modelo aos dados de treino. Também aborda medidas como viés e variância para avaliar estimadores, e como o erro quadrático médio equilibra ambos para medir o desvio total esperado entre a estimativa e o valor real.
O documento discute a avaliação de desempenho de classificadores treinados. Explica que é necessário testar o modelo em um conjunto de dados independente para medir seu desempenho em dados novos. Também apresenta métricas como taxa de erro e curva de aprendizagem para avaliar quantitativamente o modelo.
O documento descreve o algoritmo de máquina de vetor de suporte (SVM), explicando como ele busca encontrar o hiperplano separador de margem máxima entre os dados de treinamento de duas classes. O SVM define fronteiras lineares ótimas para dados linearmente separáveis, maximizando a distância entre o hiperplano separador e os exemplos de treinamento mais próximos, chamados de vetores de suporte. O problema é formulado como um problema de otimização para encontrar os parâmetros ω e b que maximizam essa distância de separação.
O documento descreve as redes neurais e o perceptron. Ele explica que as redes neurais se inspiram nos neurônios biológicos e como o perceptron funciona como a unidade básica de uma rede neural, recebendo sinais de entrada e aplicando uma função de ativação. Também discute possíveis funções de ativação como a função degrau e sigmóide e como os pesos das conexões, incluindo o viés, determinam se um perceptron é ativado ou não.
O documento discute árvores de decisão e florestas aleatórias. Ele explica que árvores de decisão são uma das formas mais simples de aprendizado de máquina, representando uma sequência de regras "se...então" para classificar ou prever saídas com base em atributos de entrada. O documento também descreve características como nós internos representando testes de atributos e folhas especificando saídas, e discute expressividade e variações de árvores de decisão.
O documento discute aprendizado supervisionado bayesiano. Ele introduz o aprendizado bayesiano como um método probabilístico e descreve que o aprendizado supervisionado tem como objetivo classificação ou regressão para mapear entradas em saídas com base em exemplos.
O documento descreve a regra de Bayes e redes Bayesianas. Ele fornece um exemplo detalhado sobre como calcular a probabilidade de uma mulher ter câncer de mama dado um resultado positivo em um mamograma usando a regra de Bayes. Ele também define brevemente o que são redes Bayesianas, que representam dependências probabilísticas entre variáveis aleatórias através de um grafo direcionado acíclico.
O documento discute o tratamento de incerteza em inteligência artificial. Aborda como a probabilidade e a teoria da decisão podem ser usadas para tomar decisões racionais quando os resultados são incertos, levando em conta a probabilidade de cada resultado e sua utilidade segundo as preferências de quem decide.
O documento discute representação do conhecimento através de ontologias, incluindo taxonomias e herança. Ontologias organizam o conhecimento em categorias hierárquicas e permitem raciocinar sobre objetos classificados. Categorias podem ser representadas como predicados ou objetos. A herança permite que propriedades sejam herdadas por subcategorias.
O documento descreve o funcionamento do algoritmo de backward chaining em programação lógica, começando com uma explicação geral do processo de raciocínio de trás para frente a partir de um objetivo. Em seguida, apresenta formalmente o algoritmo de backward chaining, explicando cada parte do processo de forma recursiva para encontrar substituições que satisfaçam a query dada uma base de conhecimento. Por fim, exemplifica o algoritmo em uma base de conhecimento sobre venda de armas.
O documento descreve os passos para executar resolução e encadeamento para frente em lógica de primeira ordem. Primeiro, as expressões lógicas devem ser convertidas para forma clausal sem quantificadores. Em seguida, as variáveis devem ser substituídas durante a resolução usando o processo de unificação. Por fim, a resolução é executada para derivar novas conclusões.
O documento descreve as bases de dados em lógica de primeira ordem, como interagir com elas fazendo buscas (queries) por meio de sentenças lógicas em LPO, e como qualquer query que possa ser inferida logicamente pela base de dados será respondida afirmativamente. As bases de dados contêm axiomas com informações básicas e teoremas derivados dos axiomas, e o documento discute técnicas como forward chaining, backward chaining e resolução para realizar inferência nas bases de dados.
O documento descreve uma aula sobre lógica de primeira ordem. Apresenta os elementos básicos da lógica de primeira ordem, incluindo termos, predicados e a gramática formal para construir sentenças. Também explica como modelos e interpretações funcionam na lógica de primeira ordem, diferentemente da lógica proposicional.
O documento discute inferência em lógica proposicional, incluindo tipos de provas como verificação de modelos e aplicação de regras de inferência. Ele explica como aplicar regras de inferência como modus ponens e modus tollens para derivar novas sentenças a partir de premissas, formando uma prova.
O documento descreve um algoritmo de busca retroativa para resolver problemas de satisfação de restrições, utilizando forward checking e heurísticas como valores restantes mínimos, grau e valor menos restritivo. O algoritmo é demonstrado passo a passo em um exemplo de coloração de grafos, definindo variáveis, valores e propagando escolhas.
O documento descreve problemas de satisfação de restrições (CSPs), definidos por um conjunto de variáveis, domínios de valores para cada variável, e restrições sobre combinações de valores de variáveis. Apresenta exemplos de agendamento de aulas e coloração de mapas como CSPs, definindo suas variáveis, domínios e restrições.
O documento discute algoritmos genéticos e representação de cromossomos. Ele explica que os cromossomos podem ser representados de várias formas, incluindo binária, valores inteiros e reais. A representação binária é a mais simples, onde o cromossomo consiste de uma sequência de bits. A mutação e o cruzamento ocorrem durante o algoritmo genético para gerar novas soluções.
O documento descreve os princípios da computação evolutiva e algoritmos genéticos. Ele define computação evolutiva como técnicas que simulam a evolução natural, usando seleção, mutação e reprodução. O documento então explica o processo de seleção, mutação e reprodução em algoritmos genéticos e fornece detalhes sobre sua terminologia e funcionamento.
O documento descreve buscas informadas e heurísticas de busca. Ele discute estratégias como melhor primeiro, gulosa e A*, que usam heurísticas para guiar a busca em direção a soluções mais promissoras. O documento também discute problemas que podem ocorrer dependendo da heurística escolhida.
O documento discute busca como uma abordagem para solução de problemas em inteligência artificial. Explica que os problemas podem ser reduzidos a uma busca em um grafo, onde cada nó representa um estado do mundo e as arestas representam ações que levam de um estado a outro. A solução é um caminho no grafo que leva de um estado inicial a um estado final desejado. Exemplos de tipos de problemas incluem determinísticos e não determinísticos.
O documento discute arquivos e exceções em Java. Primeiramente, explica que dados de configuração precisam ser salvos em arquivos para serem preservados entre execuções do programa. Em seguida, descreve como objetos da classe File representam caminhos para arquivos e diretórios, e que escrever dados em arquivos requer objetos FileWriter. Por fim, discute que métodos que manipulam arquivos podem lançar exceções IOException, as quais precisam ser capturadas ou declaradas no método.
Este documento discute métodos abstratos e classes abstratas em Java. Explica que métodos abstratos não têm implementação definida na classe abstrata, mas sim nas subclasses, que são obrigadas a implementá-los. Também explica que a existência de pelo menos um método abstrato torna a classe abstrata, impedindo sua instanciação direta. A classe Casa é usada como exemplo de classe abstrata, já que no sistema modelo existem apenas casas quadradas e retangulares.
As três frases são:
1) O documento discute listas ligadas como uma alternativa a arranjos para alocar dinamicamente espaço na memória para novos itens.
2) Listas ligadas permitem adicionar itens de forma simples, sem necessidade de alocar um novo arranjo maior e copiar o conteúdo do anterior.
3) Cada nó de uma lista ligada contém um valor e um ponteiro para o próximo nó, permitindo navegar pela lista de forma flexível.
O documento discute especificadores de acesso em Java e como eles afetam a herança entre classes. Apresenta exemplos de como atributos privados na classe pai não podem ser acessados na classe filha, mesmo que estejam na memória do objeto, e como os construtores this() e super() devem ser a primeira instrução no construtor da classe filha.
O documento discute aprendizado supervisionado bayesiano. Ele introduz o aprendizado bayesiano como um método probabilístico e descreve que o aprendizado supervisionado tem como objetivo classificação ou regressão para mapear entradas em saídas com base em exemplos.
O documento descreve a regra de Bayes e redes Bayesianas. Ele fornece um exemplo detalhado sobre como calcular a probabilidade de uma mulher ter câncer de mama dado um resultado positivo em um mamograma usando a regra de Bayes. Ele também define brevemente o que são redes Bayesianas, que representam dependências probabilísticas entre variáveis aleatórias através de um grafo direcionado acíclico.
O documento discute o tratamento de incerteza em inteligência artificial. Aborda como a probabilidade e a teoria da decisão podem ser usadas para tomar decisões racionais quando os resultados são incertos, levando em conta a probabilidade de cada resultado e sua utilidade segundo as preferências de quem decide.
O documento discute representação do conhecimento através de ontologias, incluindo taxonomias e herança. Ontologias organizam o conhecimento em categorias hierárquicas e permitem raciocinar sobre objetos classificados. Categorias podem ser representadas como predicados ou objetos. A herança permite que propriedades sejam herdadas por subcategorias.
O documento descreve o funcionamento do algoritmo de backward chaining em programação lógica, começando com uma explicação geral do processo de raciocínio de trás para frente a partir de um objetivo. Em seguida, apresenta formalmente o algoritmo de backward chaining, explicando cada parte do processo de forma recursiva para encontrar substituições que satisfaçam a query dada uma base de conhecimento. Por fim, exemplifica o algoritmo em uma base de conhecimento sobre venda de armas.
O documento descreve os passos para executar resolução e encadeamento para frente em lógica de primeira ordem. Primeiro, as expressões lógicas devem ser convertidas para forma clausal sem quantificadores. Em seguida, as variáveis devem ser substituídas durante a resolução usando o processo de unificação. Por fim, a resolução é executada para derivar novas conclusões.
O documento descreve as bases de dados em lógica de primeira ordem, como interagir com elas fazendo buscas (queries) por meio de sentenças lógicas em LPO, e como qualquer query que possa ser inferida logicamente pela base de dados será respondida afirmativamente. As bases de dados contêm axiomas com informações básicas e teoremas derivados dos axiomas, e o documento discute técnicas como forward chaining, backward chaining e resolução para realizar inferência nas bases de dados.
O documento descreve uma aula sobre lógica de primeira ordem. Apresenta os elementos básicos da lógica de primeira ordem, incluindo termos, predicados e a gramática formal para construir sentenças. Também explica como modelos e interpretações funcionam na lógica de primeira ordem, diferentemente da lógica proposicional.
O documento discute inferência em lógica proposicional, incluindo tipos de provas como verificação de modelos e aplicação de regras de inferência. Ele explica como aplicar regras de inferência como modus ponens e modus tollens para derivar novas sentenças a partir de premissas, formando uma prova.
O documento descreve um algoritmo de busca retroativa para resolver problemas de satisfação de restrições, utilizando forward checking e heurísticas como valores restantes mínimos, grau e valor menos restritivo. O algoritmo é demonstrado passo a passo em um exemplo de coloração de grafos, definindo variáveis, valores e propagando escolhas.
O documento descreve problemas de satisfação de restrições (CSPs), definidos por um conjunto de variáveis, domínios de valores para cada variável, e restrições sobre combinações de valores de variáveis. Apresenta exemplos de agendamento de aulas e coloração de mapas como CSPs, definindo suas variáveis, domínios e restrições.
O documento discute algoritmos genéticos e representação de cromossomos. Ele explica que os cromossomos podem ser representados de várias formas, incluindo binária, valores inteiros e reais. A representação binária é a mais simples, onde o cromossomo consiste de uma sequência de bits. A mutação e o cruzamento ocorrem durante o algoritmo genético para gerar novas soluções.
O documento descreve os princípios da computação evolutiva e algoritmos genéticos. Ele define computação evolutiva como técnicas que simulam a evolução natural, usando seleção, mutação e reprodução. O documento então explica o processo de seleção, mutação e reprodução em algoritmos genéticos e fornece detalhes sobre sua terminologia e funcionamento.
O documento descreve buscas informadas e heurísticas de busca. Ele discute estratégias como melhor primeiro, gulosa e A*, que usam heurísticas para guiar a busca em direção a soluções mais promissoras. O documento também discute problemas que podem ocorrer dependendo da heurística escolhida.
O documento discute busca como uma abordagem para solução de problemas em inteligência artificial. Explica que os problemas podem ser reduzidos a uma busca em um grafo, onde cada nó representa um estado do mundo e as arestas representam ações que levam de um estado a outro. A solução é um caminho no grafo que leva de um estado inicial a um estado final desejado. Exemplos de tipos de problemas incluem determinísticos e não determinísticos.
O documento discute arquivos e exceções em Java. Primeiramente, explica que dados de configuração precisam ser salvos em arquivos para serem preservados entre execuções do programa. Em seguida, descreve como objetos da classe File representam caminhos para arquivos e diretórios, e que escrever dados em arquivos requer objetos FileWriter. Por fim, discute que métodos que manipulam arquivos podem lançar exceções IOException, as quais precisam ser capturadas ou declaradas no método.
Este documento discute métodos abstratos e classes abstratas em Java. Explica que métodos abstratos não têm implementação definida na classe abstrata, mas sim nas subclasses, que são obrigadas a implementá-los. Também explica que a existência de pelo menos um método abstrato torna a classe abstrata, impedindo sua instanciação direta. A classe Casa é usada como exemplo de classe abstrata, já que no sistema modelo existem apenas casas quadradas e retangulares.
As três frases são:
1) O documento discute listas ligadas como uma alternativa a arranjos para alocar dinamicamente espaço na memória para novos itens.
2) Listas ligadas permitem adicionar itens de forma simples, sem necessidade de alocar um novo arranjo maior e copiar o conteúdo do anterior.
3) Cada nó de uma lista ligada contém um valor e um ponteiro para o próximo nó, permitindo navegar pela lista de forma flexível.
O documento discute especificadores de acesso em Java e como eles afetam a herança entre classes. Apresenta exemplos de como atributos privados na classe pai não podem ser acessados na classe filha, mesmo que estejam na memória do objeto, e como os construtores this() e super() devem ser a primeira instrução no construtor da classe filha.
O Que é Um Ménage à Trois?
A sociedade contemporânea está passando por grandes mudanças comportamentais no âmbito da sexualidade humana, tendo inversão de valores indescritíveis, que assusta as famílias tradicionais instituídas na Palavra de Deus.
Atividades de Inglês e Espanhol para Imprimir - AlfabetinhoMateusTavares54
Quer aprender inglês e espanhol de um jeito divertido? Aqui você encontra atividades legais para imprimir e usar. É só imprimir e começar a brincar enquanto aprende!
Slides Lição 11, Central Gospel, Os Mortos Em CRISTO, 2Tr24.pptxLuizHenriquedeAlmeid6
Slideshare Lição 11, Central Gospel, Os Mortos Em Cristo, 1Tr24, Pr Henrique, EBD NA TV, Revista ano 11, nº 1, Revista Estudo Bíblico Jovens E Adultos, Central Gospel, 2º Trimestre de 2024, Professor, Tema, Os Grandes Temas Do Fim, Comentarista, Pr. Joá Caitano, estudantes, professores, Ervália, MG, Imperatriz, MA, Cajamar, SP, estudos bíblicos, gospel, DEUS, ESPÍRITO SANTO, JESUS CRISTO, Com. Extra Pr. Luiz Henrique, 99-99152-0454, Canal YouTube, Henriquelhas, @PrHenrique
REGULAMENTO DO CONCURSO DESENHOS AFRO/2024 - 14ª edição - CEIRI /UREI (ficha...Eró Cunha
XIV Concurso de Desenhos Afro/24
TEMA: Racismo Ambiental e Direitos Humanos
PARTICIPANTES/PÚBLICO: Estudantes regularmente matriculados em escolas públicas estaduais, municipais, IEMA e IFMA (Ensino Fundamental, Médio e EJA).
CATEGORIAS: O Concurso de Desenhos Afro acontecerá em 4 categorias:
- CATEGORIA I: Ensino Fundamental I (4º e 5º ano)
- CATEGORIA II: Ensino Fundamental II (do 6º ao 9º ano)
- CATEGORIA III: Ensino Médio (1º, 2º e 3º séries)
- CATEGORIA IV: Estudantes com Deficiência (do Ensino Fundamental e Médio)
Realização: Unidade Regional de Educação de Imperatriz/MA (UREI), através da Coordenação da Educação da Igualdade Racial de Imperatriz (CEIRI) e parceiros
OBJETIVO:
- Realizar a 14ª edição do Concurso e Exposição de Desenhos Afro/24, produzidos por estudantes de escolas públicas de Imperatriz e região tocantina. Os trabalhos deverão ser produzidos a partir de estudo, pesquisas e produção, sob orientação da equipe docente das escolas. As obras devem retratar de forma crítica, criativa e positivada a população negra e os povos originários.
- Intensificar o trabalho com as Leis 10.639/2003 e 11.645/2008, buscando, através das artes visuais, a concretização das práticas pedagógicas antirracistas.
- Instigar o reconhecimento da história, ciência, tecnologia, personalidades e cultura, ressaltando a presença e contribuição da população negra e indígena na reafirmação dos Direitos Humanos, conservação e preservação do Meio Ambiente.
Imperatriz/MA, 15 de fevereiro de 2024.
Produtora Executiva e Coordenadora Geral: Eronilde dos Santos Cunha (Eró Cunha)
000. Para rezar o terço - Junho - mês do Sagrado Coração de Jesús.pdf
(ACH2055) Arquitetura de Computadores - Aula 04
1. Arquitetura de Computadores
ACH2055
Aula 04 – Assembly MIPS (Parte II)
Norton Trevisan Roman
(norton@usp.br)
1 de novembro de 2019
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 1 / 40
3. Programando em MIPS
Condicionais
Existem 2 condicionais em MIPS
Ambos do tipo I (immediate)
beq reg1, reg2, r´otulo
branch on equal
V´a ao r´otulo se o valor em reg1 for igual ao valor em reg2
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 2 / 40
4. Programando em MIPS
Condicionais
Existem 2 condicionais em MIPS
Ambos do tipo I (immediate)
beq reg1, reg2, r´otulo
branch on equal
V´a ao r´otulo se o valor em reg1 for igual ao valor em reg2
bne reg1, reg2, r´otulo
branch on not equal
V´a ao r´otulo se o valor em reg1 for diferente do valor em reg2
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 2 / 40
5. Programando em MIPS
Condicionais – Exemplo
if (i==j) f = g + h; else f = g - h;
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 3 / 40
6. Programando em MIPS
Condicionais – Exemplo
if (i==j) f = g + h; else f = g - h;
.text
li $s0, 4 # vari´avel f
li $s1, 5 # vari´avel g
li $s2, 2 # vari´avel h
li $s3, 3 # vari´avel i
li $s4, 3 # vari´avel j
bne $s3, $s4, Else
add $s0, $s1, $s2
j Saida
Else: sub $s0, $s1, $s2
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 3 / 40
7. Programando em MIPS
Condicionais – Exemplo
Definimos as vari´aveis
if (i==j) f = g + h; else f = g - h;
.text
li $s0, 4 # vari´avel f
li $s1, 5 # vari´avel g
li $s2, 2 # vari´avel h
li $s3, 3 # vari´avel i
li $s4, 3 # vari´avel j
bne $s3, $s4, Else
add $s0, $s1, $s2
j Saida
Else: sub $s0, $s1, $s2
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 3 / 40
8. Programando em MIPS
Condicionais – Exemplo
Em geral, ´e mais f´acil
testar a condi¸c˜ao
oposta, para j´a
desviar ao else
if (i==j) f = g + h; else f = g - h;
.text
li $s0, 4 # vari´avel f
li $s1, 5 # vari´avel g
li $s2, 2 # vari´avel h
li $s3, 3 # vari´avel i
li $s4, 3 # vari´avel j
bne $s3, $s4, Else
add $s0, $s1, $s2
j Saida
Else: sub $s0, $s1, $s2
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 3 / 40
9. Programando em MIPS
Condicionais – Exemplo
Nesse caso, para
o r´otulo bati-
zado como Else
if (i==j) f = g + h; else f = g - h;
.text
li $s0, 4 # vari´avel f
li $s1, 5 # vari´avel g
li $s2, 2 # vari´avel h
li $s3, 3 # vari´avel i
li $s4, 3 # vari´avel j
bne $s3, $s4, Else
add $s0, $s1, $s2
j Saida
Else: sub $s0, $s1, $s2
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 3 / 40
10. Programando em MIPS
Condicionais – Exemplo
E ent˜ao, se a condi¸c˜ao
oposta n˜ao for
satisfeita, prosseguir
com o c´odigo do if
if (i==j) f = g + h; else f = g - h;
.text
li $s0, 4 # vari´avel f
li $s1, 5 # vari´avel g
li $s2, 2 # vari´avel h
li $s3, 3 # vari´avel i
li $s4, 3 # vari´avel j
bne $s3, $s4, Else
add $s0, $s1, $s2
j Saida
Else: sub $s0, $s1, $s2
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 3 / 40
11. Programando em MIPS
Condicionais – Exemplo
E desviar dire-
tamente `a sa´ıda
if (i==j) f = g + h; else f = g - h;
.text
li $s0, 4 # vari´avel f
li $s1, 5 # vari´avel g
li $s2, 2 # vari´avel h
li $s3, 3 # vari´avel i
li $s4, 3 # vari´avel j
bne $s3, $s4, Else
add $s0, $s1, $s2
j Saida
Else: sub $s0, $s1, $s2
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 3 / 40
12. Programando em MIPS
Condicionais – Exemplo
j r´otulo (jump)
corresponde a um
desvio incondicional `a
posi¸c˜ao de mem´oria
definida pelo r´otulo
if (i==j) f = g + h; else f = g - h;
.text
li $s0, 4 # vari´avel f
li $s1, 5 # vari´avel g
li $s2, 2 # vari´avel h
li $s3, 3 # vari´avel i
li $s4, 3 # vari´avel j
bne $s3, $s4, Else
add $s0, $s1, $s2
j Saida
Else: sub $s0, $s1, $s2
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 3 / 40
13. Programando em MIPS
Condicionais – Exemplo
E se n˜ao houvesse o else?
if (i==j) f = g + h;
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 4 / 40
14. Programando em MIPS
Condicionais – Exemplo
E se n˜ao houvesse o else?
if (i==j) f = g + h;
.text
li $s0, 4 # vari´avel f
li $s1, 5 # vari´avel g
li $s2, 2 # vari´avel h
li $s3, 3 # vari´avel i
li $s4, 3 # vari´avel j
bne $s3, $s4, Saida
add $s0, $s1, $s2
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 4 / 40
15. Programando em MIPS
Condicionais – Exemplo
Far´ıamos um desvio
condicional ao restante
do c´odigo, como se o
restante fosse o else
E se n˜ao houvesse o else?
if (i==j) f = g + h;
.text
li $s0, 4 # vari´avel f
li $s1, 5 # vari´avel g
li $s2, 2 # vari´avel h
li $s3, 3 # vari´avel i
li $s4, 3 # vari´avel j
bne $s3, $s4, Saida
add $s0, $s1, $s2
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 4 / 40
16. Programando em MIPS
Condicionais – Exemplo
Note que, mesmo
executando o
corpo do if, a
instru¸c˜ao no r´otulo
Sa´ıda ser´a rodada
E se n˜ao houvesse o else?
if (i==j) f = g + h;
.text
li $s0, 4 # vari´avel f
li $s1, 5 # vari´avel g
li $s2, 2 # vari´avel h
li $s3, 3 # vari´avel i
li $s4, 3 # vari´avel j
bne $s3, $s4, Saida
add $s0, $s1, $s2
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 4 / 40
17. Programando em MIPS
Condicionais – Outro Exemplo
if ( i < j )
a = b + c;
else
a = b - c;
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 5 / 40
18. Programando em MIPS
Condicionais – Outro Exemplo
if ( i < j )
a = b + c;
else
a = b - c;
.text
li $s0, 4 # variavel a
li $s1, 5 # variavel b
li $s2, 2 # variavel c
li $s3, 2 # variavel i
li $s4, 3 # variavel j
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 5 / 40
19. Programando em MIPS
Condicionais – Outro Exemplo
if ( i < j )
a = b + c;
else
a = b - c;
.text
li $s0, 4 # variavel a
li $s1, 5 # variavel b
li $s2, 2 # variavel c
li $s3, 2 # variavel i
li $s4, 3 # variavel j
slt $t0, $s3, $s4
beq $t0, $zero, Else
add $s0, $s1, $s2
j Saida
Else: sub $s0, $s1, $s2
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 5 / 40
20. Programando em MIPS
Condicionais – Outro Exemplo
if ( i < j )
a = b + c;
else
a = b - c;
.text
li $s0, 4 # variavel a
li $s1, 5 # variavel b
li $s2, 2 # variavel c
li $s3, 2 # variavel i
li $s4, 3 # variavel j
slt $t0, $s3, $s4
beq $t0, $zero, Else
add $s0, $s1, $s2
j Saida
Else: sub $s0, $s1, $s2
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 5 / 40
21. Programando em MIPS
Condicionais – Outro Exemplo
if ( i < j )
a = b + c;
else
a = b - c;
.text
li $s0, 4 # variavel a
li $s1, 5 # variavel b
li $s2, 2 # variavel c
li $s3, 2 # variavel i
li $s4, 3 # variavel j
slt $t0, $s3, $s4
beq $t0, $zero, Else
add $s0, $s1, $s2
j Saida
Else: sub $s0, $s1, $s2
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 5 / 40
22. Programando em MIPS
Condicionais – Outro Exemplo
if ( i < j )
a = b + c;
else
a = b - c;
.text
li $s0, 4 # variavel a
li $s1, 5 # variavel b
li $s2, 2 # variavel c
li $s3, 2 # variavel i
li $s4, 3 # variavel j
slt $t0, $s3, $s4
beq $t0, $zero, Else
add $s0, $s1, $s2
j Saida
Else: sub $s0, $s1, $s2
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 5 / 40
23. Programando em MIPS
Condicionais – Outro Exemplo
if ( i < j )
a = b + c;
else
a = b - c;
.text
li $s0, 4 # variavel a
li $s1, 5 # variavel b
li $s2, 2 # variavel c
li $s3, 2 # variavel i
li $s4, 3 # variavel j
slt $t0, $s3, $s4
beq $t0, $zero, Else
add $s0, $s1, $s2
j Saida
Else: sub $s0, $s1, $s2
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 5 / 40
24. Programando em MIPS
La¸cos
La¸cos nada mais s˜ao que desvios a partes j´a rodadas
do c´odigo:
i = 0;
while (i < 5)
i++;
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 6 / 40
25. Programando em MIPS
La¸cos
La¸cos nada mais s˜ao que desvios a partes j´a rodadas
do c´odigo:
i = 0;
while (i < 5)
i++;
.text
li $t0, 0
Laco: slti $t1, $t0, 5
beq $t1, $zero, Saida
addi $t0, $t0, 1
j Laco
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 6 / 40
26. Programando em MIPS
La¸cos
La¸cos nada mais s˜ao que desvios a partes j´a rodadas
do c´odigo:
i = 0;
while (i < 5)
i++;
.text
li $t0, 0
Laco: slti $t1, $t0, 5
beq $t1, $zero, Saida
addi $t0, $t0, 1
j Laco
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 6 / 40
27. Programando em MIPS
La¸cos
La¸cos nada mais s˜ao que desvios a partes j´a rodadas
do c´odigo:
i = 0;
while (i < 5)
i++;
.text
li $t0, 0
Laco: slti $t1, $t0, 5
beq $t1, $zero, Saida
addi $t0, $t0, 1
j Laco
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 6 / 40
28. Programando em MIPS
La¸cos
La¸cos nada mais s˜ao que desvios a partes j´a rodadas
do c´odigo:
i = 0;
while (i < 5)
i++;
.text
li $t0, 0
Laco: slti $t1, $t0, 5
beq $t1, $zero, Saida
addi $t0, $t0, 1
j Laco
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 6 / 40
29. Programando em MIPS
La¸cos
La¸cos nada mais s˜ao que desvios a partes j´a rodadas
do c´odigo:
i = 0;
while (i < 5)
i++;
.text
li $t0, 0
Laco: slti $t1, $t0, 5
beq $t1, $zero, Saida
addi $t0, $t0, 1
j Laco
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 6 / 40
30. Programando em MIPS
Instru¸c˜oes Relacionais Revista
MIPS usa slt, slti, beq e bne, al´em do valor 0,
para criar todas as opera¸c˜oes relacionais
==, =, <, >, ≤, ≥
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 7 / 40
31. Programando em MIPS
Instru¸c˜oes Relacionais Revista
MIPS usa slt, slti, beq e bne, al´em do valor 0,
para criar todas as opera¸c˜oes relacionais
==, =, <, >, ≤, ≥
N˜ao h´a um branch on less than por ser complicado
Ou aumentaria o ciclo do clock, ou exigiria ciclos extras por
instru¸c˜ao
2 instru¸c˜oes mais r´apidas s˜ao mais ´uteis
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 7 / 40
32. Programando em MIPS
Desvios Incondicionais
Al´em de j r´otulo, h´a outros 2 desvios
incondicionais importantes
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 8 / 40
33. Programando em MIPS
Desvios Incondicionais
Al´em de j r´otulo, h´a outros 2 desvios
incondicionais importantes
jr registrador
jump register
Desvio incondicional ao endere¸co especificado em um
registrador
jr $s2
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 8 / 40
34. Programando em MIPS
Desvios Incondicionais
jal endere¸co do procedimento
jump and link
Carrega em $ra o valor de PC + 4 (Program Counter) e
ent˜ao desvia para a instru¸c˜ao no endere¸co-alvo
$ra cont´em ent˜ao o endere¸co da instru¸c˜ao seguinte ao jal no
c´odigo
Usada em chamadas a sub-rotinas
jal rotulo
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 9 / 40
35. Programando em MIPS
Sub-rotinas
Na execu¸c˜ao de uma sub-rotina, precisamos:
Colocar os parˆametros onde ela possa acessar
Transferir o controle a ela
Alocar a mem´oria necess´aria a ela
Executar a tarefa desejada
Colocar o resultado em um lugar onde quem chamou a
sub-rotina possa encontrar
Devolver o controle ao ponto de origem
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 10 / 40
36. Programando em MIPS
Sub-rotinas
Para auxiliar nessa tarefa, MIPS apresenta a
seguinte conven¸c˜ao de uso de registradores:
$a0 - $a3: parˆametros da sub-rotina
$v0 e $v1: valores de retorno
$ra: endere¸co para retorno ao ponto de origem
$fp: ponteiro para a moldura de pilha (j´a veremos)
$sp: ponteiro para o topo da pilha
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 11 / 40
37. Programando em MIPS
Sub-rotinas
O procedimento a ser seguido ´e, ent˜ao:
A rotina que faz a chamada coloca os parˆametros em $a0 -
$a3
Ela ent˜ao executa “jal X” para ir `a sub-rotina X
A sub-rotina executa seus c´alculos, colocando os resultados
em $v0 e $v1
Ela ent˜ao devolve o controle `a rotina original, executando
“jr $ra”
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 12 / 40
38. Programando em MIPS
Sub-rotinas – Problemas
Existe um n´umero pequeno de registradores de uso
geral → podem vir a ser sobrescritos
Como preservar a informa¸c˜ao anterior?
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 13 / 40
39. Programando em MIPS
Sub-rotinas – Problemas
Existe um n´umero pequeno de registradores de uso
geral → podem vir a ser sobrescritos
Como preservar a informa¸c˜ao anterior?
Com chamadas aninhadas, o pr´oprio $ra ´e
sobrescrito
Como saber para onde retornar, ap´os o t´ermino de uma
dessas chamadas?
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 13 / 40
40. Programando em MIPS
Sub-rotinas – Problemas
Existe um n´umero pequeno de registradores de uso
geral → podem vir a ser sobrescritos
Como preservar a informa¸c˜ao anterior?
Com chamadas aninhadas, o pr´oprio $ra ´e
sobrescrito
Como saber para onde retornar, ap´os o t´ermino de uma
dessas chamadas?
Podemos querer passar mais de 4 parˆametros
Como fazer essa passagem?
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 13 / 40
41. Programando em MIPS
Sub-rotinas – Pilha de Execu¸c˜ao
A solu¸c˜ao ´e armazenar em
mem´oria, em uma pilha
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 14 / 40
42. Programando em MIPS
Sub-rotinas – Pilha de Execu¸c˜ao
A solu¸c˜ao ´e armazenar em
mem´oria, em uma pilha
Fonte: Adaptado de [1]
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 14 / 40
43. Programando em MIPS
Sub-rotinas – Pilha de Execu¸c˜ao
A solu¸c˜ao ´e armazenar em
mem´oria, em uma pilha
Iniciando no maior endere¸co
poss´ıvel
Iniciada manualmente ou pelo
SO
Fonte: Adaptado de [1]
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 14 / 40
44. Programando em MIPS
Sub-rotinas – Pilha de Execu¸c˜ao
A solu¸c˜ao ´e armazenar em
mem´oria, em uma pilha
Iniciando no maior endere¸co
poss´ıvel
Iniciada manualmente ou pelo
SO
´E de suma importˆancia haver
uma conven¸c˜ao para isso
Fonte: Adaptado de [1]
Para que cada rotina e sub-rotina saiba onde encontrar o
que busca
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 14 / 40
45. Programando em MIPS
Pilha de Execu¸c˜ao – Moldura de Pilha
A regi˜ao da pilha destinada
ao gerenciamento de uma
determinada rotina ´e
denominada Moldura de
Pilha
Guardando ent˜ao os registradores
salvos, vari´aveis locais e
argumentos passados `a
sub-rotina que ser´a chamada
Fonte: [1]
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 15 / 40
46. Programando em MIPS
Pilha de Execu¸c˜ao – Moldura de Pilha
Em MIPS, gerenciada via 2
registradores
Fonte: [1]
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 16 / 40
47. Programando em MIPS
Pilha de Execu¸c˜ao – Moldura de Pilha
Em MIPS, gerenciada via 2
registradores
$sp
Stack pointer
Cont´em o endere¸co da ´ultima
palavra da pilha → seu topo Fonte: [1]
Necess´ario para que se saiba onde empilhar nova moldura
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 16 / 40
48. Programando em MIPS
Pilha de Execu¸c˜ao – Moldura de Pilha
$fp
Frame pointer
Cont´em o endere¸co da primeira
palavra da moldura
Fonte: [1]
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 17 / 40
49. Programando em MIPS
Pilha de Execu¸c˜ao – Moldura de Pilha
$fp
Frame pointer
Cont´em o endere¸co da primeira
palavra da moldura
A moldura do topo vai ent˜ao
do $fp ao $sp Fonte: [1]
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 17 / 40
50. Programando em MIPS
Pilha de Execu¸c˜ao – Moldura de Pilha
´E necess´ario mesmo haver
um $fp?
Fonte: [1]
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 18 / 40
51. Programando em MIPS
Pilha de Execu¸c˜ao – Moldura de Pilha
´E necess´ario mesmo haver
um $fp?
N˜ao se pudermos acessar toda a
moldura a partir do $sp
Fonte: [1]
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 18 / 40
52. Programando em MIPS
Pilha de Execu¸c˜ao – Moldura de Pilha
´E necess´ario mesmo haver
um $fp?
N˜ao se pudermos acessar toda a
moldura a partir do $sp
Mas lembre que num
lw reg, desl(reg)
temos 16 bits para o
deslocamento
Sendo 1 o de sinal
Fonte: [1]
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 18 / 40
53. Programando em MIPS
Pilha de Execu¸c˜ao – Moldura de Pilha
Isso nos diz que o m´aximo
que podemos acessar ´e o
endere¸co $sp + 32KB (211
)
Fonte: [1]
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 19 / 40
54. Programando em MIPS
Pilha de Execu¸c˜ao – Moldura de Pilha
Isso nos diz que o m´aximo
que podemos acessar ´e o
endere¸co $sp + 32KB (211
)
Se a moldura for maior, ser´a
necess´ario o uso do $fp
E assim permitimos molduras de
at´e 64KB
Fonte: [1]
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 19 / 40
55. Programando em MIPS
Pilha de Execu¸c˜ao – Moldura de Pilha
Isso nos diz que o m´aximo
que podemos acessar ´e o
endere¸co $sp + 32KB (211
)
Se a moldura for maior, ser´a
necess´ario o uso do $fp
E assim permitimos molduras de
at´e 64KB
Fonte: [1]
Por isso o uso de $fp ´e opcional
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 19 / 40
56. Programando em MIPS
Pilha de Execu¸c˜ao – Moldura de Pilha
Mas mesmo que se acesse
todo o espa¸co, h´a o problema
do $sp ser m´ovel
Ele pode variar durante o
procedimento, mudando sua
distˆancia aos elementos na pilha
Fonte: [1]
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 20 / 40
57. Programando em MIPS
Pilha de Execu¸c˜ao – Moldura de Pilha
Mas mesmo que se acesse
todo o espa¸co, h´a o problema
do $sp ser m´ovel
Ele pode variar durante o
procedimento, mudando sua
distˆancia aos elementos na pilha
$fp fornece ent˜ao uma base
est´avel para referˆencias locais
Fonte: [1]
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 20 / 40
58. Programando em MIPS
Pilha de Execu¸c˜ao – Moldura de Pilha
Podemos, no entanto, evitar
us´a-lo evitando mudan¸cas no
$sp dentro da rotina
Ajustando-o somente na entrada
e sa´ıda da rotina
Fonte: [1]
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 21 / 40
59. Programando em MIPS
Pilha de Execu¸c˜ao – Moldura de Pilha
Podemos, no entanto, evitar
us´a-lo evitando mudan¸cas no
$sp dentro da rotina
Ajustando-o somente na entrada
e sa´ıda da rotina
Quando usarmos, devemos
inicializ´a-lo com o $sp no
in´ıcio da chamada
Fonte: [1]
Assim, ao fim da chamada, restauramos $sp usando o $fp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 21 / 40
60. Programando em MIPS
Sub-rotinas – Pilha de Execu¸c˜ao
O que armazenar na pilha?
Fonte: [1]
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 22 / 40
61. Programando em MIPS
Sub-rotinas – Pilha de Execu¸c˜ao
O que armazenar na pilha?
Imediatamente antes da
chamada `a sub-rotina:
Registradores $a0 - $a3 e $t0 -
$t9 que a rotina possa precisar
ap´os a invoca¸c˜ao da sub-rotina
Parˆametros-extra (para al´em dos
4 registradores)
Fonte: [1]
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 22 / 40
62. Programando em MIPS
Sub-rotinas – Pilha de Execu¸c˜ao
Assim que a sub-rotina inicia:
$fp e $ra (da rotina que a
chamou)
Registradores $s0 – $s7 antes de
modific´a-los, para restaur´a-los
depois
Vari´aveis locais
Fonte: [1]
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 23 / 40
63. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 1
Considere a fun¸c˜ao
int g(int x, int y) {
return(x + y);
}
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 24 / 40
64. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 1
Considere a fun¸c˜ao
Ela n˜ao chama outra
fun¸c˜ao nem possui
vari´aveis locais
N˜ao precisa salvar $ra,
pois ningu´em ir´a
sobrescrever
int g(int x, int y) {
return(x + y);
}
Sequer precisa de moldura na pilha, pois n˜ao h´a o que salvar
nela
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 24 / 40
65. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 1
Considere a fun¸c˜ao
Ela n˜ao chama outra
fun¸c˜ao nem possui
vari´aveis locais
N˜ao precisa salvar $ra,
pois ningu´em ir´a
sobrescrever
int g(int x, int y) {
return(x + y);
}
g: add $v0, $a0, $a1
jr $ra
Sequer precisa de moldura na pilha, pois n˜ao h´a o que salvar
nela
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 24 / 40
66. Programando em MIPS
Pilha de Execu¸c˜ao
Rotinas que n˜ao
chamam outras rotinas
s˜ao denominadas de
rotinas-folha
int g(int x, int y) {
return(x + y);
}
g: add $v0, $a0, $a1
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 25 / 40
67. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
Considere agora essa
outra rotina-folha
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 26 / 40
68. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
Considere agora essa
outra rotina-folha
Dessa vez, com 1 vari´avel
local
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 26 / 40
69. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
Considere agora essa
outra rotina-folha
Dessa vez, com 1 vari´avel
local
Os 4 parˆametros foram
passados em $a0 – $a3
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 26 / 40
70. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 27 / 40
71. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
Associaremos f a $s0
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 27 / 40
72. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
Por ser um registrador salvo, preci-
samos preservar seu valor anterior
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 27 / 40
73. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
Reservamos ent˜ao
espa¸co para $s0 na pilha
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 27 / 40
74. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
Fazemos isso deslo-
cando o topo da pilha
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 27 / 40
75. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
E armazenando $s0 l´a
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 27 / 40
76. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
Prosseguimos nos c´alculos
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 27 / 40
77. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
Prosseguimos nos c´alculos
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 27 / 40
78. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
Prosseguimos nos c´alculos
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 27 / 40
79. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
Note que n˜ao preservamos $t0 e $t1
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 27 / 40
80. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
Isso porque, pela conven¸c˜ao, estes
n˜ao precisam ser preservados
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 27 / 40
81. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
Armazenamos a resposta
no registrador de retorno
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 27 / 40
82. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
Restauramos o valor antigo de $s0
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 27 / 40
83. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
Restauramos o topo da pilha
(desempilhamos a moldura de X)
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 27 / 40
84. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
Voltamos `a instru¸c˜ao pos-
terior `a chamada de X
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 27 / 40
85. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
Uma vez que $sp permaneceu
est´atico (ap´os sua modifica¸c˜ao
inicial), n˜ao precisamos do $fp
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 27 / 40
86. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
. . .
. . .
. . .$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 28 / 40
87. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
. . .
. . .
. . .$sp
Por¸c˜ao da pilha usada
pela rotina atual-
mente em execu¸c˜ao
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 28 / 40
88. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
. . .
. . .
. . .$sp
Por¸c˜ao livre da pilha
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 28 / 40
89. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
. . .
. . .
. . .$sp
Palavra de mem´oria
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 28 / 40
90. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
. . .
. . .
. . .$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 28 / 40
91. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
. . .
. . .
. . .
$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 28 / 40
92. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
. . .
. . .
. . .
$s0$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 28 / 40
93. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
. . .
. . .
. . .
$s0$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 28 / 40
94. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
. . .
. . .
. . .
$s0$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 28 / 40
95. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
. . .
. . .
. . .
$s0$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 28 / 40
96. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
. . .
. . .
. . .
$s0$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 28 / 40
97. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
. . .
. . .
. . .
$s0$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 28 / 40
98. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
. . .
. . .
. . .
$s0
$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 28 / 40
99. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
. . .
. . .
. . .
$s0
$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 28 / 40
100. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
. . .
. . .
. . .
$s0
$sp
Ao final da sub-rotina,
a pilha foi devolvida
ao seu estado inicial
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 28 / 40
101. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
Vejamos um programa
completo
int main(void) {
int x=3;
x = x + m(2, x);
}
int m(int a, int b) {
int y;
y = a*b;
return(y);
}
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 29 / 40
102. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
Vejamos um programa
completo
Com uma rotina-folha
int main(void) {
int x=3;
x = x + m(2, x);
}
int m(int a, int b) {
int y;
y = a*b;
return(y);
}
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 29 / 40
103. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
Vejamos um programa
completo
Com uma rotina-folha
E outra n˜ao folha
int main(void) {
int x=3;
x = x + m(2, x);
}
int m(int a, int b) {
int y;
y = a*b;
return(y);
}
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 29 / 40
104. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
int main(void) {
int x=3;
x = x + m(2, x);
}
int m(int a, int b) {
int y;
y = a*b;
return(y);
}
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 30 / 40
105. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
int main(void) {
int x=3;
x = x + m(2, x);
}
.text
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
...
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 30 / 40
106. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
Associamos x a $s0
int main(void) {
int x=3;
x = x + m(2, x);
}
.text
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
...
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 30 / 40
107. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
Carregamos os parˆametros
nos registradores $a0 e $a1
int main(void) {
int x=3;
x = x + m(2, x);
}
.text
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
...
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 30 / 40
108. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
Carregamos os parˆametros
nos registradores $a0 e $a1
int main(void) {
int x=3;
x = x + m(2, x);
}
.text
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
...
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 30 / 40
109. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
Chamamos a sub-rotina. Nesse
momento, $ra = pc + 4 (o
endere¸co de add $s0...)
int main(void) {
int x=3;
x = x + m(2, x);
}
.text
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
...
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 30 / 40
110. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
Somamos o retorno da sub-
rotina (em $v0) a x, arma-
zenando o resultado em x
int main(void) {
int x=3;
x = x + m(2, x);
}
.text
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
...
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 30 / 40
111. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
Desviamos para o fim do programa
int main(void) {
int x=3;
x = x + m(2, x);
}
.text
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
...
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 30 / 40
112. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
int m(int a, int b) {
int y;
y = a*b;
return(y);
}
...
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 31 / 40
113. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
Os parˆametros est˜ao em $a0 e $a1
int m(int a, int b) {
int y;
y = a*b;
return(y);
}
...
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 31 / 40
114. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
Usaremos $s0 para y, ent˜ao
alocamos espa¸co na pilha
int m(int a, int b) {
int y;
y = a*b;
return(y);
}
...
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 31 / 40
115. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
E persistimos o valor de $s0 l´a
int m(int a, int b) {
int y;
y = a*b;
return(y);
}
...
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 31 / 40
116. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
int m(int a, int b) {
int y;
y = a*b;
return(y);
}
...
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 31 / 40
117. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
Lembre que $v0 conter´a o va-
lor de retorno da sub-rotina
int m(int a, int b) {
int y;
y = a*b;
return(y);
}
...
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 31 / 40
118. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
Terminada a sub-
rotina, restauramos $s0
int m(int a, int b) {
int y;
y = a*b;
return(y);
}
...
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 31 / 40
119. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
E liberamos o espa¸co na pilha
int m(int a, int b) {
int y;
y = a*b;
return(y);
}
...
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 31 / 40
120. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
Retornando `a chamada da sub-rotina
int m(int a, int b) {
int y;
y = a*b;
return(y);
}
...
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 31 / 40
121. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 32 / 40
122. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
. . .$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 32 / 40
123. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
. . .$sp
Inicialmente, $sp est´a
no endere¸co mais alto
poss´ıvel ao programa
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 32 / 40
124. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
. . .$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 32 / 40
125. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
. . .$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 32 / 40
126. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
. . .$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 32 / 40
127. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
. . .$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 32 / 40
128. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
. . .
$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 32 / 40
129. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
. . .
$s0 = 3$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 32 / 40
130. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
. . .
$s0 = 3$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 32 / 40
131. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
. . .
$s0 = 3$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 32 / 40
132. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
. . .
$s0 = 3$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 32 / 40
133. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
. . .
$s0 = 3
$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 32 / 40
134. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
. . .
$s0 = 3
$sp
$ra cont´em o endere¸co da
instru¸c˜ao seguinte ao jal
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 32 / 40
135. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
. . .
$s0 = 3
$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 32 / 40
136. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
. . .
$s0 = 3
$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 32 / 40
137. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
. . .
$s0 = 3
$sp
Novamente o uso do
$fp n˜ao foi necess´ario
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 32 / 40
138. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
E agora o terror do uso da pilha
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 33 / 40
139. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
E agora o terror do uso da pilha
A recurs˜ao
int fat(int n) {
if (n<2) return(1);
return (n * fat(n-1));
}
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 33 / 40
140. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
141. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
142. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
n ´e passado em $a0
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
143. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
Cada chamada recur-
siva tamb´em usar´a $a0
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
144. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
Al´em de $ra, para seu retorno
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
145. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
Precisamos ent˜ao preser-
var na pilha esses valores
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
146. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
Precisamos ent˜ao preser-
var na pilha esses valores
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
147. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
Precisamos ent˜ao preser-
var na pilha esses valores
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
148. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
Precisamos ent˜ao preser-
var na pilha esses valores
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
149. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
150. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
151. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
Se n<2, o valor de retorno ´e 1
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
152. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
Antes de retornar,
restauramos a pilha
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
153. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
Como nada foi mudado, n˜ao
precisamos restaurar $a0 e $ra
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
154. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
155. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
Se n≥2, prosseguimos em L1
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
156. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
Preparamos o parˆametro da
pr´oxima chamada recursiva
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
157. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
E fazemos a chamada
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
158. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
Ao retornar, precisa-
mos fazer $v0 * $a0
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
159. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
Mas $a0 foi modifi-
cado pelas chamadas
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
160. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
Ent˜ao temos que restaur´a-lo
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
161. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
Ent˜ao temos que restaur´a-lo
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
162. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
Aproveitamos para restaurar
o endere¸co de retorno tamb´em
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
163. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
Al´em da pilha
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
164. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
Preparamos o resultado
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
165. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
E retornamos
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
166. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4 (fat(3))
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
. . .$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
167. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4 (fat(3))
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
. . .$sp
Temos que $a0
= 3 (fat(3))
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
168. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4 (fat(3))
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
. . .
$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
169. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4 (fat(3))
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
. . .
$ra = end1
$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
170. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4 (fat(3))
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
. . .
$ra = end1
$a0 = 3$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
171. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4 (fat(3))
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
. . .
$ra = end1
$a0 = 3$sp
$t0 = 0
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
172. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4 (fat(3))
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
. . .
$ra = end1
$a0 = 3$sp
$t0 = 0
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
173. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4 (fat(3))
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
. . .
$ra = end1
$a0 = 3$sp
$a0 = 2
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
174. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4 (fat(3))
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
. . .
$ra = end1
$a0 = 3$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
175. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4 (fat(3))
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
. . .
$ra = end1
$a0 = 3
$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
176. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4 (fat(3))
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
. . .
$ra = end1
$a0 = 3
$ra = end2
$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
177. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4 (fat(3))
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
. . .
$ra = end1
$a0 = 3
$ra = end2
$a0 = 2$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
199. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4 (fat(3))
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
. . .
$ra = end1
$a0 = 3
$ra = end2
$a0 = 2
$ra = end3
$a0 = 1
$sp
Retorna a end1
(a rotina que cha-
mou inicialmente)
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
200. Programando em MIPS
Pilha de Execu¸c˜ao – Mais Parˆametros
At´e 4 parˆametros usamos os registradores $a0-$a3
Precisando de mais, usamos a pilha
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 36 / 40
201. Programando em MIPS
Pilha de Execu¸c˜ao – Mais Parˆametros
At´e 4 parˆametros usamos os registradores $a0-$a3
Precisando de mais, usamos a pilha
Mas onde colocar na pilha?
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 36 / 40
202. Programando em MIPS
Pilha de Execu¸c˜ao – Mais Parˆametros
At´e 4 parˆametros usamos os registradores $a0-$a3
Precisando de mais, usamos a pilha
Mas onde colocar na pilha?
Imediatamente acima do $fp para a nova sub-rotina
Assim, ela poder´a acess´a-los via o $fp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 36 / 40
203. Programando em MIPS
Pilha de Execu¸c˜ao – Mais Parˆametros
Antes de chamar a
sub-rotina a rotina
empilha os argumentos
. . .$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 37 / 40
204. Programando em MIPS
Pilha de Execu¸c˜ao – Mais Parˆametros
Antes de chamar a
sub-rotina a rotina
empilha os argumentos
. . .
arg6
arg5$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 37 / 40
205. Programando em MIPS
Pilha de Execu¸c˜ao – Mais Parˆametros
Antes de chamar a
sub-rotina a rotina
empilha os argumentos
E ent˜ao chama a
sub-rotina, que define
seu $sp
. . .
arg6
arg5$sp
Criando espa¸co para o que for modificar ($fp, $ra etc.)
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 37 / 40
206. Programando em MIPS
Pilha de Execu¸c˜ao – Mais Parˆametros
Antes de chamar a
sub-rotina a rotina
empilha os argumentos
E ent˜ao chama a
sub-rotina, que define
seu $sp
. . .
arg6
arg5
$sp
Criando espa¸co para o que for modificar ($fp, $ra etc.)
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 37 / 40
207. Programando em MIPS
Pilha de Execu¸c˜ao – Mais Parˆametros
Antes de chamar a
sub-rotina a rotina
empilha os argumentos
E ent˜ao chama a
sub-rotina, que define
seu $sp
. . .
arg6
arg5
$sp
Criando espa¸co para o que for modificar ($fp, $ra etc.)
Definindo, por fim, seu $fp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 37 / 40
208. Programando em MIPS
Pilha de Execu¸c˜ao – Mais Parˆametros
Antes de chamar a
sub-rotina a rotina
empilha os argumentos
E ent˜ao chama a
sub-rotina, que define
seu $sp
. . .
arg6
arg5
$sp
$fp
Criando espa¸co para o que for modificar ($fp, $ra etc.)
Definindo, por fim, seu $fp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 37 / 40
209. Programando em MIPS
Pilha de Execu¸c˜ao – Mais Parˆametros
Note que o $sp da
rotina original mudou
. . .$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 38 / 40
210. Programando em MIPS
Pilha de Execu¸c˜ao – Mais Parˆametros
Note que o $sp da
rotina original mudou
. . .
arg6
arg5$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 38 / 40
211. Programando em MIPS
Pilha de Execu¸c˜ao – Mais Parˆametros
Note que o $sp da
rotina original mudou
Esta ´e uma das situa¸c˜oes
em que ajuda ter um $fp,
para evitarmos ter que
rever o endere¸co de cada
elemento na pilha para a
rotina
. . .
arg6
arg5$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 38 / 40
212. Programando em MIPS
Pilha de Execu¸c˜ao – Mais Parˆametros
Note que o $sp da
rotina original mudou
Esta ´e uma das situa¸c˜oes
em que ajuda ter um $fp,
para evitarmos ter que
rever o endere¸co de cada
elemento na pilha para a
rotina
. . .
arg6
arg5$sp
E ´e por isso que definimos o $fp ap´os o $sp
Para podermos guardar o $fp da rotina anterior na pilha
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 38 / 40
213. Referˆencias
1 Patterson, D.A.; Hennessy, J.L. (2013): Computer Organization and
Design: The Hardware/Software Interface. Morgan Kaufmann. 5a
ed.
Para detalhes sobre MIPS consulte tamb´em o Apˆendice A
2 https://www.embarcados.com.br/arquitetura-de-conjunto-
de-instrucoes-mips/
Curso bastante completo, em portuguˆes
3 https://sites.cs.ucsb.edu/~franklin/64/lectures/
mipsassemblytutorial.pdf
Tutorial mais profundo
4 https://youtu.be/y9Wv1RVbbNA
Funcionamento geral da pilha de execu¸c˜ao
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 39 / 40