Introdução Curta ao MIPS



Documentos relacionados
Arquitetura de Computadores

Computadores de Programação (MAB353)

Computadores de Programação (MAB353)

Descrição e análise da implementação em Assembly MIPS da função itoa

Arquitetura de Computadores. Linguagem de Máquina

Guia Rápido MIPS. Tipos de Dados e Formatações

Computadores de Programação (MAB353)

Escreva um programa em código assembly correspondente ao seguinte programa C.

Conjunto de. Instrução MIPS. Parte II. Instruções MIPS. Instruções MIPS. Instruções MIPS :: Instruções lógicas. :: Instruções lógicas

MODOS DE ENDEREÇAMENTO

RISC simples. Aula de Março de

MIPS. Prof. Carlos Bazilio

Arquitetura de Computadores. Assembly Miscelâneas. Mário O. de Menezes.

SSC0902 Organização e Arquitetura de Computadores

ARQUITECTURA DE COMPUTADORES

Conjunto de instruções do CPU. Arquitectura de um computador. Definição das instruções (1) Definição das instruções (2)

Implementação de um soft-core em VHDL baseado no conjunto de instruções MIPS-I

Conjunto de instruções. O Conjunto de Instruções. Conjunto de instruções. Instruções típicas. Instruções típicas. Instruções típicas

Conjunto de Instruções MIPS Parte IV

Introdução à Arquitetura de Computadores

Arquitecturas Alternativas. Pipelining Super-escalar VLIW IA-64

Conflitos. Aula de Março de

Arquitetura de Sistemas Digitais (FTL066) Instruções: Linguagem do Computador Segunda Lista de Exercícios

Arquitetura de Computadores I

MIPS ISA (Instruction Set Architecture)

Tais operações podem utilizar um (operações unárias) ou dois (operações binárias) valores.

SSC0611 Arquitetura de Computadores

Conjunto de Instruções. Conjunto de Instruções

Componentes do Computador e. aula 3. Profa. Débora Matos

Conjunto de Instruções e Arquitectura p.1

ARQUITECTURA DE COMPUTADORES CAPÍTULO II AULA X

Arquitectura de Computadores

CAPÍTULO 7 NÍVEL DE LINGUAGEM DE MONTAGEM

Sistemas Computacionais II Professor Frederico Sauer

Caminho dos Dados e Atrasos

Programação ao nível da máquina. Operações lógicas e aritméticas

ARQUITECTURA DE COMPUTADORES CAPÍTULO II AULA VII

NOTAS DE AULA Prof. Antonio Carlos Schneider Beck Filho (UFSM) Prof. Júlio Carlos Balzano de Mattos (UFPel) Arquitetura de Von Neumann

Sistemas Processadores e Periféricos Aula 3 - Revisão

Registradores na Arquitetura MIPS. 29/4/2016 MIPS - Instruction Set Architecture

SSC0114 Arquitetura de Computadores

ANHANGUERA EDUCACIONAL. Capítulo 2. Conceitos de Hardware e Software

Anotações da 2a Edição

Capítulo 4. MARIE (Machine Architecture Really Intuitive and Easy)

Figura 1 - O computador

1. SINTAXE DA LINGUAGEM ASSEMBLY

O processador é composto por: Unidade de controlo - Interpreta as instruções armazenadas; - Dá comandos a todos os elementos do sistema.

ARQUITETURA DE COMPUTADORES

Conjunto de Instruções

Princípios de funcionamento dos computadores

Arquiteturas RISC. (Reduced Instructions Set Computers)

Arquitetura de Computadores I

Aula 14: Instruções e Seus Tipos

Interrupções. As interrupções são casos especiais de chamadas de procedimentos.

Infraestrutura de Hardware. Instruindo um Computador Subrotinas, Tipos de Dados e Modos de Endereçamento

Memória. Espaço de endereçamento de um programa Endereços reais e virtuais Recolocação dinâmica Segmentação

Arquitectura de Computadores ARQC MIPS. Serviços de Sistemas Exemplos. Serviços de Sistema

Geração de Código. Simão Melo de Sousa

