a linguagem de máquina – funções e recursividade
DESCRIPTION
A Linguagem de Máquina – Funções e recursividade. Prof. André Luis M. Silva [email protected] orgearq200101.wordpress.com. Funções e Procedimentos. Procedimento ou função é um recurso empregado em linguagens de alto nível para modularizar código. - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: A Linguagem de Máquina – Funções e recursividade](https://reader036.vdocuments.pub/reader036/viewer/2022062411/56814c1a550346895db918b5/html5/thumbnails/1.jpg)
A Linguagem de Máquina – Funções e recursividade
Prof. André Luis M. [email protected]
orgearq200101.wordpress.com
![Page 2: A Linguagem de Máquina – Funções e recursividade](https://reader036.vdocuments.pub/reader036/viewer/2022062411/56814c1a550346895db918b5/html5/thumbnails/2.jpg)
Funções e Procedimentos Procedimento ou função é um recurso empregado em linguagens de alto nível para modularizar código. Chamadas de função usam alguns registradores reservados, são eles:
$a0 - $a3: quatro registradores de argumento, para passar parâmetros $v0-$v1: dois registradores de valor, para valores de retorno $ra: um registrador de endereço de retorno, para retornar ao ponto de origem.
![Page 3: A Linguagem de Máquina – Funções e recursividade](https://reader036.vdocuments.pub/reader036/viewer/2022062411/56814c1a550346895db918b5/html5/thumbnails/3.jpg)
Funções e Procedimentos Registradores reservados para chamada de
funções: $a0 - $a3: quatro registradores de argumento,
para passar parâmetros
$v0-$v1: dois registradores de valor, para valores de retorno
![Page 4: A Linguagem de Máquina – Funções e recursividade](https://reader036.vdocuments.pub/reader036/viewer/2022062411/56814c1a550346895db918b5/html5/thumbnails/4.jpg)
Funções e Procedimentos Registradores reservados para chamada de
funções:
$ra: um registrador de endereço de retorno, para retornar ao ponto de origem.
$PC (program counter): Registrador armazena o endereço da instrução atual sendo executada.
Então qual endereço salvo por jal no registrador $ra?
![Page 5: A Linguagem de Máquina – Funções e recursividade](https://reader036.vdocuments.pub/reader036/viewer/2022062411/56814c1a550346895db918b5/html5/thumbnails/5.jpg)
Funções e Procedimentos Instrução jal (jump and link)
Desvia para um endereço e simultaneamente salva o endereço da instrução seguinte no registrador $ra (endereço de retorno).
Sintaxe jal laco
![Page 6: A Linguagem de Máquina – Funções e recursividade](https://reader036.vdocuments.pub/reader036/viewer/2022062411/56814c1a550346895db918b5/html5/thumbnails/6.jpg)
Funções e Procedimentos Qual seria o código assembly do seguinte
procedimento C?
void exemplo_chamada(){ exemplo_folha(2, 3, 4, 5);}
int exemplo_folha (int g, int h, int i, int j){int f;f = (g + h) – (i + j);return f;
}
Caller ou função chamadora
Callee ou função chamada
![Page 7: A Linguagem de Máquina – Funções e recursividade](https://reader036.vdocuments.pub/reader036/viewer/2022062411/56814c1a550346895db918b5/html5/thumbnails/7.jpg)
Funções e Procedimentosexemplo_chamada: addi $a0, $zero, 2 addi $a1, $zero, 3 addi $a2, $zero, 4 addi $a3, $zero, 5 jal exemplo_folhaexemplo_folha: add $t0, $a0, $a1 # $t0 = g+h add $t1, $a2, $a3 # $t1 = i + j sub $s0, $t0, $t1 # $s0 = (g+h) – (i + j) add $v0, $s0, $zero #return f jr $ra
$sp
![Page 8: A Linguagem de Máquina – Funções e recursividade](https://reader036.vdocuments.pub/reader036/viewer/2022062411/56814c1a550346895db918b5/html5/thumbnails/8.jpg)
Funções e Procedimentos Para codificar funções devemos seguir essas regras.
1. Caller coloca os valores de parâmetro em $a0 - $a3. 2. Caller utiliza jal X para chamar o procedimento X 3. Callee realiza os cálculos, coloca os resultados em $v0-$v1. 4. Callee retorna o controle para o caller usando jr $ra.
![Page 9: A Linguagem de Máquina – Funções e recursividade](https://reader036.vdocuments.pub/reader036/viewer/2022062411/56814c1a550346895db918b5/html5/thumbnails/9.jpg)
Funções e Procedimentos Quando a função possui 5 ou mais
argumentos, o calee realiza um processo denominado spilling registers. Armazenar em memória valores que serão
necessários posteriormente para a execução do programa.
Para controle da memória, o MIPS possui um registrador especial denominado stack pointer ($sp). O stack pointer sempre aponta para o último
endreço alocado mais recentemente.
![Page 10: A Linguagem de Máquina – Funções e recursividade](https://reader036.vdocuments.pub/reader036/viewer/2022062411/56814c1a550346895db918b5/html5/thumbnails/10.jpg)
Spilling Registers
10000$sp = 10000 Stack
![Page 11: A Linguagem de Máquina – Funções e recursividade](https://reader036.vdocuments.pub/reader036/viewer/2022062411/56814c1a550346895db918b5/html5/thumbnails/11.jpg)
Spilling Registers
Valor do registrador $r110000
$sp = 9996 Stack
9996
crescimento
![Page 12: A Linguagem de Máquina – Funções e recursividade](https://reader036.vdocuments.pub/reader036/viewer/2022062411/56814c1a550346895db918b5/html5/thumbnails/12.jpg)
Spilling Registers
Valor do registrador $r110000
$sp = 9992 Stack
9996Valor do registrador $r2
9992
crescimento
![Page 13: A Linguagem de Máquina – Funções e recursividade](https://reader036.vdocuments.pub/reader036/viewer/2022062411/56814c1a550346895db918b5/html5/thumbnails/13.jpg)
Spilling Registers
Spilling registers também são utilizados para preservar valores de registradores salvos.
![Page 14: A Linguagem de Máquina – Funções e recursividade](https://reader036.vdocuments.pub/reader036/viewer/2022062411/56814c1a550346895db918b5/html5/thumbnails/14.jpg)
Spilling Registers Qual seria o código assembly do seguinte procedimento C?
void exemplo_chamada(){ int p = 0; p += 5; exemplo_folha(2, 3, 4, 5);}
int exemplo_folha (int g, int h, int i, int j){int f;f = (g + h) – (i + j);return f;
}
Caller ou função chamadora
Callee ou função chamada
![Page 15: A Linguagem de Máquina – Funções e recursividade](https://reader036.vdocuments.pub/reader036/viewer/2022062411/56814c1a550346895db918b5/html5/thumbnails/15.jpg)
Spilling Registersexemplo_chamada: addi $s0, $s0, 5 addi $a0, $zero, 2 addi $a1, $zero, 3 addi $a2, $zero, 4 addi $a3, $zero, 5 jal exemplo_folhaexemplo_folha: add $t0, $a0, $a1 # $t0 = g+h add $t1, $a2, $a3 # $t1 = i + j sub $s0, $t0, $t1 # $s0 = (g+h) – (i + j) add $v0, $s0, $zero #return f jr $ra
$sp
Problema:Valor de $s0 perdido após a chamada de uma função. Exemplo_folha deve fazer backup do valor.
![Page 16: A Linguagem de Máquina – Funções e recursividade](https://reader036.vdocuments.pub/reader036/viewer/2022062411/56814c1a550346895db918b5/html5/thumbnails/16.jpg)
Spilling Registersexemplo_folha: addi $sp, $sp, -4 sw $s0, 0($sp)
add $t0, $a0, $a1 # $t0 = g+h add $t1, $a2, $a3 # $t1 = i + j sub $s0, $t0, $t1 # $s0 = (g+h) – (i + j) add $v0, $s0, $zero #return f lw $s0, 0($sp) addi $sp, $sp, 4
jr $ra
$sp
Mudanças
Mudanças
Memória
$s0…
Memória
$s0…
$sp
$sp
![Page 17: A Linguagem de Máquina – Funções e recursividade](https://reader036.vdocuments.pub/reader036/viewer/2022062411/56814c1a550346895db918b5/html5/thumbnails/17.jpg)
Funções aninhadas e recursivas Funções que fazem chamadas a outras funções são
chamadas aninhadas. Quando elas chamam a si mesmo, denominamos
recursivas. Tais funções precisam fazer “backup” do registrador
$ra. Porque? Como seria a implementação dessa função?
int fact (int n){ if (n < 1) return (1); else return (n * fact(n – 1));}
![Page 18: A Linguagem de Máquina – Funções e recursividade](https://reader036.vdocuments.pub/reader036/viewer/2022062411/56814c1a550346895db918b5/html5/thumbnails/18.jpg)
Funções aninhadas e recursivasfact:
addi $sp, $sp, -8 #aloca 2 itens em memória sw $ra, 4($sp) # armazena endereço de retorno
sw $a0, 0($sp) # armazena n slti $t0, $a0, 1 # teste para n < 1 beq $t0, $zero, L1 # se n>=1 vai para L1 addi $v0, $zero, 1 # retorna 1 addi $sp, $sp, 8 # retira 2 itens da memória jr $ra #retorna para depois de jal
L1: addi $a0, $a0 -1 #arg1 = n – 1; jal fact #chama fact(n-1);
lw $a0, 0($sp) #retorna de jal. Restaura n lw $ra, 4($sp) #restaura endereço de retorno addi $sp, $sp, 8 #ajusta stack pointer mul $v0, $a0, $v0 # retorna n * fact( n - 1) jr $ra # retorna para o procedimento que o chamou
![Page 19: A Linguagem de Máquina – Funções e recursividade](https://reader036.vdocuments.pub/reader036/viewer/2022062411/56814c1a550346895db918b5/html5/thumbnails/19.jpg)
Suporte a procedimentos no hardware do computador Além dos elementos citados, a memória também pode ser utilizada para armazenar outros elementos.
Alguns exemplos são variáveis locais (tais como arrays ou estruturas) que não cabem em registradores.
Este segmento de memória relativo a um procedimento é conhecido como frame ou registro de ativação.
Em geral os processadores possuem um registradorespecífico para apontar para o início do frame. Este registrador é conhecido como frame pointer ($fp).
![Page 20: A Linguagem de Máquina – Funções e recursividade](https://reader036.vdocuments.pub/reader036/viewer/2022062411/56814c1a550346895db918b5/html5/thumbnails/20.jpg)
Suporte a procedimentos no hardware do computador
![Page 21: A Linguagem de Máquina – Funções e recursividade](https://reader036.vdocuments.pub/reader036/viewer/2022062411/56814c1a550346895db918b5/html5/thumbnails/21.jpg)
Atividade 8 Codifique utilizando assembly. Façam uso da
instrução div $r0, $r1, $r2, onde $r0 = $r1/$r2.
int harmonico( int n){ if (n <= 1) return 1; else return (1/n + harmonico(n-1));}
![Page 22: A Linguagem de Máquina – Funções e recursividade](https://reader036.vdocuments.pub/reader036/viewer/2022062411/56814c1a550346895db918b5/html5/thumbnails/22.jpg)
Atividade 9 Codifique o seguinte código em assembly:
int fibonacci (int n){ int i, atual = 1, anterior =0, auxiliar; if (n ==0) return 0; if (n ==1) return 1; for(i = 2; i <= n; i++){ auxiliar = atual; atual = atual + anterior; anterior = auxiliar; } return atual;}
![Page 23: A Linguagem de Máquina – Funções e recursividade](https://reader036.vdocuments.pub/reader036/viewer/2022062411/56814c1a550346895db918b5/html5/thumbnails/23.jpg)
Atividade 10Codifique o seguinte código em assembly:int ack(n: int, m: int){
if (n == 0) ack = m + 1;else if (n > 0 && m == 0) ack = ack(n-1,m);else ack = ack(n-1,ack(n,m-1));}
![Page 24: A Linguagem de Máquina – Funções e recursividade](https://reader036.vdocuments.pub/reader036/viewer/2022062411/56814c1a550346895db918b5/html5/thumbnails/24.jpg)
Referências Henessy e Patterson Capítulo 2.