Baixe o app para aproveitar ainda mais
Prévia do material em texto
MIPS Arquitetura e Linguagem Assembly Tipos de Dados e Literais • Tipos de dados: – Todas as instruções são de 32 bits – Byte, halfword (2 bytes), word (4 bytes) – Um caractere ocupa 1 byte – Um inteiro ocupa 1 word (4 bytes) • Números: – Digitados naturalmente, ex.: 4 – Caracteres são digitados com aspas simples, ex.:‘b’ – Strings são digitados com aspas duplas, ex.: ”Umstring” Registradores • 32 registradores de propósito geralll • Precedidos por $ nas instruções assembly • Dois formatos para endereçamento: – Numérico: $0 até $31 – Nomes alternativos, ex.: $t1, $sp Registradores Nome Número Uso $zero 0 constante 0 $at 1 reservado para o montador $v0 2 avaliação de expressão e resultados de uma função $v1 3 avaliação de expressão e resultados de uma função $a0 4 argumento 1 $a1 5 argumento 2 $a2 6 argumento 3 $a3 7 argumento 4 ! Registradores Nome Número Uso $t0 8 temporário (não preservado pela chamada) $t1 9 temporário (não preservado pela chamada) $t2 10 temporário (não preservado pela chamada) $t3 11 temporário (não preservado pela chamada) $t4 12 temporário (não preservado pela chamada) $t5 13 temporário (não preservado pela chamada) $t6 14 temporário (não preservado pela chamada) $t7 15 temporário (não preservado pela chamada) ! Registradores Nome Número Uso $s0 16 temporário salvo (preservado pela chamada) $s1 17 temporário salvo (preservado pela chamada) $s2 18 temporário salvo (preservado pela chamada) $s3 19 temporário salvo (preservado pela chamada) $s4 20 temporário salvo (preservado pela chamada) $s5 21 temporário salvo (preservado pela chamada) $s6 22 temporário salvo (preservado pela chamada) $s7 23 temporário salvo (preservado pela chamada) ! Registradores Nome Número Uso $t8 24 temporário (não preservado pela chamada) $t9 25 temporário (não preservado pela chamada) $k0 26 reservado para o kernel do sistema operacional $k1 27 reservado para o kernel do sistema operacional $gp 28 ponteiro para área global $sp 29 stack pointer $fp 30 frame pointer $ra 31 endereço de retorno (usado por chamada de função)! ! Estrutura do Programa § Arquivo de texto plano com declarações de dados, código do programa § Seção de declaração dos dados seguida pela seção de código do programa Estrutura do Programa • Declarações de dados – Colocadas na seção do programa identificada com a diretiva .data – Declara os nomes de variáveis usadas no programa • Armazenadas na memória principal (RAM) Estrutura do Programa • Código – Colocado na seção do programa identificada com a diretirva .text – Contém o código do programa (instruções) – Ponto de inicio, ex.: rótulo main – Ponto de encerramento: exit (chamada de sistema) Comentário • Inicia com o caractere # • Termina no final da linha Modelo de programa # Comentario com o nome do programa e descrição da funcao # Template.asm # Estrutura basica de um programa em linguagem assembly do MIPS .data # as declarações de variaveis seguem essa linha # ... .text # as instrucoes seguem essa linha main: # indica o inicio do codigo (primeira instrucao # a executar) # ... # Fim do programa # deixe uma linha em branco por causa do simulador Declarações de dados • 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: rótulos sempre são seguidos de dois pontos ( : ) Declarações de dados • Exemplo: var1: .word 3 array1: .byte 'a','b’ array2: .space 40 – var1: variável inteira inicializada com valor 3 – array1: vetor de caracteres inicializado com ’a’ e ‘b’ – array2: vetor de 40 caracteres (bytes) não inicializado Instruções de acesso à memória • Apenas as instruções de load e store acessam os dados na memória – Todas as outras instruções usam registradores como operando. • Load word lw registrador, endereco • Carrega a word (4 bytes) do endereço de memória no registrador. Instruções de acesso à memória • Store word sw registrador, endereco • Armazena a word (4 bytes) do registrador no endereço de memória. • Load immediate li registrador, valor • Carrega o valor no registrador. Exemplo1.asm Exemplo1.asm 1. Início da seção de declaração de dados 2. Cria a variável var1 do tipo inteiro, com o valor 23 4. Início da seção de código 5. Cria rótulo main para marcar o início do programa 6. Carrega o conteúdo de var1 no registrador $t0 7. Carrega o valor 5 no registrador $t1 8. Armazena o valor do registrador $t1 na variável var1 Endereçamento indireto e indexado • Load address la registrador, variável • Carrega o endereço da variável no registrador • Load word (indireto) lw registrador1, (registrador2) • Carrega a word que está no endereço armazenado no registrador2, para o registrador1 • Store word (indireto) sw registrador1, (registrador2) • Armazena a word no registrador1 para o endereço armazenado no registrador2 Endereçamento indireto e indexado • Endereçamento indexado é o mesmo que endereçamento base-deslocamento • Load word (indexado) lw registrador1, offset(registrador2) • carrega a word que está no endereço (registrador2 + offset) no registrador1 • obs: o offset pode ser negativo • Store word (indexado) sw registrador1, offset(registrador2) • Armazena a word no registrador1 no endereço dado por (registrador2+offset) • obs: o offset pode ser negativo Endereçamento indireto e indexado • Observação: o endereçamento indexado é especialmente útil para: – Vetores: acesso aos elementos como um offset (deslocamento) a partir do endereço inicial do vetor. Exemplo2.asm Instruções aritméticas • Add add registrador0, registrador1, registrador2 • salva o resultado da soma do registrador1 com o registrador2 no registrador0 • obs: soma com sinal • Add immediate addi registrador0, registrador1, constante • salva o resultado da soma do registrador1 com o constante no registrador0 • obs: soma com sinal Instruções aritméticas • Sub sub registrador0, registrador1, registrador2 • salva o resultado da subtração do registrador1 com o registrador2 no registrador0 • obs: subtração com sinal Instruções lógicas • And and registrador0, registrador1, registrador2 • guarda o resultado da operação lógica AND entre registrador1 e registrador2 no registrador0 • And immediate andi registrador0, registrador1, constante • guarda o resultado da operação lógica AND entre registrador1 e constante no registrador0 Instruções lógicas • Or or registrador0, registrador1, registrador2 • guarda o resultado da operação lógica OR entre registrador1 e registrador2 no registrador0 • Or immediate ori registrador0, registrador1, constante • guarda o resultado da operação lógica OR entre registrador1 e constante no registrador0 Instruções de controle de fluxo • Jump (desvio incondicional) • Branches (desvio condicional) Instruções de controlede fluxo • Jump j destino • Desvia para o destino (rótulo) Instruções de controle de fluxo • Branch equal beq registrador0, registrador1, destino • desvia para o destino, se: registrador0 = registrador1 • Branch less than blt registrador0, registrador1, destino • desvia para o destino, se: registrador0 < registrador1 • Branch less than or equal to ble registrador0, registrador1, destino • desvia para o destino, se: registrador0 <= registrador1 Instruções de controle de fluxo • Branch greater than bgt registrador0, registrador1, destino • desvia para o destino, se: registrador0 > registrador • Branch greater than or equal to bge registrador0, registrador1, destino • desvia para o destino, se: registrador0 >= registrador1 • Branch not equal bne registrador0, registrador1, destino • desvia para o destino, se: registrador0 != registrador1
Compartilhar