Operações de Controle de Fluxo e Acesso a Memória. Na Aula Anterior... Nesta Aula. Instruções de Controle de Fluxo. if then - else.

Montadores, Link-editores e o Simulador SPIM

O hardware é a parte física do computador, como o processador, memória, placamãe, entre outras. Figura 2.1 Sistema Computacional Hardware

Exercícios Resolvidos

AMBIENTE DE PROGRAMAÇÃO PYTHON

Para os problemas seguintes considere os 5 andares de pipelining do MIPS:

Organização e Arquitetura de Computadores I

Arquitetura de Computadores MIPS

Sistemas Processadores e Periféricos Aula 2 - Revisão

Usando o simulador MIPS

Nível da Microarquitetura

Prova P4/PS Disciplina: Organização de Computadores-EC Professor: Ney Laert Vilar Calazans lui+ori syscall 1. .text 2. main: $s0, string 3.

ULA Sinais de Controle enviados pela UC

Organização e Arquitetura de Computadores I

Exemplo: CC1 CC2 CC3 CC4 CC5 CC6 CC7 CC8 CC9 ADD $s0, $t0, $t1 IF ID EX MEM WB SUB $t2, $s0, $t3 IF Stall Stall ID EX MEM WB

Análises Geração RI (representação intermediária) Código Intermediário

Geração de código. Ivan Ricarte INTRODUÇÃO À COMPILAÇÃO

Introdução. INF1005 Programação I 33K Prof. Gustavo Moreira gmoreira@inf.puc-rio.br

ARQUITECTURA DE COMPUTADORES

Procedimentos e Gestão de Subrotinas

PARTE II - CONJUNTO DE INSTRUÇÕES ARQUITETURA DE COMPUTADORES ANTONIO RAMOS DE CARVALHO JÚNIOR

Informática I. Aula 5. Aula 5-13/05/2006 1

Organização e Arquitetura de Computadores I

ORGANIZAÇÃO BÁSICA DE COMPUTADORES E LINGUAGEM DE MONTAGEM

Organização de Computadores Hardware

Sistemas Processadores e Periféricos Aula 5 - Revisão

2 Formalidades referentes ao trabalho

Bases de Dados. Lab 1: Introdução ao ambiente

5. EXPERIÊNCIAS E ANÁLISE DOS RESULTADOS Os Programas de Avaliação

ArchC. Wesley Nunes Gonçalves

Arquitetura e Organização de Computadores. Capítulo 0 - Introdução

INTRODUÇÃO ÀS LINGUAGENS DE PROGRAMAÇÃO

Microcontroladores e Interfaces 3º Ano Eng. Electrónica Industrial

Arquitectura de Computadores ARQC MIPS. Exemplos. Serviços de Sistema

Unidade 10: A Unidade Lógica Aritmética e as Instruções em Linguagem de Máquina Prof. Daniel Caetano

GUIA DE FUNCIONAMENTO DA UNIDADE CURRICULAR

BARRAMENTO DO SISTEMA

Geração de código intermediário. Novembro 2006

Arquitetura de Computadores - Arquitetura RISC. por Helcio Wagner da Silva

Transcrição:

Introdução Curta ao MIPS Simão Melo de Sousa RELEASE - RELiablE And SEcure Computation Group Computer Science Department University of Beira Interior, Portugal desousa@di.ubi.pt http://www.di.ubi.pt/ desousa/ S. Melo de Sousa (DIUBI) MIPS 1 / 45

