Buscar

MIPS-Assembly

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 53 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 53 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 53 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

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
• sbstore byte – guarda byte no endereço referido pelo registo
• Não iremos utilizar, utiliza apenas 16bits
• lh load half-word from specified address
• shstore 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
• mflomove 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

Outros materiais