Você está na página 1de 12

Faculdade de Ciências Aplicadas e Instruções MIPS

Sociais de Petrolina – FACAPE

Conjunto de Transferência de Dados

Instruções MIPS Lógicas

Parte IV Controle
Suporte a procedimentos

Prof. Sérgio
Adaptado dos slides de Sistemas Processadores do Prof. Frank Torres - UFMG

Organização de Computadores 1 Organização de Computadores 2

Suporte a procedimentos Suporte a procedimentos


:: Quadro de procedimento :: Quadro de procedimento
Quadro de Procedimento (Procedure $fp - first word procedure frame
Frame) ou Registro de Ativação: Pode ser usado para indicar a primeira palavra
do quadro de pilha.
segmento da pilha é usado para salvar o
Atua como registrador base estável dentro de
conteúdo dos registradores e armazenar
um procedimento para referência de memória
variáveis locais.
local.
valor de $sp indica o “topo” da pilha. Seu uso não é obrigatório, mas é necessário
quando $sp é alterado durante a execução do
procedimento.
Organização de Computadores 3 Organização de Computadores 4
Quadro de Procedimento Quadro de procedimento
$sp e $fp :: Ações do chamador
endereços
baixos Passagem de argumentos
os 4 primeiros são colocados nos registradores $a0-
$a3.
o restante é colocado na pilha.
outros argumentos armazenados no quadro do procedimento.
$sp aponta para o último argumento.
Registradores caller-saved
$a0-$a3 e $t0-$t9
salvar se e somente se o chamador precisar do
endereços conteúdo intacto depois que a chamada retornar.
altos
Organização de Computadores 5 Organização de Computadores 6

Quadro de procedimento Instruções MIPS


:: Ações do chamado :: Suporte a procedimentos :: Formato
Alocar memória na pilha: Jump-and-link (jal)
$sp ← $sp – tamanho do quadro
Salvar registradores callee-saved no quadro antes de jal label # desvia para o endereço indicado
alterá-los:
$s0-$s7, $fp e $ra # por label. $ra ← PC + 4
o chamador espera encontrá-los intactos depois da chamada.
salvar $fp a cada procedimento que aloca um novo quadro na Instrução op target
pilha. (decimal): (3)h xxx
só é necessário salvar $ra se o chamado fizer alguma chamada.
jal endereço da instrução
Ao final:
retornar o valor em $v0.
restaurar registradores callee-saved salvos no início da chamada.
000011 xxx (26 bits)
remover o quadro adicionando o tamanho do quadro a $sp.
executar jr $ra.
Organização de Computadores 7 Organização de Computadores 8
Instruções MIPS Instruções MIPS
:: Suporte a procedimentos :: Formato :: Suporte a procedimentos :: Resumo
Jump register (jr)
Categoria Nome Exemplo Operação
jr $t3 # PC ← endereço[$t3]
$31 ← endereço[retorno]
Suporte a jal jal rotulo
op rs rt rd shamt funct PC ← endereço[rotulo]
Instrução
procedimentos
0 11 0 0 0 (8)h jr jr $31 PC ← $31
(decimal):
jr $t3 -- -- -- jr

000000 01011 00000 00000 00000 001000

Organização de Computadores 9 Organização de Computadores 10

Instruções MIPS
Instruções MIPS
:: Transferência de dados
Transferência de Dados MIPS oferece instruções para mover bytes,
halfwords e doublewords:
Lógicas
Load byte: lb
Controle Store byte: sb
Suporte a procedimentos Load halfword: lh
Store halfword: sh
Load doubleword: ld
Store doubleword: sd

Organização de Computadores 11 Organização de Computadores 12


Instruções MIPS Instruções MIPS
:: Transferência de dados :: Transferência de dados
load byte (lb) store byte (sb)
Lê um byte da memória, colocando-o nos 8 bits mais à Separa o byte mais à direita de um registrador e o
direita de um registrador. escreve na memória.
Demais bits do registrador: conservam sinal do byte Demais bits da memória: permanecem inalterados.
carregado.
Processador Memória Processador Memória
endereços conteúdo endereços conteúdo

$reg2 → 12 34 56 AB $reg2 → 12 34 56 EF
00

FF
98 CD
FF FF
70 EF
AB 98 CD 70 EF
lb $reg1, 0($reg2) sb $reg1, 0($reg2)
$reg1 $reg1