Este documento é uma tradução adaptada do capítulo "Introduction à l assembleur MIPS" da sebenta "Cours de Compilation" de Jean-Christophe Filliatre (http://www.lri.fr/ filliatr). S. Melo de Sousa (DIUBI) MIPS 2 / 45

Plano 1 MIPS - conceitos e overview 2 MIPS, formato compacto... S. Melo de Sousa (DIUBI) MIPS 3 / 45

Arquitectura e assembly MIPS Máquina alvo para estas aulas. MIPS na wikipedia Um bom livro de Arquitectura de computador que introduz a arquitectura MIPs: Computer Organization & Design: The Hardware/Software Interface, Second Edition. By John Hennessy and David Patterson. Published by Morgan Kaufmann, 1997. ISBN 1-55860-428-6. uns acetatos completos e pedagógicos sobre o MIPS: (link1) (link2) SPIM: Simulador MIPS (link1) (link2) S. Melo de Sousa (DIUBI) MIPS 4 / 45

Um pouco de Arquitectura de Computadores De forma muitio resumida, um computador é composto de: Uma unidade de cálculo (CPU), contendo un pequeno numero de registos inteiros ou flutuantes mecanismos de cálculo de uma memória (RAM) composta de um grande número de bytes (8 bits) por exemplo, 1Gb = 2 30 bytes = 2 33 bits, ou seja, 2 233 possíveis da memória contém dados e programas (instruções) configurações S. Melo de Sousa (DIUBI) MIPS 5 / 45

Um pouco de Arquitectura de Computadores O acesso à memória custa carro (tendo uma arquitectura capaz de realizar um bilião de instrução por segundo, a luz só consegue percorrer 30 centímetros entre cada instrução) S. Melo de Sousa (DIUBI) MIPS 6 / 45

Um pouco de Arquitectura de Computadores A realidade é um pouco mais complexa... presença de vários (co)processadores, alguns deles dedicados a operações sobre flutuantes uma ou várias caches (políticas LRU, random etc..) virtualização da memória (MMU) etc... S. Melo de Sousa (DIUBI) MIPS 7 / 45

Princípio de execução Esquematicamente, a execução decorre da seguinte forma: um registo ($pc) contém o endereço da instrução por executar lê-se os 4 (ou 8) bytes endereçados por $pc (fase designada de fetch) interpretar estes bits como sendo instruções (fase designada de decode) executar a dita instrução (fase designada de execute) modifica-se o registo $pc por forma a que este endereça a próxima instrução (a instrução seguinte, em geral, caso a instrução actual não obriga a um salto) S. Melo de Sousa (DIUBI) MIPS 8 / 45

Princípio de execução instrução: 000000 00001 00010 0000000000001010 descodificação: add $a1 $a2 10 i.e. juntar 10 ao registo $a1 e arquivar o resultado no registo $a2 S. Melo de Sousa (DIUBI) MIPS 9 / 45

Princípio de execução Aqui também, a realidade é bem mais complexa do que este último, muito simples, exemplo. Pipelines: várias instruções são executadas em paralelo (por exemplo, numa sequência de 3 instruções, enquanto que a primeira é executada, a segunda é já descodificada e a terceira é carregada, isso tudo num só ciclo CPU - i.e. em simultâneo) Branch prediction. Para optimizar o pipelining, existe a possibilidade de adivinhar (com base em determinadas heurísticas) o resultado de instruções de salto (que necessitam fazer um flush do pipeline caso haja salto) S. Melo de Sousa (DIUBI) MIPS 10 / 45

Arquitectura MIPS 32 registos, r 0 r 31 r 0 contém sempre 0 Estes registos podem ser referenciados por outros nomes (correspondentes a uma convenção de nomes admitida nos simuladores que vamos usar): zero, at, v0-v1, a0-a3, t0-t9, s0-s7, k0-k1, gp, sp, fp, ra três tipos de instruções: instruções de transferências, entre registos e/ou memória instruções de cálculo instruções de salto S. Melo de Sousa (DIUBI) MIPS 11 / 45

SPIM Na prática, utilizaremos um simulador MIPS designado por SPIM Em linha de comando: spim [-file] file.s Em modo gráfico: xspim -file file.s (execução passo a passo, visualização dos registos, da memória, etc.) S. Melo de Sousa (DIUBI) MIPS 12 / 45

Instruções MIPS Carregamento de uma constante (16 bits com signo) num registo li $a0, 42 # a0 <- 42 lui $a0, 42 # a0 <- 42 * 2^16 Cópia de um registo para outro move $a0, $a1 # cópia de *a1* para *a0* S. Melo de Sousa (DIUBI) MIPS 13 / 45

Instruções MIPS - aritmética Soma de dois registos add $a0, $a1, $a2 add $a2, $a2, $t5 # a0 <- a1 + a2 # a2 <- a2 + t5 idem para sub, mul, div soma do valor de um registo com uma constante addi $a0, $a1, 42 # a0 <- a1 + 42 (aqui não há o equivalente com subi, muli, divi) negação neg $a0, $a1 # a0 <- -a1 valor absoluto abs $a0, $a1 # a0 <- a1 S. Melo de Sousa (DIUBI) MIPS 14 / 45

Instruções MIPS - bit-wise Negação lógica (not 100111 2 = 011000 2 ) not $a0, $a1 # a0 <- not(a1) Conjunção lógica (and (100111 2, 101001 2 )= 100001 2 ) and $a0, $a1, $a2 # a0 <- and(a1,a2) andi $a0, $a1, 0x3f # a0 <- and(a1,0...0111111) Disjunção lógica (or (100111 2, 101001 2 )= 101111 2 ) and $a0, $a1, $a2 # a0 <- or(a1,a2) andi $a0, $a1, 42 # a0 <- or(a1,0...0101010) S. Melo de Sousa (DIUBI) MIPS 15 / 45

Instruções MIPS - shift left shift (inserção de zeros) sll $a0, $a1, 2 # a0 <- a1 * 4 sllv $a1, $a2, $a3 # a1 <- a2 * 2^a3 right shift aritmético (cópia do bit do sinal) sra $a0, $a1, 2 # a0 <- a1 / 4 right shift lógico (inserção de zeros) srl $a0, $a1, 2 Rotação rol $a0, $a1, 2 ror $a0, $a1, 2 S. Melo de Sousa (DIUBI) MIPS 16 / 45

Instruções MIPS - transferências/leituras ler uma palavra (32 bits) em memória lw $a0, 42($a1) # a0 <- mem[a1 + 42] O endereço é dado por um registo e um offset dado no formato 16 bits com sinal variantes para ler 8 ou 16 com sinal ou não (lb, lh, lbu, lhu). S. Melo de Sousa (DIUBI) MIPS 17 / 45

Instruções MIPS - transferências/escritas escrever uma palavra (32 bits) em memória sw $a0, 42($a1) # mem[a1 + 42] <- a0 #(cuidado com a ordem # dos parâmetros) O endereço é dado por um registo e um offset dado no formato 16 bits com sinal variantes para ler 8 ou 16 (sb, sh). S. Melo de Sousa (DIUBI) MIPS 18 / 45

Instruções MIPS - saltos salto condicional beq $a0, $a1, label # se a0 = a1 salto para label # senão... nada variantes: bne, blt, ble, bgt, bge (assim como comparações sem sinal). variantes: (comparações com zero) beqz, bnez, bltz, blez, bgtz, bgez. S. Melo de Sousa (DIUBI) MIPS 19 / 45

Instruções MIPS - saltos salto incondicional para um endereço j label para um endereço, com arquivo do endereço da instrução seguinte no registo $ra. jal label # jump and link para um endereço arquivado num registo. jr $a0 para um endereço arquivado num registo, com arquivo do endereço da instrução seguinte num registo. jalr $a0, $a1 # salto para $a0, e arquivo da próxima # instrução em $a1 S. Melo de Sousa (DIUBI) MIPS 20 / 45

Instruções MIPS - chamadas ao sistema É possível invocar alguns serviços disponibilizados pela arquitectura de suporte (num simulador, são serviços do sistema operativo subjacente). A instrução MIPS para esta chamada é syscall. O código da instrução por chamar deve estar no registo $v0, os argumentos em $a0 - $a3. O resultado será colocado no registo $v0. Por exemplo, para usufruir dos serviços da função print_int basta: li $v0, 1 #código de print_int li $a0,42 #o valor (do universo) por mostrar syscall S. Melo de Sousa (DIUBI) MIPS 21 / 45

Assembly MIPS Como já sabem... não é costume programar em linguagem máquina, mas sim com recurso ao assembly. O assembly fornece certas facilidades: labels simbólicos alocações de dados globais pseudo-instruções S. Melo de Sousa (DIUBI) MIPS 22 / 45

Assembly MIPS A directiva.text indica que instruções seguem. A directiva.data indica que dados seguem O código ficará arquivado a partir do endereço 0x400000 e os dados ficarão arquivados a partir do endereço 0x10000000. Uma etiqueta simbólica (label) é introduzida por label: e o endereço que ela representa pode ser carregado num registo la $a0, label S. Melo de Sousa (DIUBI) MIPS 23 / 45

Hello world! SPIM invoca o programa endereçado por main e entrega-lhe o endereço onde recomeçar no fim da sua execução no registo $ra.text main: li $v0, 4 # código de print_int la $a0, hw # endereço da string syscall # chamada ao sistema jr $ra # fin do programa.data hw:.asciiz "hello world\n" (.asciiz é uma facilidade para.byte 104, 101,... 0) S. Melo de Sousa (DIUBI) MIPS 24 / 45

Compilação e MIPS O desafio da compilação para o assembly (MIPS, em particular) é conseguir traduzir um linguagem de alto nível para este conjunto de instruções. Em particular, é preciso: traduzir as estruturas de controlo (testes, ciclos, excepções, etc.) traduzir as chamadas às funções traduzir as estruturas de dados complexas (vectores, registos, objectos, fechos, etc.) alocar memória de forma dinâmica S. Melo de Sousa (DIUBI) MIPS 25 / 45

Chamadas a funções Facto: as chamadas a funções podem estar arbitrariamente aninhadas. Os registos podem não chegar para arquivar todos os parâmetros, variáveis locais e outros dados locais a cada chamada É necessário alocar memória para tal As funções procedem na base de uma política last-in first-out, i.e. uma pilha. S. Melo de Sousa (DIUBI) MIPS 26 / 45

A pilha A pilha é posicionada na parte superior, e cresce no sentido dos endereços decrescentes. O registo $sp aponta para o topo da pilha. Os dados dinâmicos (que sobrevivem às chamadas a funções) são alocadas na heap (eventualmente por um GC), na parte inferior da zona de dados, logo a seguir aos dados estáticos. Assim temos casa arrumada... S. Melo de Sousa (DIUBI) MIPS 27 / 45

Chamadas a funções Quando uma função f (quem invoca, ou caller) pretende invocar uma função g (que é chamado ou callee), f executa: jal g quando a função invocada termina, esta devolve o controlo para o caller, com: jr $ra Mas então: se g ela própria invoca uma função, o registo $ra será actualizado (e perderá o valor de que chamou g) da mesma forma, qualquer registo utilizado por g ficará inutilizável por f posteriormente. Existe várias formas de resolver esta problemática, mas de forma geral costuma-se respeitar uma convenção para chamadas S. Melo de Sousa (DIUBI) MIPS 28 / 45

Convenção para chamadas Uso dos registos: $at, $k0, $k1 estão reservados para o Sistema Operativos $a0,..., $a3 usados para passar os 4 primeiros argumentos (ou outros são passados via pilha) $v0,..., $v1 usados para passar devolver o resultado de uma chamada $t0,..., $t9 são registos caller-saved, i.e. o caller deve salvaguarda-los, se necessário. São usados tipicamente para dados que não necessitam sobreviver às chamadas $s0,..., $s7 são registos callee-saved, i.e. o callee deve salvaguarda-los, se necessário. São usados tipicamente para dados de duração longa, que necessitam assim de sobreviver às chamadas $sp, $fp, $ra, $gp são, respectivamente, o apontador para o topo da pilha, o apontador para a frame, o return address e o registo que aponta para o meio da zona de dados estáticos (10008000 16 ) S. Melo de Sousa (DIUBI) MIPS 29 / 45

Chamada, em 4 etapas Há 4 fases numa chamada a uma função: 1 Para o caller, mesmo antes da chamada 2 Para o callee, logo a seguir à chamada 3 Para o callee, mesmo antes do fim da chamada 4 Para o caller, logo a seguir ao fim da chamada Estas organizam-se na base de um segmente de memória localizado no topo da pilha, designada de tabela de activação ou (em inglês) de stack frame, estando este situado entre $fp e $sp. S. Melo de Sousa (DIUBI) MIPS 30 / 45

caller, mesmo antes da chamada 1 Passa os argumentos em $a0 - $a3, e os restantes na pilha (se houver mais do que 4 argumentos) 2 salvaguarda os registos $t0-$t9 que entende utilizar após a chamada (na sua própria tabela de activação ) 3 executa: jal callee S. Melo de Sousa (DIUBI) MIPS 31 / 45

callee, no início da chamada 1 Alocar a sua tabela de activação, por exemplo: addi $sp, $sp, -28 2 Salvaguardar $fp e, a seguir, posicioná-lo, por exemplo sw $fp, 24($sp) addi $fp, $sp, 24 3 salvaguardar $0 - $s7 e $ra caso seja necessário $fp permite alcançar facilmente os argumentos e as variáveis locais, com base num offset fixo, qualquer que seja o estado da pilha. S. Melo de Sousa (DIUBI) MIPS 32 / 45

o callee, no fim da chamada 1 coloca o resultado em $v0 (e em $v1 se for necessário) 2 restabelece os registos salvaguardados 3 pop da sua tabela de activação, por exemplo addi $sp, $sp, 28 4 executa jr $ra S. Melo de Sousa (DIUBI) MIPS 33 / 45

caller, logo a seguir ao fim da chamada 1 pop dos eventuais argumentos 5, 6, etc... (os que não couberam nos reguistos $a0 - $a3) 2 restabelece os registos caller-saved. S. Melo de Sousa (DIUBI) MIPS 34 / 45

Plano 1 MIPS - conceitos e overview 2 MIPS, formato compacto... S. Melo de Sousa (DIUBI) MIPS 35 / 45

MIPS em resumo li $r0, C $r0 <- C lui $r0, C $r0 <- 2^16*C move $r0, $r1 $r0 <- $r1 add $r0, $r1, $r $r0 <- $r1 + $r2 addi $r0, $r1, C $r0 <- $r1 + C sub $r0, $r1, $r2 $r0 <- $r1 - $r2 div $r0, $r1, $r2 $r0 <- $r1 / $r2 div $r1, $r2 $lo <- $r1 / $r2, $hi <- $r1 mod $r2 mul $r0, $r1, $r2 $r0 <- $r1 * $r2 (sem overflow) neg $r0, $r1 $r0 <- -$r1 slt $r0, $r1, $r2 $r0 <- 1 se $r1 < $r2, $r0 <- 0 senão slti $r0, $r1, C $r0 <- 1 se $r1 < C, $r0 <- 0 senão sle $r0, $r1, $r2 $r0 <- 1 se $r1 <= $r2, $r0 <- 0 senão seq $r0, $r1, $r2 $r0 <- 1 se $r1 = $r2, $r0 <- 0 senão sne $r0, $r1, $r2 $r0 <- 1 se $r1 <> $r2, $r0 <- 0 senão S. Melo de Sousa (DIUBI) MIPS 36 / 45

MIPS em resumo la $r0, adr $r0 <- adr lw $r0, adr $r0 <- mem[adr] sw $r0, adr mem[adr] <- $r0 beq $r0, $r1, label salto se $r0 = $r1 beqz $r0, label salto se $r0 = 0 bgt $r0, $r1, label salto se $r0 > $r1 bgtz $r0, label salto se $r0 > 0 beqzal $r0, label salto se $r0 = 0, $ra <- $pc + 1 bgtzal $r0, label salto se $r0 > 0, $ra <- $pc + 1 j label salto para label jal label salto para label, $ra <- $pc + 1 jr $r0 salto para $r0 jalr $r0 salto para $r0, $ra <- $pc + 1 S. Melo de Sousa (DIUBI) MIPS 37 / 45

MIPS em resumo Registers Calling Convention Name Number Use Callee must preserve? $zero $0 constant 0 N/A $at $1 assembler temporary No $v0-$v1 $2-$3 values for function returns and expression evaluation No $a0-$a3 $4-$7 function arguments No $t0-$t7 $8-$15 temporaries No $s0-$s7 $16-$23 saved temporaries Yes $t8-$t9 $24-$25 temporaries No $k0-$k1 $26-$27 reserved for OS kernel N/A $gp $28 global pointer Yes $sp $29 stack pointer Yes $fp $30 frame pointer Yes $ra $31 return address N/A S. Melo de Sousa (DIUBI) MIPS 38 / 45

MIPS - syscall - Chamadas ao sistema Pode depender do simulador utilizado (consultar documentação) Serviço Código em $v0 Argumentos print_int 1 $a0 = o inteiro por imprimir print_float 2 $f12 = o float por imprimir print_double 3 $f12 = o double por imprimir print_string 4 $a0 = endereço da string por imprimir Resultados read_int 5 $v0 = o inteiro devolvido read_float 6 $f0 = o float devolvido read_double 7 $f0 = o double devolvido read_string 8 $a0 = endereço da string por ler $a1 = comprimento da string sbrk/malloc 9 $a0 = quantidade de memória por alocar endereço em $v0 exit 10 $v0 = o código devolvido S. Melo de Sousa (DIUBI) MIPS 39 / 45

MIPS - syscall - Chamadas ao sistema #Print out integer value contained in register $t2 li $v0, 1 # load appropriate system call code into register $v0; # code for printing integer is 1 move $a0, $t2 # move integer to be printed into $a0: $a0 = $t2 syscall # call operating system to perform operation #Read integer value, store in RAM location with label int_value #(presumably declared in data section) li $v0, 5 # load appropriate system call code into register $v0; # code for reading integer is 5 syscall # call operating system to perform operation sw $v0, int_value # value read from keyboard returned in register $v0; # store this in desired location #Print out string (useful for prompts).data string1.asciiz "Print this.\n" # declaration for string variable, #.asciiz directive makes string null terminated.text main: li $v0, 4 # load appropriate system call code into register $v0; # code for printing string is 4 la $a0, string1 # load address of string to be printed into $a0 syscall # call operating system to perform print operation S. Melo de Sousa (DIUBI) MIPS 40 / 45

MIPS - um exemplo : Fib #------------------------------------------------ # fib - recursive Fibonacci function. # http://www.cs.bilkent.edu.tr/~will/courses/ # CS224/MIPS%20Programs/fib_a.htm # # a0 - holds parameter n # s0 - holds fib(n-1) # v0 - returns result #------------------------------------------------ # Code segment.text fib: sub $sp,$sp,12 # save registers on stack sw $a0,0($sp) sw $s0,4($sp) sw $ra,8($sp) bgt $a0,1,notone move $v0,$a0 b fret # fib(0)=0, fib(1)=1 # if n<=1 S. Melo de Sousa (DIUBI) MIPS 41 / 45

MIPS - um exemplo : Fib notone: sub $a0,$a0,1 # param = n-1 jal fib # compute fib(n-1) move $s0,$v0 # save fib(n-1) sub $a0,$a0,1 # set param to n-2 jal fib # and make recursive call add $v0,$v0,$s0 # add fib(n-2) fret: lw $a0,0($sp) # restore registers lw $s0,4($sp) lw $ra,8($sp) add $sp,$sp,12 jr $ra # data segment.data endl:.asciiz "\n" S. Melo de Sousa (DIUBI) MIPS 42 / 45

Instruções macros para a máquina de pilhas Um registo $sp (stack pointer) que aponta para a primeira célula livre da pilha O endereçamento faz-se com base em bytes: uma palavra de 32 bits cabe em 4 bytes. Funções de arquivo e de carregamento na pilha: l e t pushr r = sub $sp, $sp, 4 sw r, 0 ( $sp ) l e t popr r = lw r, 0( $sp ) add $sp, $sp, 4 S. Melo de Sousa (DIUBI) MIPS 43 / 45

S. Melo de Sousa (DIUBI) MIPS 44 / 45

S. Melo de Sousa (DIUBI) MIPS 45 / 45