Escolar Documentos
Profissional Documentos
Cultura Documentos
Instruções Instruções
condicionais cíclicas
beq
beq
$s0, $s1, target # branch
$s0, $s1, target # branch is taken
addi $s1, $s1, 1 # not executed
bne $s0, $s1, target # branch not taken
addi $s1, $s1, 1 # $s1 = 4 + 1 = 5
sub $s1, $s1, $s0 # not executed sub $s1, $s1, $s0 # $s1 = 5 - 4 = 1
addi $s0, $0, 4 # $s0 = 0 + 4 = 4 0x00002000 addi $s0, $0, 0x2010 # $s0 = 0x2010
addi $s1, $0, 1 # $s1 = 0 + 1 = 1 0x00002004 jr $s0 # jump to 0x00002010
j target # jump to target 0x00002008 addi $s1, $0, 1 # not executed
addi $s1, $s1, 1 # not executed 0x0000200c sra $s1, $s1, 2 # not executed
sub $s1, $s1, $s0 # not executed 0x00002010 lw $s3, 44($s1) # executado após instrução jr
target: # label
add $s1, $s1, $s0 # $s1 = 1 + 4 = 5 Jump and link???
Construções de código de alto nível
if (i == j)
Código em C f = g + h;
• Instrução if
f = f - i;
• Instrução if/else
• Instrução case bne $s3, $s4, L1
# $s0 = f, $s1 = g, $s2 = h
• Loop while Código Assembly add $s0, $s1, $s2
# $s3 = i, $s4 = j
• Loop for L1: sub $s0, $s0, $s3
opcode rs rt endereço
beq Reg_1, Reg_2, End
6 bits 5 bits 5 bits 16 bits
• Instrução if
rs e rt são os registradores que serão comparados e o endereço de
• Instrução if/else
16 bits é o desvio.
• Instrução case
• Loop while
• Loop for
Condiçã
o Resposta
falsa
Else
Resposta
verdadeira
Then Código
condicionado
Construções de código de alto nível
10000 4 16 17 L2
10008 0 19 20 18 0 34
if (i == j)
• Instrução if
Código em C f = g + h;
• Instrução if/else
else
• Instrução case
f = f - i;
• Loop while
• Loop for
bne $s3, $s4, L1
# $s0 = f, $s1 = g, $s2 = h
Código Assembly add $s0, $s1, $s2
# $s3 = i, $s4 = j
J done
L1: sub $s0, $s0, $s3
done
Construções de código de alto nível
opcode rs rt endereço
6 bits 5 bits 5 bits 16 bits
• Instrução if
• Instrução if/else rs e rt são os registradores que serão comparados e o endereço de
• Instrução case 16 bits é o desvio.
• Loop while A instrução BEQ é codificada com o número decimal 04, enquanto
• Loop for BNE é 05.
• Loop while
6 bits 26 bits
• Loop for Ambas as instruções BEQ e BNE FORÇAM a ida para o bloco de comando ELSE,
sempre devemos nos lembrar disso.
Se usarmos BEQ funcionará? Bom, BEQ forçará a entrada para ELSE se e
somente se i for igual a i. Quando no código em alto nível vai entrar no ELSE?
Entrará no ELSE quando i for diferente de j e não o contrário.
A instrução j, indica o fim da execução desse bloco de instruções e, dessa forma o
processador continua a executar o programa.
Exemplo
endereço opcode rs rt rd shamt funct
10000 5 19 20 10016
10004 0 17 18 16 0 32
10008 2 10020
10020 EXIT
add $s0, $s1, $s2
j Exit
endereço opcode rs rt rd shamt funct
Else: sub $s0, $s1, $s2 10000 000100 10011 10100 0010 0111 0010 0000
10004 000000 10001 10010 10000 00000 100000
10020 EXIT
Desvio incondicional “Branching” (j – jr)
target: # label
add $s1, $s1, $s0 # $s1 = 1 + 4 = 5
Exercício:
Obtenha alguns números do teclado até ver zero, e calcule a soma das
• Instrução if
entradas.
• Instrução if/else
• Instrução case
syscall para leitura: 5
• Loop while
• Loop for
Construções de código de alto nível
Código addi $s0, $0, 1 # pow = 1 sll $s0, $s0, 1 # pow = pow * 2
Assembly add $s1, $0, $0 #x=0 addi $s1, $0, $s0 # x = pow
addi $t0, $0, 128 # $t0 é igual à j while # jump to
128 para comparação done:
Construções de código de alto nível
For loop (inicialização; condição; operação do Código em C
loop), Inicialização: Executa antes que o loop // Adicione os números de 0 a
• Instrução if comece, Condição: É testado no início de 9
• Instrução if/else cada iteração Operação de loop: Executa no int sum = 0;
• Instrução case final de cada iteração, Declaração: Executa cada int i;
• Loop while vez que a condição é satisfeita. for (i = 0; i == 10; i = i++) {
• Loop for sum = sum + i;}
# $s0 = i, $s1 = sum for: beq $s0, $t0, done # se i == 10, pula para o fim
addi $s1, $0, 0 # sum = 0 add $s1, $s1, $s0 # sum = sum + i
Código
Assembly add $s0, $0, $0 #i=0 addi $s0, $s0, 1 #i=i+1
addi $t0, $0, 10 # $t0 = 10 j for # jump to
done:
Exercícios
if ( x == y) go to L2 if ( a != b)
a = b - c; c = a + b;
b = a + c; a = b - c;
c = b + a; else
L2: b = a + c;
a = a*2 c = b - c;