Organização de Computadores 13 Organização de Computadores 14

Instruções MIPS Instruções MIPS


:: Transferência de dados :: Transferência de dados
store byte (sb) load halfword (lh) e store halfword (sh)
separa o byte mais à direita de um registrador e o Mesma lógica que lb e sb, mas trabalham com
escreve na memória. halfwords (2 bytes), em vez de bytes isolados.
Demais bits da memória: permanecem inalterados.
Processador Memória
Processador Memória endereços conteúdo
endereços conteúdo
$reg2 → 70
12 EF
34 56 00
$reg2 → 12 EF
34 56 00

98 CD 70 EF
98 CD 70 EF sh $reg1, 2($reg2)
sb $reg1, 2($reg2) $reg1
$reg1

Organização de Computadores 15 Organização de Computadores 16


Instruções MIPS
:: Transferência de dados
load byte unsigned (lb) / load halfword unsigned (lhu)
Lêem um byte/halfword da memória, colocando-o nos 8
bits mais à direita de um registrador.
Demais bits do registrador: preenche-se com zeros. Pseudo-Instruções
Processador Memória
endereços conteúdo

$reg2 → 12 34 56 AB

00
98 CD
00 00
70 EF
AB
lbu $reg1, 0($reg2)
$reg1

Organização de Computadores 17 Organização de Computadores 18

Hierarquia de tradução Pseudo-instruções


Programa C
Compilador São instruções fornecidas por um montador mas
Programa em linguagem não implementadas pelo hardware MIPS.
de montagem
Montador
O montador as aceita como instruções comuns,
Objeto: módulo em Objeto: biblioteca de rotinas
mas as traduzem para instruções equivalentes em
Linguagem de montagem (linguagem de máquina) linguagem de máquina.
Ligador
Executável: programa em
Facilitam o trabalho do programador por oferecer
linguagem de máquina um conjunto mais rico de instruções que aquele
Carregador implementado em hardware, sem complicar este.
Memória
Organização de Computadores 19 Organização de Computadores 20
Pseudo-instruções Pseudo-instruções
O montador utiliza o registrador $at para MAL (MIPS Assembly Language): conjunto
traduzir as pseudo-instruções em de instruções que o programador pode
linguagem de máquina. utilizar para escrever um código assembly
MIPS, o que inclui pseudo-instruções.
Ao se considerar o desempenho (número
de instruções por programa – Ninstr), deve- TAL (True Assembly Language): conjunto
se contar as instruções reais do MIPS. de instruções que podem realmente ser
traduzidas em instruções de linguagem de
máquina (strings de 32 bits binários).
Organização de Computadores 21 Organização de Computadores 22

Pseudo-instruções Pseudo-instruções
:: Exemplos :: Exemplos
Instruções de transferência de dados: Instruções de transferência de dados:
carrega endereço (load address) carrega imediato (load immediate)
la Rdest, Label li Rdest, Const

Exemplos: Exemplos:

lui $at, upper 16 bits li $t2, const lui $at, upper 16 bits
la $t2, label
ori $t2, $at, lower 16 bits ori $t2, $at, lower 16 bits

Organização de Computadores 23 Organização de Computadores 24


Pseudo-instruções Pseudo-instruções
:: Exemplos :: Exemplos
Instruções de transferência de dados: Instruções de rotação:
mover (move) rol Rdest, Rsrc1, Shamt
move Rdest, Rsrc ror Rdest, Rsrc1, Shamt

Exemplos: Exemplos:

move $t2, $t1 addu $t2, $zero, $t1 ror $t2, $t2, 31 sll $at, $t2, 1
srl $t2, $t2, 31
or $t2, $t2, $at

Organização de Computadores 25 Organização de Computadores 26

Pseudo-instruções Pseudo-instruções
:: Exemplos :: Exemplos
Instruções de desvio: Instruções de desvio:
desvia para endereço relativo de 16-bits (branch) desviar se Rsrc1 > Rsrc2
b label
bgt Rsrc1, Rsrc2
Exemplos: desviar se Rsrc1 ≥ Rsrc2
* bge Rsrc1, Rsrc2
b target bgez $0, target desviar se Rsrc1 < Rsrc2
blt Rsrc1, Rsrc2
* bgez → branch if greater or equal zero desviar se Rsrc1 ≤ Rsrc2
ble Rsrc1, Rsrc2
Organização de Computadores 27 Organização de Computadores 28
Pseudo-instruções
:: Exemplos

