Baixe o app para aproveitar ainda mais
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
Compartilhar