Baixe o app para aproveitar ainda mais
Prévia do material em texto
26/01/2016 1 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly MIPS • Simuladores MIPS • SPIM – é o emulador tradicional para programação em MIPS em PC • MARS – também é um emulador, mas aproxima-se mais a um IDE, tornando mais fácil a programação em MIPS (é o que vai ser utilizado na aulas práticas.) António Godinho - to@isec.pt Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly MIPS - instruções • Comandos básicos executados diretamente pelo processador • Processo de compilação (back-end) 1. Código fonte (passado para o compilador em C por exemplo)2. Etapas de analise (identificação de erros) – font-End3. Etapas de síntese – back-end• Seleção de instruções (tradução do código fonte em instruções MIPS)• Alocação de registos (elementos de memória internos do processador, utilizados para executar as instruções)• Montagem António Godinho - to@isec.pt compiladorcompilador 26/01/2016 2 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly MIPS – Machine Language António Godinho - to@isec.pt Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly MIPS – Estrutura de um programa • .data # declaração de variáveis após esta linha• # ... • .text # instruções após esta linha • main: # etiqueta que marca o inicio do código, não obrigatório, mas deve • # ... • # Fim do programa, existe uma norma em deixar uma linha em branco • NOTA: # blabla – é um comentário António Godinho - to@isec.pt 26/01/2016 3 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly MIPS – Variáveis • Formato das declarações:• nome: .tipo_de_dados valor(es)• cria uma variável na memória, com o tipo especificado, o nome e valores dados.valor(es) usualmente dão o valor inicial; para reservar memória use o tipo .space, dá o número de espaços a serem alocados.Obs: Labels sempre são seguidos de dois pontos ( : ) • Exemplos:• var1: .word 3 # cria uma variável inteiro de valor 3• array1: .byte 'a','b' # cria um vetor(array) de dois elementos já inicializados para a e b• array2: .space 40 • # aloca 40 espaços consecutivos de bytes, não inicializados. Poderia ser usado como um vetor de 40 caracteres ou um vetor de 10 inteiros, por exemplo. (usar um comentário para informar que tipo de vetor vai ser usado é uma boa prática de programação). António Godinho - to@isec.pt Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly MIPS – variáveis • .ascii str guarda uma string em memória, mas sem o terminador. • .asciiz str guarda uma string em memória, mas com o nulo terminador. O "z" define o zero, que é o código ASCII code para o caracter nulo (Como em C). • .byte b1, ..., bn guarda n bytes seguidos em memória. Podem ser em decimal ou hex. • .halfword h1, ..., hn guarda n 16-bit halfwords de forma continua em memória. Podem ser emdecimal ou hex. Os endereços são divisiveis por 2. Pouco utilizado… • .word w1, ..., wn guarda nn 32-bit words de forma continua em memória. Podem ser emdecimal ou hex. Os endereços são divisiveis por 4. • .space numBytes Reserva numBytes de espaço em memória. António Godinho - to@isec.pt 26/01/2016 4 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly - Registos • MIPS suporta 32 registos genéricos: • $zero - guarda o valor 0. Não pode ser modificado. • $v0-1 - utilizados para chamadas ao sistema e retornar valores de procedimentos. • $a0-3 - utilizados para passar valores por argumento para procedimentos. • $t0-9 - utilizado para guardar valores locais. “caller saves”. • $s0-7 - utilizado para guardar valores locais. “procedure saves”. • $sp - stack pointer. • $fp - frame pointer. Utilizado para manipulações do stack. • $ra - endereço de retorno depois de um procedimento. • $gp - ppnteiro para a área de guardar dados globais (data segment) • $at - reservado para o uso do assembler • $k0-1 reservado para uso do OS kernel António Godinho - to@isec.pt Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly - Registos • Convenção • $a0 - $a3v : 4 registos para passar valores por argumento • $v0 - $v1 : 2 registos para retorno de valores • $ra – um registo com o endereço para returnar ao ponto antes do procedimento António Godinho - to@isec.pt 26/01/2016 5 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly - Registos • Todos os exemplos começam pelo “Hello World” • Ver no MARS António Godinho - to@isec.pt Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly MIPS – MARS IMPORTANTE : Começar sempre por: Criar um novo programa Guardar o programa - isto é mesmo importante, no caso de erro perde-se o trabalho todo! António Godinho - to@isec.pt 26/01/2016 6 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly - Registos • Todos os exemplos começam pelo “Hello World” • Exemplo 1 - execução e execução passo a passo, para a frente e para trás. António Godinho - to@isec.pt Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Instruções • Quase todos os processadores organizam as suas funções em 3 tipos de funções: • Instruções de lógica aritmética • add, addi, sub, mul, etc.• Instruções de manipulação de dados na memória• lw, sw• Instruções de desvio de fluxo• Instruções de desvio condicional• beq, bnq• Instruções de desvio incondicional• j, jal, jr António Godinho - to@isec.pt 26/01/2016 7 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Instruções • Todas as instruções têm 32 bits de comprimento• Existem 3 formatos de instruções • Formato R – instruções aritméticas e lógicas• Formato I – Load, Store a Condicional• Formato J – Jumps op rs rt rd shamt funct op rs rt 16-bit immediate op 26-bit immediate António Godinho - to@isec.pt Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly MIPS – Machine Language (com o tipo de funções) António Godinho - to@isec.pt 26/01/2016 8 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI MIPS - System Calls e I/O • Output: • Carregar os dados a mostrar para o registo $a• lw $a0, numero• Carregar o valor do tipo de dados para $v0• li $v0, 1• Efetuar a chamada ao sistema• syscall António Godinho - to@isec.pt Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI MIPS - System Calls e I/O – versão simplificada Service códigodo $v0 Arguments Results print_int 1 $a0 = integer to be printed print_float 2 $f12 = float to be printed print_double 3 $f12 = double to be printed print_string 4 $a0 = address of string in memory read_int 5 integer returned in $v0 read_float 6 float returned in $v0 read_double 7 double returned in $v0 read_string 8 $a0 = memory address of string input buffer$a1 = length of string buffer (n) sbrk 9 $a0 = amount address in $v0 exit 10 António Godinho - to@isec.pt 26/01/2016 9 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI MIPS - System Calls e I/O • Existem cerca de 60 chamadas de sistema diferentes, ficheiros, placa de som, etc., etc… • Lista completa em : • http://courses.missouristate.edu/kenvollmar/mars/help/syscallhelp.html António Godinho - to@isec.pt Tecnologia e Arquitectura dos Computadores Curso técnico superior profissionalem RSI, DW, TPSI Memória • 2* m matriz de bits • Endereço• – ídentificador único de identificação(k-bit) • Operações básicas• LOAD• – Lê um valor da memória• STORE• – Escreve um valor para a memória António Godinho - to@isec.pt 26/01/2016 10 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – Memória • Como já foi referido, para lermos da memória um inteiro utilizamos o comando lw - load word • lw $a0, idade • Para guardar em memória utilizamos o inverso, sendo necessário um índice, ou 0 (zero), em múltiplos de 4: • sw $t0, 0($t4) • NOTA: este tópico será aprofundado quando trabalharmos com arraysAntónio Godinho - to@isec.pt Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – Memória • Podemos também utilizar: • Útil para lermos caracteres de um string • lb load byte – carrega endereço para o registo • sbstore byte – guarda byte no endereço referido pelo registo • Não iremos utilizar, utiliza apenas 16bits • lh load half-word from specified address • shstore half-word to specified address António Godinho - to@isec.pt 26/01/2016 11 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly - Registos • Exercício 2• Declarar um caracter com o nome myChar• Imprimir o caracter no monitor António Godinho - to@isec.pt Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly - Registos • Exercício 3• Declarar um inteiro com a vossa idade• Imprimir o inteiro no monitor António Godinho - to@isec.pt 26/01/2016 12 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly - LOAD • Carregar valores da memória para um registo• .word• li $t0, 5 • O MARS não suporta o mesmo tipo de operações para doubles e floats, mas elas existem. António Godinho - to@isec.pt Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – LOAD Immediate • Carregar valores da memória para um registo• .word• lw $a0, nome_word • .ascii• la $a0, nome_string • .double• ldc1 $f2, myDouble # NOTA: o registo para onde é carregado o double • .float• lwc1 $f1, nome_float # NOTA: o registo para onde é carregado o float António Godinho - to@isec.pt 26/01/2016 13 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – virgula flutuante (FP) • FP Load and Store # Load word in to coprocessor 1• lwc1 $f0, 4($t4) # $f0 = Mem[ $t4 + 4 ] # Load double in to coprocessor 1• ldc1 $f0, 0($t4) # $f0 = Mem[ $t4 + 0 ]; $f1 = Mem[ $t4 + 4 ] # Store word from coprocessor 1.• swc1 $f0, 4($t4) # $f0 = Mem[ $t4 + 4 ] # Store double from coprocessor 1.• sdc1 $f0, 0($t4) # Mem[ $t4 + 0 ] = $f0; Mem[ $t4 + 4 ] = $f1 António Godinho - to@isec.pt Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly - Registos • Exercício 4• Declarar um float com o nome PI e colocar o respetivo valor• Imprimir o float no monitor António Godinho - to@isec.pt 26/01/2016 14 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly - Registos • Exercício 5• Declarar um double com o nome myDouble com o valor 7.202• Imprimir o double no monitor António Godinho - to@isec.pt Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly - Registos • Exercício final output• O programa deverá enviar para o monitor uma mensagem do género: O meu nome é (Nome), tenho (IDADE) e sou de (LOCAL). Corro 100m em (TEMPO) segundos. • Entre parêntesis são as variáveis, a 1ª e 3ª são strings, a segunda inteiro e a 4ª é um float. António Godinho - to@isec.pt 26/01/2016 15 Operações aritméticasOperações aritméticas Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – Operações aritméticas • Adição• add $s1, $s2, $s3 # s1 = s2 + s3 • addi $t0, $t1, 10 # t0 = t1 + 10 António Godinho - to@isec.pt 26/01/2016 16 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – Operações aritméticas • Exercício 6• Declare dois inteiros, some os dois e imprima o resultado da soma António Godinho - to@isec.pt Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – Operações aritméticas • Subtração• sub $t0, $s0, $s1 # t0 = s0 - s1 • subi $t0, $t1, 10 # t0 = t1 – 10 • addi $t0, $t1, -10 # t0 = t1 – 10 António Godinho - to@isec.pt 26/01/2016 17 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – Operações aritméticas • Exercício 7• Declare dois inteiros, subtrair um ao outro e imprima o resultado António Godinho - to@isec.pt Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – Operações aritméticas • Multiplicação• mul $t0, $s0, $s1 # t0 = s0 * s1Multiplicação de números de 16 bits e permite overflow Resultado com 32 bits• mult $s0, $s1 # primeira instrução• mflo $t0 # segunda instrução • mflomove from lo, como quem diz, move $qqcoisa, $lo António Godinho - to@isec.pt 26/01/2016 18 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – Operações aritméticas • Exercício 8• Declare dois inteiros, multiplique um ao outro e imprima o resultado • Utilize a instrução mul António Godinho - to@isec.pt Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – Operações aritméticas • Exercício• Altere o ex8, de modo a utilizar a instrução mult António Godinho - to@isec.pt 26/01/2016 19 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – Operações aritméticas • Multiplicação• Este tópico é introduzido neste ponto como curiosidade A função sll - Shift left logical - Shift à esquerda • sll $a0, $a1, 2 # a0 <- a1 * 4 • Isto é • sll $a1, $a2, $a3 # a1 <- a2 * 2^a3 • Logo se precisar de andar em múltiplos de 2, este é o modo mais eficaz António Godinho - to@isec.pt Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – Operações aritméticas • Divisão• div $s0, $t0, $t1 # s0 = t0 / t1 Pseudo-instrução o que é efetuado na realidade é:• div $t0, $t1 # primeira instrução• mflo $s0 # segunda instrução António Godinho - to@isec.pt 26/01/2016 20 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – Operações aritméticas • Exercício 9• Declare dois inteiros, divida um ao outro e imprima o resultado • Utilize a instrução div com 3 operandos António Godinho - to@isec.pt Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – Operações aritméticas • A divisão com 2 operandos tem efectivamente outra vantagem • div $t0, $t1 # primeira instrução• mflo $s0 # em $lo fica o quociente• mfhi $s1 # em $hi fica o resto António Godinho - to@isec.pt 26/01/2016 21 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – Operações aritméticas • Altere o ex 9 obtendo o mesmo resultado, mas utilize a instrução div com 2 operandos, mostrando o resultado e o resto da divisão António Godinho - to@isec.pt User inputUser input 26/01/2016 22 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSIAssembly – User Input • Receber inteiro de um utilizador • li $v0, 5• syscall O inteiro é guardado no registo $v0, é necessário copiar o seu conteúdo para outro registo. • move $t0, $v0 # mover o valor de $v0 para $t0 António Godinho - to@isec.pt Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – User Input • Exercício 10• Desenvolva um programa que receba de um utilizador a sua idade, e que imprima o valor introduzido no ecrã. • A saída do programa deverá ser algo deste género: Introduza a idade : 39 A sua idade e' : 39-- program is finished running -- António Godinho - to@isec.pt 26/01/2016 23 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – User Input • Receber float de um utilizador • li $v0, 6• syscall O float é guardado no registo $f0, é necessário copiar o seu conteúdo para outro registo. António Godinho - to@isec.pt Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – User Input • Exercício 11• Desenvolva um programa que receba de um utilizador o valor de ߨ, e que imprima o valor introduzido no ecrã. • A saída do programa deverá ser algo deste género: Introduzir o valor de PI : 3.1415 O valor de PI e' : 3.1415 -- program is finished running -- António Godinho - to@isec.pt 26/01/2016 24 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – User Input • Receber double de um utilizador • li $v0, 7• syscall O float é guardado no registo $f0, é necessário copiar o seu conteúdo para outro registo. António Godinho - to@isec.pt Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – User Input • Exercício 12• Altere o exercício 11 de modo a utilizar um double em vez de um float António Godinho - to@isec.pt 26/01/2016 25 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – User Input • Receber uma string de um utilizador • # Criar espaço em memória para receber a string• userInput: .space 20 • # Receber a string do utilizador• li $v0, 8• la $a0, userInput• li $a1, 19• syscall António Godinho - to@isec.pt Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – User Input • Exercício 13• Desenvolva um programa que receba o nome de um utilizador. • A saída do programa deverá ser algo deste género: Introduza o seu nome : Antonio Godinho Ola Antonio Godinho -- program is finished running -- António Godinho - to@isec.pt 26/01/2016 26 floatsfloats Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI MIPS – CoProcessador 1 • Os Coprocessadores são unidades de processamento alternativo, com registos independentes do CPU. • O MIPS fornece até 4, no MARS temos apenas 2 disponíveis, 0 e 1. • # Co-processor 0: Processor and system control.• # Co-processor 1: MIPS-32 floating-point• # Co-processor 2: Reserved for special-purpose designs.• # Co-processor 3: MIPS-64 floating-point António Godinho - to@isec.pt 26/01/2016 27 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – virgula flutuante • Muitas instruções têm “c1” no seu nome, por exemplo, lwc1 • As instruções aritméticas não têm “c1” mas incluem uma propriedade que indica o tipo de dados. • Por exemplo, add.d, onde ".d" é o que completa. António Godinho - to@isec.pt Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – virgula flutuante • Tipos de dados Co-Processador1: • ".s" Single-Precision Floating Point (32 bits) • ".d" Double-Precision Floating Point (64 bits) • ".w" Integer (32 bits) António Godinho - to@isec.pt 26/01/2016 28 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – virgula flutuante • Operações aritméticas – instruções com o “.d” recebem de cada operando um par de registos • Exemplo: • add.d $f0, $f2, $f4 # {$f0,$f1} = { $f2, $f3 } + { $f4, $f5 } • add.d $f0, $f2, $f5 # ILEGAL em MIPS 32 António Godinho - to@isec.pt Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – virgula flutuante • Operações aritméticas – instruções com o “.d” recebem de cada operando um par de registos • Exemplo: • addi.s $f0, $f1, 2.3 # ILEGAL, não existem instruções immediate FP. • add.s $f0, $f1, $f2 # f0 contém o valor da soma António Godinho - to@isec.pt 26/01/2016 29 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – User Input • Exercício 14• Desenvolva um programa que receba dois floats de um utilizador, e efectue as quatro operações aritméticas e imprima os seus resultados. • A saída do programa deverá ter o resultado deste modo: Adicao : 48.801403 Subtracao : -42.5546 Multiplicacao : 142.67067Divisao : 0.06837865 -- program is finished running -- António Godinho - to@isec.pt Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – virgula flutuante (FP) • Move Instruções CoProc1 # Move to coprocessor 1• mtc1 $t0, $f0 # f0 = t0 Nota: o destino é o segundo registo # Move from coprocessor 1• mfc1 $t0, $f0 # f0 = t0 Nota: o destino é o primeiro registo António Godinho - to@isec.pt 26/01/2016 30 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – virgula flutuante (FP) • NOTA: • Nos registo genéricos temos words, no coProc1 temos os registos com virgula flutuante (floats e doubles). Logo é necessário converter os dados • cvt.s.w $f0, $f0 # Conversão de Word para float de simples precisão • cvt.s.d $f0, $f0 # Conversão de double para float • Ex: • mtc1 $s0, $f0 #move a word para coProc1 • cvt.s.w $f0, $f0 # converte a word em float António Godinho - to@isec.pt Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – User Input • Exercício 15• Altere o exercício 14, movendo os resultados para os registo genéricos e mostrando-os ao utilizador. • A saída do programa deverá ter o resultado deste modo: Adicao : 48 Subtracao : -42 Multiplicacao : 142 Divisao : 0 -- program is finished running -- António Godinho - to@isec.pt 26/01/2016 31 Instruções de desvio incondicionalInstruções de desvio incondicional Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly - Instruções de desvio incondicional • “Unconditional Branch Instructions” • j Label # PC = Label (Permite saltos para qualquer sitio do código)• b Label # PC = Label (Permite pequenos saltos no código) • jal label # Jump and Link (Permite um salto para label e o endereço da próxima instrução é guardado em $ra)• jr $ra # PC = $ra (Permite retornar à instrução com o endereço em $ra) • Úteis para construir ciclos e implementação de estruturas de controlo António Godinho - to@isec.pt 26/01/2016 32 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly - Instruções de desvio incondicional • Instruções de decisão• Permite alterar a próxima instrução a ser executada, sem efetuar comparações • Instruções em MIPS:• J LABEL add $t0, $zero, $zeroj FORJOYaddi $t0, $t0, 1addi $t0, $t0, 2 FORJOY:addi $t0, $t0, 4addi $t0, $t0, 8 António Godinho - to@isec.pt Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly- Instruções de desvio incondicional • Instruções de decisão• Permite alterar a próxima instrução a ser executada, sem efetuar comparações • Instruções em MIPS:• J LABEL add $t0, $zero, $zeroj FORJOYaddi $t0, $t0, 1CONTINUA:addi $t0, $t0, 2j ENDFORJOY: addi $t0, $t0, 4addi $t0, $t0, 8j CONTINUAEND: António Godinho - to@isec.pt 1 2 3 26/01/2016 33 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly - Instruções de desvio incondicional• Exercício 16 - Desenvolva um programa que efetue 3 saltos, mostrando ao utilizador a seguinte ordem: 1. Mostra uma string 2. Salto 3. uma operação aritmética entre números floats 4. Salto 5. Mostra uma string 6. Salto para o fim do programa• NOTA: A estrutura do programa deve ter a seguinte ordem: main, end, jump2, jump1 • A saída do programa deverá ter o resultado deste modo: String imprimida no main Resultado da multiplicação : 48.801403 Teste salto! -- program is finished running -- António Godinho - to@isec.pt Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly - Instruções de desvio incondicional • Procedimentos • jal NOME_LABEL – jump-and-link - salta para a label NOME e guarda o endereço da localização anterior em $ra • jr $ra – jump register – retorna a execução ao endereço de $ra • NOTA: Estas são as instruções em que se traduz um procedimento • Voltaremos a este tema mais tarde!!! António Godinho - to@isec.pt 26/01/2016 34 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly - Instruções de desvio incondicional - procedimentos main: li $t0, 1 jal procedure # call procedure, o endereço de retorna é guardado em $ra li $v0, 10 syscall procedure: li $t0, 3 jr $ra # returna para $ra António Godinho - to@isec.pt Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly - Instruções de desvio incondicional • Exercício 17• Desenvolva um programa que mostre um inteiro no main e que contenha um procedimento com o nome displayMessage. O procedimento serve para mostrar uma string ao utilizador. NOTA: A estrutura do programa deve ter a seguinte ordem: main, displayMessage, mostrar inteiro e end • A saída do programa deverá ter o resultado deste modo: Procedimento...MIPS procedure.. 5 -- program is finished running -- António Godinho - to@isec.pt 26/01/2016 35 Instruções de desvio condicionalInstruções de desvio condicional Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly - Instruções de desvio condicional • Instruções de decisão• Permite alterar a próxima instrução a ser executada • Instruções em MIPS:• bne $t0, $t1, LABEL # Salta para LABEL se não for igual # $t0 != $t1 vai para LABEL• beq $t0, $t1, LABEL # Salta para LABEL se for igual António Godinho - to@isec.pt 26/01/2016 36 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly - Instruções de desvio condicional • Instruções em MIPS:• blt Rs1, Rs2, Label #goto Label se Rs1 < Rs2 • bgt Rs1, Rs2, Label #goto Label se Rs1 > Rs2 • ble Rs1, Rs2, Label #goto Label se Rs1 <= Rs2 • bge Rs1, Rs2, Label #goto Label se Rs1 >= Rs2 •• b Label #unconditional goto Label (iremos ver no próximo slide em pormenor) António Godinho - to@isec.pt Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly - Instruções de desvio condicional • J L1 – quando executado faz com que o programa seja desviado para L1 • Exemplo – Compilando um comando if-then-elseif ( i == j) f = g + h; else f = g – h;• Soluçãobne $s3,$s4,Else # vai para Else se i != jadd $s0,$s1,$s2 # f = g + h, se i != jj Exit # vai para ExitElse: sub $s0,$s1,$s2 # f = g – h, se i = jExit: António Godinho - to@isec.pt 26/01/2016 37 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly - Instruções de desvio condicional António Godinho - to@isec.pt if ( i == j ) h = i + j; # $s0 == i, $s1 == j, $s3 == h beq $s0, $s1, doif # if-test b skip # skip if doif: # if-body add $s3, $s0, $s1 skip: .... Qual a vantagem da segunda versão?Qual a vantagem da segunda versão? # $s0 == i, $s1 == j, $s3 == h bne $s0, $s1, skip # test negation of C-test add $s3, $s0, $s1 # if-body skip: .... Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly - Instruções de desvio condicional António Godinho - to@isec.pt if ( i < j ) i++; else j++; # $s3 == i, $s4 == j bgt $s4, $s3, doelse addi $s3, $s3, 1 # if-body b endelse # skip else doelse: addi $s4, $s4, 1 # else-body endelse: 26/01/2016 38 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – User Input • Exercício 18• “Converta” o excerto de código em C para Assemply MIPS:int i = 10;int j = 20; if ( i < j )i++;else j++; printf("O numero i e' %d\n", i);printf("O numero j e' %d\n", j); António Godinho - to@isec.pt Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly - Instruções de desvio condicional • Exercício 19• Desenvolva um programa que carregue dois inteiros, que os compare e que indique se os dois números são iguais ou não. • A saída do programa deverá ter o resultado deste modo: Os numeros sao diferentes! -- program is finished running -- António Godinho - to@isec.pt 26/01/2016 39 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly - Instruções de desvio condicional • Exercício 20• Desenvolva um programa que carregue dois inteiros, que os compare os dois e que indique se os números são iguais ou qual dos dois é o maior. • A saída do programa deverá ter o resultado deste modo: O primeiro numero e menor! -- program is finished running -- António Godinho - to@isec.pt Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly - Instruções de desvio condicional António Godinho - to@isec.pt int N = 100; int i = 0; while ( N > 0 ) { N = N / 2; // N = N >> 1; i++; } # $s0 == N, $t0 == i li $s0, 100 # N = 100 li $t0, 0 # i = 0 loop: ble $s0, $zero, done # loop teste sra $s0, $s0, 1 # calculate N / 2 addi $t0, $t0, 1 # i++ b loop # restart loop done: 26/01/2016 40 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly - Instruções de desvio incondicional António Godinho - to@isec.pt int N = 100; int i = 0; while ( N > 0 ) { N = N / 2; // N = N >> 1; i++; } # $s0 == N, $t0 == i li $s0, 100 # N = 100 li $t0, 0 # i = 0 ble $s0, $zero, done # loop teste loop: sra $s0, $s0, 1 # calculate N / 2 addi $t0, $t0, 1 # i++ bgt $s0, $zero, loop # Verifica se continua done: Qual a vantagem da segunda versão?Qual a vantagem da segunda versão? Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – User Input • Exercício 21• “Converta” o excerto de código em C para Assemply MIPS: int N = 100;int i = 0;while ( i < N ) {printf("i : %d\n", i);i += 3;} António Godinho - to@isec.pt 26/01/2016 41 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly - Instruções de desvio incondicional António Godinho - to@isec.pt int Sum = 0, Limit = 100; for (int i = 1; i <= Limit; ++i) { Sum = Sum + i*i; } # $s0 == Sum, $s1 == Limit, $t0 == i li $t1, 0 # Sum = 0 li $s1, 100 # Limit = 0 li $t0, 1 # i = 1 loop: bgt $t0, $s1,done # loop test mul $t2, $t0, $t0 # calculate i^2 add $t1, $t1, $t2 # Sum = Sum + i^2 addi $t0, $t0, 1 # ++i b loop # restart loop done: Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – User Input • Exercício 22• “Converta” o excerto de código em C para Assemply MIPS: int i;for( i=0;i<100;i++ ) {printf("i : %d", i);} António Godinho - to@isec.pt 26/01/2016 42 Conditional floatConditional float Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – virgula flutuante (FP) • Comparações # COND: eq (= equal) , lt ( < less than ) , le (<= less or equal) # FMT: s, d• c.eq.s $f2, $f4 #$f2 == $f4 • c.lt.d $f0, $f2 # CC = $f0 < $f2• bc1t TARG # Branch if $f0 < $f2 • c.ge.d $f0, $f2 # CC = $f0 >= $f2• bc1t TARG2 # Branch if $f0 < $f2 António Godinho - to@isec.pt 26/01/2016 43 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – User Input • Exercício 23• Utilize como base a resolução do exercício 14, efetuando as 4 operações aritméticas com dois floats, o primeiro dos quais negativos. • A cada operação compare o valor obtido com o segundo número, verificando se é maior, igual ou menor. • A saída do programa deverá ter o resultado deste modo:Adicao : 42.5546 O resultado é maior!Subtracao : -48.801403 O resultado é menor!Multiplicacao : -142.67067 O resultado é menor!Divisao : -0.06837865 O resultado é menor! -- program is finished running -- António Godinho - to@isec.pt ArraysArrays 26/01/2016 44 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – Declaração de Arrays e alocação de memória O primeiro passo é alocar a memória necessária: Reserva um bloco contiguo do tamanho indicado O label é um nome simbólico para o endereço de inicio do array Um array deste tamanho pode ser utilizado para: • array de 1000 valores de char (ASCII codes) • array de 250 valores de inteiros • array de 125 valores de double António Godinho - to@isec.pt .datalista: .space 1000 # reserve um bloco de 1000 bytes 1004000 1004001 1004002 1004003 1004004 1004005 1004006 1004007 1004008 1004009 1004010 … 1004999 Alocação para lista Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – Declaração de Arrays e alocação de memória É possível também inicial um array do seguinte modo: ArrChars: .byte 'a', 'e', 'i', 'o', 'u' ArrInts: .word 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 Array??: .asciiz "aeiou“ Iniciar com valores: meuArray: .word 31:10 # Inicia 10 inteiros com valor 31 arrchars: .byte 'a':200 # Inicia 200 chars com o caracter ‘a’ António Godinho - to@isec.pt 26/01/2016 45 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – Declaração de Arrays e alocação de memória É possível também inicial um array do seguinte modo: vowels é um bloco contiguo de 5 bytes. Cada valor é guardado numbyte.• Endereço de vowels[k] == vowels + k pow2 é um bloco contiguo de 32 bytes. Cada valor guardado ocupa um word (4 bytes)• Endereço de pow2[k] == pow2 + 4 * k António Godinho - to@isec.pt .datavowels : .byte 'a', 'e', 'i', 'o', 'u‘pow2 : .word 1, 2, 4, 8, 16, 32, 64, 128 #Exemplo de array de inteiros: .data lista: .space 1000 tam: .word 250 # tamanho do array de integers .text main: lw $s0, tam # $s0 = array tamanho la $s1, lista # $s1 = endereço do array li $t0, 0 # $t0 = # endereço do elemento inicial initlp: beq $t0, $s0, end sw $s1, 0($s1) # lista[i] = addr de lista[i] addi $s1, $s1, 4 # próximo element da lista addi $t0, $t0, 1 # count elem just init'd b initlp end: António Godinho - to@isec.ptPorquê 4? Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – Declaração de Arrays e alocação de memória 26/01/2016 46 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – Declaração de Arrays e alocação de memória • Uma variável que guarda um endereço é chamada um ponteiro • $s1 é o ponteiro para a lista • Podemos mover esse ponteiro para outra posição, adicionando o valor apropriado António Godinho - to@isec.pt 1004008 1004012 1004016 1004020 1004024 initlp: beq $t0, $s0, endsw $s1, ($s1)addi $s1, $s1, 4addi $t0, $t0, 1b initlpend: 1004008 1004012 1004016 1004020 1004024 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – Declaração de Arrays e alocação de memória #Alternativa: NOTA: ENDEREÇO = END INICIAL + (TAM – 1) * 4 .data lista: .space 1000 tam: .word 250 # tamanho do array de integers .text main: lw $s0, tam # $s0 = array tamanho la $s1, lista # $s1 = endereço do array li $t0, 0 # $t0 = # endereço do elemento inicial addi $s0, $s0, -1 sll $s0, $s0, 2 add $s0, $s0, $s1 initlp: bgt $s1, $s0, end sw $s1, ($s1) addi $s1, $s1, 4 b initlp end: António Godinho - to@isec.pt 26/01/2016 47 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – Declaração de Arrays e alocação de memória É possível também inicial um array do seguinte modo: • O que acontece quando se acede a um índice inválido?• vowels[5]= ?? Conteúdo do endereço 1005 • Este índice não existe como endereço lógico do array, mas existe fisicamente em memória. • O que quer dizer que o que lá está guardado é imprevisível. Nunca será o que nós queremos!!! António Godinho - to@isec.pt .datavowels : .byte 'a', 'e', 'i', 'o', 'u‘pow2 : .word 1, 2, 4, 8, 16, 32, 64, 128 a 1 2 … 8 1000 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – Declaração de Arrays e alocação de memória Então: • Leva ao seguinte alocação : A seguinte declaração no entanto: • Leva ao seguinte alocação : • O byte extra é alocado e iniciado com 0x00 • Permite efetuar ciclos sem conhecer o tamanho da string António Godinho - to@isec.pt .datavowels : .byte 'a', 'e', 'i', 'o', 'u' 1000 61 65 69 6F 75 .datavowels : .asciiz “aeiou” 61 65 69 6F 75 00 26/01/2016 48 Arrays - StringsArrays - Strings Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – Declaração de Arrays e alocação de memória Exemplo: procurar por um caracter numa string .data char: .byte 'u' vowels: .asciiz "aeiou" .text main: lb $t0, char # character que se vai procurar li $t1, 0 # ainda não foi encontrado la $s0, vowels # ponteiro para vowels[0] lb $s1, ($s0) # recebe valor de vowels[0] António Godinho - to@isec.pt 26/01/2016 49 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – Declaração de Arrays e alocação de memória srchlp: beq $s1, $zero, srchdn # verificar pelo terminator seq $t1, $s1, $t0 # compara caracteres bgt $t1, $zero, srchdn # char encontrado addi $s0, $s0, 1 # não, próximo elemento lb $s1, ($s0) # lê próximo elemento b srchlp srchdn: li $v0, 10 syscall António Godinho - to@isec.pt Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – Declaração de Arrays e alocação de memória 75 61 65 69 6F 75 00 António Godinho - to@isec.pt lb $t0, char # character que se vai procurarli $t1, 0 # ainda não foi encontradola $s0, vowels # ponteiro para vowels[0]lb $s1, ($s0) # recebe valor de vowels[0] charchar vowelsvowels $t0 00 00 00 75 $t1 00 00 00 00 $s0 $s1 00 00 00 61 26/01/2016 50 Tecnologia e Arquitectura dos ComputadoresCurso técnico superior profissional em RSI, DW, TPSI Assembly – Declaração de Arrays e alocação de memória srchlp: beq $s1, $zero, srchdn # terninador é 0x00 seq $t1, $s1, $t0 # $t1 = 1 se $s1 == $t0 bgt $t1, $zero, srchdn # se encontrado sai do ciclo addi $s0, $s0, 1 # próximo element de vowels lb $s1, ($s0) # lê próximo element de vowels b srchlp srchdn: António Godinho - to@isec.pt Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – User Input • Exercício 24 • Receba uma string do utilizador com um máximo de 150 caracteres. • Imprima os caracteres da string, um a um, com mudança de linha após cada caracter. • A saída do programa deverá ter o resultado deste modo:…..fhd -- program is finished running -- António Godinho - to@isec.pt 26/01/2016 51 Arrays - inteirosArrays - inteiros Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – Declaração de Arrays e alocação de memória # Imprimir Array de inteiros .data # tamanho do array de integers list: .word 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 size: .word 10 . . . lw $t3, size la $t1, list # get array address li $t2, 0 # set loop counter António Godinho - to@isec.pt 26/01/2016 52 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – Declaração de Arrays e alocação de memória prnlp: beq $t2, $t3, prndn # check for array end lw $a0, ($t1) # print list element li $v0, 1 syscall la $a0, NL # print a newline li $v0, 4 syscall addi $t2, $t2, 1 # advance loop counter addi $t1, $t1, 4 # advance array pointer b prnlp # repeat the loop prndn: António Godinho - to@isec.pt Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – Declaração de Arrays e alocação de memória António Godinho - to@isec.pt …addi $t2, $t2, 1 # avança o contador do cicloaddi $t1, $t1, 4 # avança o ponteiro do array… 1000 …lw $a0, ($t1) # carrega para $a0 o valor actual do arrayli $v0, 1 # imprime inteiroSyscall… 26/01/2016 53 Tecnologia e Arquitectura dos Computadores Curso técnico superior profissional em RSI, DW, TPSI Assembly – User Input • Exercício 25• Declare um array de inteiros com 10 valores diferentes.• Imprima os inteiros do array, um a um, com mudança de linha após cada caracter. • A saída do programa deverá ter o resultado deste modo:…..7111317192329-- program is finished running -- António Godinho - to@isec.pt
Compartilhar