Pseudo-código: Instrução MIPS:


Chamadas de Sistema
Branch if Greater than slt $at, Rt, Rs
bgt Rs, Rt, Label bne $at, $0, Label

Mais exemplos: Apêndice A do livro do Patterson.

Organização de Computadores 29 Organização de Computadores 30

Chamadas de sistema Chamadas de sistema


A instrução syscall suspende a execução do
programa usuário e transfere o controle para o
sistema operacional.
O sistema operacional acessa então o conteúdo
do registrador $v0 para determinar qual tarefa o
programa usuário está solicitando para ser
realizada.
Quando o sistema operacional termina de cumprir
sua tarefa, o controle retorna ao programa
usuário, onde a próxima instrução é executada.
Organização de Computadores 31 Organização de Computadores 32
Chamadas de sistema Chamadas de sistema
:: Exemplo de leitura de inteiros :: Exemplo de escrita de inteiros

## Get first number from user, put into $t0 ## Print out $t2

li $v0,5 # load syscall read_int into $v0 move $a0,$t2 # move the number to print into $a0
syscall # make the syscall li $v0,1 # load syscall print_int into $v0
move $t0,$v0 # move the number read into $t0 syscall # make the syscall.

Organização de Computadores 33 Organização de Computadores 34

Chamadas de sistema
:: Exemplo de saída do programa

Diretivas
li $v0, 10 # syscall code 10 is for exit.
syscall # make the syscall.

Organização de Computadores 35 Organização de Computadores 36


Diretivas Diretivas
Permitem estabelecer algumas estruturas Não são executadas pelo computador
de dados iniciais que serão acessadas pelo
computador durante a execução. durante o tempo de execução.

As diretivas assembler começam com um


Apenas direcionam o montador a reservar
ponto:
.data
algumas estruturas de dados antes da
.space
execução.
.text
etc.
Organização de Computadores 37 Organização de Computadores 38

Diretivas Diretivas
:: Exemplo (1) :: Exemplo (2)
Código C:
main:
.data # put things into the data segment int MATRIZ[1024];
hello_msg: .asciiz "Hello World\n"

.text # put things into the text segment


la $a0,hello_msg # load the addr of hello_msg into $a0
Código assembly MIPS:
li $v0,4 # 4 is the print_string syscall
syscall # do the syscall
.data # dados devem ser alocados
li $v0,10 # 10 is the exit syscall # no segmento de dados
syscall # do the syscall MATRIZ: .space 4096

Organização de Computadores 39 Organização de Computadores 40


Diretivas Diretivas
:: Exemplo (3) :: Carregar endereço base
Código C: Pseudo-instrução load address (la).
int val[16] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512,
.data
1024, 2048,4096, 8192, 16384, 32768}
val: .word 1, 2, 4, 8, 16, 32, 64, 128, 256, 512,
1024, 2048, 4096, 8192, 16384, 32768

Código assembly MIPS: la $t0, val

val:
.data
.word 1, 2, 4, 8, 16, 32, 64, 128, 256, 512,
Carrega no registrador $t0 o endereço de
1024, 2048, 4096, 8192, 16384, 32768 memória onde a matriz val começa.

Organização de Computadores 41 Organização de Computadores 42

Diretivas
Diretivas
:: Elementos do array
Instrução load word, halfword, byte:
lw, lh, lb

Depende do tipo de diretiva declarada.

Offset de endereço de memória é sempre


dado em bytes.

Organização de Computadores 43 Organização de Computadores 44


O que aprendemos hoje? Exercício
Converta o código em linguagem de alto nível
Suporte a Procedimentos para o código assembly correspondente!
realização dos procedimentos com MIPS Suponha que os valores das variáveis x e y do main()
uso de registradores estejam armazenados em $s1 e $s2.
main:
main(){
pilha int x, y; x:
.data
.word
y: .word
Transferência de dados avançada x = 2;
y = funcao(x);
la $s1,x
la $s2,y

Pseudo-Instruções }
.text
int funcao(a){ addi $s1,$zero,2
Chamadas de Sistema int x; add $a0, $zero,$s1
jal funcao
x = 2 * a; add $s2,$zero,$v0
Diretivas return(x);
funcao:
} sll $v0,$a0,1
Organização de Computadores 45 Organização de Computadores jr $ra 46

Você também pode gostar