Aula 06 - Instruções de Desvio

13
ARQUITETURA E ORGANIZAÇÃO DE COMPUTADORES INSTRUÇÕES DE DESVIO Igor Luiz Oliveira de Souza

description

Arquitetura de sistemas digitais

Transcript of Aula 06 - Instruções de Desvio

Page 1: Aula 06 - Instruções de Desvio

ARQUITETURA E ORGANIZAÇÃO DE COMPUTADORES

INSTRUÇÕES DE DESVIOIgor Luiz Oliveira de Souza

Page 2: Aula 06 - Instruções de Desvio

ARQUITETURA MIPSLinguagem de Montagem (Assembly) – Instruções de desvio

Instruções para tomada de decisão: Alteram o fluxo de controle do programa; Alteram a “próxima” instrução a ser executada.

Instrução de Desvio:

Salto condicional;

Salto incondicional.

Page 3: Aula 06 - Instruções de Desvio

ARQUITETURA MIPSLinguagem de Montagem (Assembly) – Instruções de desvio

Instruções MIPS para salto condicional: Branch if equal (beq); Branch if not equal (bne);

Instruções MIPS para salto incondicional

jump (j)

Page 4: Aula 06 - Instruções de Desvio

ARQUITETURA MIPSLinguagem de Montagem (Assembly) – Instruções de desvio

Branch if equal (beq)

beq registrador1, registrador2, L1

Semântica: Ir até a instrução rotulada por L1 se o valor no registrador 1 for igual ao valor no registrador 2

Page 5: Aula 06 - Instruções de Desvio

ARQUITETURA MIPSLinguagem de Montagem (Assembly) – Instruções de desvio

Branch if not equal (bne):

bne registrador1, registrador2, L1

Semântica: Ir até a instrução rotulada por L1 se o valor no registrador 1 não for igual ao valor no registrador 2

Page 6: Aula 06 - Instruções de Desvio

ARQUITETURA MIPSLinguagem de Montagem (Assembly) – Instruções de desvio

Desvio incondicional :

J rotulo

Semântica: Ir para o rótulo especificado, incondicionalmente.

Page 7: Aula 06 - Instruções de Desvio

ARQUITETURA MIPSLinguagem de Montagem (Assembly) – Instruções de desvioSupondo que as cinco variáveis de f ate j corresponda aos cinco registradores de $s0 a $s4, qual p código MIPS gerado pelo compilador?

if ( i == j)

f = g + h;

else

f = g – h;

Page 8: Aula 06 - Instruções de Desvio

ARQUITETURA MIPSLinguagem de Montagem (Assembly) – Instruções de desvioVejamos a solução:

bne $s3, $s4, Else # Desvia para Else se i ≠ j

add $s0, $s1, $s2 # f = g + h (ignorada se i ≠ j )

j Exit # Desvia para Exit

Else: sub $s0, $s1, $s2 # f = g – h (ignorada se i=j)

Exit: # Label Exit

Page 9: Aula 06 - Instruções de Desvio

ARQUITETURA MIPSLinguagem de Montagem (Assembly) – Instruções de desvioSe i, j, e k correspondem aos registradores $s3, $s4 e $s5, e o endereço base do vetorsave está no registrador $s6, qual o código assembly MIPS correspondente?

while (save[i] == k)

i = i + j;

Page 10: Aula 06 - Instruções de Desvio

ARQUITETURA MIPSLinguagem de Montagem (Assembly) – Instruções de desvioTemos inicialmente que carregar save[i] para um registrador temporário:Loop: add $t1, $s3, $s3 # $t1 = 2*i

add $t2, $t1, $t1 # $t2 = 4*iadd $t3, $t2,$s6 # $t3 = 4*i + $s6 = endereço de save[i]lw $t4, 0($t3) # $t4 = valor de save[i]

Agora fazemos o teste do loop, saindo se save[i] != k:bne $t4, $s5, Exit # vá para Exit se save[i] !=k

Não sendo diferente, soma:add $s3,$s3,$s4 # i = i + j

Devemos então voltar para o while no início do loopJ Loop # vá para o Loop

Exit:

Page 11: Aula 06 - Instruções de Desvio

ARQUITETURA MIPSLinguagem de Montagem (Assembly) – Instruções de desvio

Loop: add $t1, $s3, $s3 # $t1 = 2*iadd $t2, $t1, $t1 # $t2 = 4*iadd $t3, $t2,$s6 # $t3 = 4*i + $s6 = endereço de save[i]lw $t4, 0($t3) # $t4 = valor de save[i]

bne $t4, $s5, Exit # vá para Exit se save[i] !=k

add $s3,$s3,$s4 # i = i + j

J Loop # vá para o LoopExit:

Page 12: Aula 06 - Instruções de Desvio

ARQUITETURA MIPSLinguagem de Montagem (Assembly) – Instruções de desvioSejam A e B com o endereço de memória dado nos registradores, respectivamente, em $s0 e $s1. Qual ocódigo assembly MIPS correspondente?

if (A==B)A++;

elseB++;

_______________________

if (A!=5)

A++;

else

A--;

Page 13: Aula 06 - Instruções de Desvio

ARQUITETURA MIPSLinguagem de Montagem (Assembly) – Instruções de desvioSejam A e B com o endereço de memória dado nos registradores, respectivamente, em$s0 e $s1. Qual o código assembly MIPS correspondente?

A=0;

while (A!=5){

B = A+A;A = A+1;

}