Buscar

Topico_04 (Conjunto de Instruções)

Prévia do material em texto

Tópico 4: Arquitetura (Conjunto de Instruções)
Prof. Jhonattan Cordoba Ramirez
Escola de Engenharia
Universidade Federal de Minas Gerais (UFMG)
ELT123 - Arquitetura e Organização de Computadores
Para relembrar!
Categoria Instrução Exemplo O que significa
Aritmética
Adição add $s0, $s1, $s2 $s0 = $s1 + $s2
Subtração sub $s0, $s1, $s2 $s0 = $s1 - $s2
Transferência de dados
Carregar palavra lw $s0, 10 ( $s1) $s0 = Memória[$s1+10]
Armazenar palavra sw $s0, 10 ( $s1) Memória[$s1+10] = $s0 
Desvios (Branching) 
Condições tecnológicas para tomar decisões 
e executar múltiplas tarefas de forma 
simultânea
Instruções 
condicionais
Instruções 
cíclicas
If/ifelse/else, switch/case,...... For, while, do,…..
Conditional branches and unconditional branches
Desvios (Branching) 
• Executar instruções fora da sequencia
• Tipos de desvios:
• Desvio condicional:
• Desviar se for igual (Branch if equal – beq)
• Desviar se não for igual (Branch if not equal – bne)
• Desvio incondicional:
• Salto (Jump – j)
• Salto ao registrador (Jump register – jr)
• Salto e ligação (Jump and link – jal)
Condiçã
o
Código 
condicionado
Se 
condição 
for verdade
Se 
condição 
não for 
verdade
Desvio condicional 
addi $s0, $0, 4 # $s0 = 0 + 4 = 4
addi $s1, $0, 1 # $s1 = 0 + 1 = 1
sll $s1, $s1, 2 # $s1 = 1 << 2 = 4
beq $s0, $s1, target # branch is taken
addi $s1, $s1, 1 # not executed
sub $s1, $s1, $s0 # not executed
target: # label
add $s1, $s1, $s0 # $s1 = 4 + 4 = 8
addi $s0, $0, 4 # $s0 = 0 + 4 = 4
addi $s1, $0, 1 # $s1 = 0 + 1 = 1
sll $s1, $s1, 2 # $s1 = 1 << 2 = 4
bne $s0, $s1, target # branch not taken
addi $s1, $s1, 1 # $s1 = 4 + 1 = 5
sub $s1, $s1, $s0 # $s1 = 5 - 4 = 1
target: # label
add $s1, $s1, $s0 # $s1 = 1 + 4 = 5
Labels indicam a localização da instrução: Não podem ser
palavras reservadas e devem ser seguidos por dois pontos (:)
beq $s0, $s1, target # branch
Desvio incondicional 
addi $s0, $0, 4 # $s0 = 0 + 4 = 4
addi $s1, $0, 1 # $s1 = 0 + 1 = 1
j target # jump to target
addi $s1, $s1, 1 # not executed
sub $s1, $s1, $s0 # not executed
target: # label
add $s1, $s1, $s0 # $s1 = 1 + 4 = 5
0x00002000 addi $s0, $0, 0x2010 # $s0 = 0x2010
0x00002004 jr $s0 # jump to 0x00002010
0x00002008 addi $s1, $0, 1 # not executed
0x0000200c sra $s1, $s1, 2 # not executed
0x00002010 lw $s3, 44($s1) # executado após instrução jr
Jump and link???
• Instrução if
• Instrução if/else
• Instrução case
• Loop while
• Loop for
if (i == j)
f = g + h;
f = f - i;
# $s0 = f, $s1 = g, $s2 = h
# $s3 = i, $s4 = j
bne $s3, $s4, L1
add $s0, $s1, $s2
L1: sub $s0, $s0, $s3
Código em C
Código Assembly
O teste codificado em assembly é oposto (i != j) ao código de 
alto nível apresentado (i == j)
Construções de código de alto nível
Construções de código de alto nível
Condiçã
o
Código 
condicionado
Resposta 
falsa
Else
Resposta 
verdadeira
Then
beq Reg_1, Reg_2, End
opcode rs rt endereço
6 bits 5 bits 5 bits 16 bits
rs e rt são os registradores que serão comparados e o endereço de 
16 bits é o desvio.
• Instrução if
• Instrução if/else
• Instrução case
• Loop while
• Loop for
Construções de código de alto nível
if ( x == y ) go to L2; beq $s0, $s1, L2 
#desvia para L2 se x = y
a = b + c; add $s2, $s3, $s4
L2 : a = b - c; L2 : sub $s2, $s3, $s4
Condiçã
o
a = b + c
Resposta 
verdadeir
a
Resposta 
falsa
a = b - c
L2
• Instrução if
• Instrução if/else
• Instrução case
• Loop while
• Loop for
Exemplo
endereço Opcode rs rt rd shamt funct
10000 4 16 17 L2
10004 0 19 20 18 0 32
10008 0 19 20 18 0 34
endereço opcode rs rt rd shamt funct
10000 000100 10000 10001 0010 0111 0001 1000
10004 000000 10011 10100 10010 00000 100000
10008 000000 10011 10100 10010 00000 100010
beq $s0, $s1, L2 
add $s2, $s3, $s4
L2: sub $s2, $s3, $s4
Construções de código de alto nível
if (i == j)
f = g + h;
else
f = f - i;
# $s0 = f, $s1 = g, $s2 = h
# $s3 = i, $s4 = j
bne $s3, $s4, L1
add $s0, $s1, $s2
J done
L1: sub $s0, $s0, $s3
done
Código em C
Código Assembly
• Instrução if
• Instrução if/else
• Instrução case
• Loop while
• Loop for
Construções de código de alto nível
opcode rs rt endereço
6 bits 5 bits 5 bits 16 bits
rs e rt são os registradores que serão comparados e o endereço de 
16 bits é o desvio.
A instrução BEQ é codificada com o número decimal 04, enquanto 
BNE é 05.
bne $s3, $s4, Else # desvia para ELSE se i < > j
add $s0, $s1, $s2 # f = g + h (salta esta instrução se i <> j)
j Exit # desvia para exit
Else: sub $s0, $s1, $s2 # f = g – h (salta esta instrução se i = j)
Exit:
• Instrução if
• Instrução if/else
• Instrução case
• Loop while
• Loop for
O formato da instrução J é um tipo diferente das instruções R e I. As instruções J 
têm apenas dois campos, sendo o OPCODE com 6 bits e o Endereço com 26 bits. 
A instrução J é codificada com o número decimal 02.
Construções de código de alto nível
opcode endereço
6 bits 26 bits
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.
• Instrução if
• Instrução if/else
• Instrução case
• Loop while
• Loop for
Exemplo
bne $s3, $s4, Else
add $s0, $s1, $s2 
j Exit
Else: sub $s0, $s1, $s2 
Exit:
endereço opcode rs rt rd shamt funct
10000 5 19 20 10016
10004 0 17 18 16 0 32
10008 2 10020
10016 0 17 18 16 0 34
10020 EXIT
endereço opcode rs rt rd shamt funct
10000 000100 10011 10100 0010 0111 0010 0000
10004 000000 10001 10010 10000 00000 100000
10008 000010 00 0000 0000 0010 0111 0010 0100
10016 000000 10001 10010 10000 00000 100010
10020 EXIT
Desvio incondicional “Branching” (j – jr)
addi $s0, $0, 4 # $s0 = 0 + 4 = 4
addi $s1, $0, 1 # $s1 = 0 + 1 = 1
j target # jump to target
sra $s0, $s1, 2 # not executed 
addi $s1, $s1, 1 # not executed
sub $s1, $s1, $s0 # not executed
target: # label
add $s1, $s1, $s0 # $s1 = 1 + 4 = 5
0x00002000 addi $s0, $0, 0x2010
0x00002004 jr $s0
0x00002008 addi $s1, $0, 1
0x0000200C sra $s1, $s1, 2
0x00002010 lw $s3, 44($s1)
Labels indicam a localização da instrução: Não podem ser
palavras reservadas e devem ser seguidos por dois pontos (:)
Construções de código de alto nível
• Instrução if
• Instrução if/else
• Instrução case
• Loop while
• Loop for
Exercício:
Obtenha alguns números do teclado até ver zero, e calcule a soma das 
entradas.
syscall para leitura: 5
Construções de código de alto nível
• Instrução if
• Instrução if/else
• Instrução case
• Loop while
• Loop for
Escolher entre quatro possíveis alternativas: 
switch (k) 
{ 
case 0: f=i+j; break; /* k=0*/ 
case 1: f=g+h; break; /* k=1*/ 
case 2: f=g-h; break; /* k=2*/ 
case 3: f=i-j; break; /* k=3*/ 
}
Muito complicado, vamos simplificar!!!
Rescrever como uma sequência de instruções if-else:
If (k==0) f= i + j; 
else if (k==1) f= g + h; 
else if (k==2) f= g - h; 
else if (k==3) f= i - j; 
Construções de código de alto nível
// Determinar o valor de x tal que 2x = 128
int pow = 1;
int x = 0;
while (pow != 128) {
pow = pow * 2;
x = pow; }
# $s0 = pow, $s1 = x
addi $s0, $0, 1 # pow = 1
add $s1, $0, $0 # x = 0
addi $t0, $0, 128 # $t0 é igual à 
128 para comparação
Código em C
Código 
AssemblyO teste codificado em assembly é 
oposto (pow == 128) ao código de alto 
nível apresentado (pow != 128)
while: beq $s0, $t0, done
sll $s0, $s0, 1 # pow = pow * 2
addi $s1, $0, $s0 # x = pow
j while # jump to
done:
• Instrução if
• Instrução if/else
• Instrução case
• Loop while
• Loop for
// Adicione os números de 0 a 
9
int sum = 0;
int i;
for (i = 0; i == 10; i = i++) {
sum = sum + i;}
# $s0 = i, $s1 = sum
addi $s1, $0, 0 # sum = 0
add $s0, $0, $0 # i = 0
addi $t0, $0, 10 # $t0 = 10
Código em C
Código 
Assembly
for: beq $s0, $t0, done # se i == 10, pula para o fim
add $s1, $s1, $s0 # sum = sum + i
addi $s0, $s0, 1 # i = i + 1
j for # jump to
done:
Construções de código de alto nível
For loop (inicialização; condição; operação do 
loop), Inicialização: Executa antes que o loop 
comece, Condição: É testado no início de
cada iteração Operação de loop: Executa no 
final de cada iteração, Declaração: Executa cada 
vez que a condição é satisfeita.
• Instrução if
• Instrução if/else
• Instrução case
• Loop while
• Loop for
Exercícios
if ( x == y) go to L2
a = b - c;
b = a + c;
c = b + a;
L2:
a = a*2
if ( a == b)
c = a + b;
a = b - c;
else
b = a + c;
c = b - c;
if ( a != b)
c = a + b;
a = b - c;
else
b = a + c;
c = b - c;
if ( a > b) – Para > e para <
c = a + b;
a = b - c;
else
b = a + c;
c = b - c;
	Tópico 4: Arquitetura (Conjunto de Instruções)
	Slide Number 2
	Slide Number 3
	Slide Number 4
	Slide Number 5
	Slide Number 6
	Slide Number 7
	Slide Number 8
	Slide Number 9
	Slide Number 10
	Slide Number 11
	Slide Number 12
	Slide Number 13
	Slide Number 14
	Slide Number 15
	Slide Number 16
	Slide Number 17
	Slide Number 18
	Slide Number 19
	Slide Number 20

Continue navegando