Escolar Documentos
Profissional Documentos
Cultura Documentos
Matriz?
Matrizes
// Código em C
int array[5];
array[0] = array[0] * 2;
array[1] = array[1] * 2;
loop:
slt $t0, $s1, $t2 # i < 1000?
Código MIPS Assembly beq $t0, $0, done # if not then done
Código em C
# $s0 = array base address, $s1 = i sll $t0, $s1, 2 # $t0 = i * 4 (byte
int array[1000];
# initialization code offset)
int i;
lui $s0, 0x23B8 # $s0 = 0x23B80000 add $t0, $t0, $s0 # address of array[i]
for (i=0; i < 1000; i = i + 1)
ori $s0, $s0, 0xF000 # $s0 = 0x23B8F000 lw $t1, 0($t0) # $t1 = array[i]
array[i] = array[i] * 8;
addi $s1, $0, 0 #i=0 sll $t1, $t1, 3 # $t1 = array[i] * 8
addi $t2, $0, 1000 # $t2 = 1000 sw $t1, 0($t0) # array[i] = array[i] * 8
addi $s1, $s1, 1 #i=i+1
j loop # repeat
done:
Linguagens de alto nível frequentemente utilizam funções (também chamadas procedimentos) para reutilizar
códigos frequentemente acessados e também para fazer um programa mais modular e legível. As funções
possuem entradas, chamadas argumentos, e uma saída, chamada valor de retorno. As funções calculam o
valor de retorno e não causam outros efeitos colaterais indesejáveis.
Quando uma função chama outra, a função chamadora e a função chamada devem concordar em onde colocar
os argumentos e os valores de retorno.
• Chamadora • Chamada
• Coloque argumentos em $ a0- $ a3 • Salve os registros que podem estar com
• Salve todos os registros necessários ($ ra, talvez problemas ($s0 - $s7 ou $t0 - $t9)
$ $t0 - $t9 ou $s0 - $s7 ) • Executar função
• jal callee • Coloque o resultado em $v0
• Restaurar registros • Restaurar registros
• Procure resultado em $ v0 • jr $ra
Exercício
High-level code
int factorial(int n)
{
if (n <= 1)
return 1;
else
return (n * factorial(n-1));
}