Computadores de Programação (MAB353) Aula 8: 04 de maio de 2010
1 Formatos de instruções MIPS 2 Endereçamento de operandos imediatos de 32 bits Endereçamento em desvios Modos de endereçamento do MIPS 3 4
Formatos de instruções MIPS As instruções são armazenadas no computador como sequências de números binários (por isso programas são disponibilizados como arquivos binários) os nomes dos registradores são convertidos nos números correspondentes cada instrução é mapeada para um código numérico específico os endereços de memória e constantes já são valores numéricos A versão do programa em mnemônicos é chamada programa em linguagem de montagem e a versão numérica do programa é chamada programa em linguagem de máquina
Mapeamento dos registradores Formatos de instruções MIPS Name Register number Usage Preserved call? $zero 0 The constant value 0 n.a. $v0 $v1 2 3 Values for results and express ion evaluation no $a0 $a3 4 7 Arguments no $t0 $t7 8 15 Temporaries no $s0 $s7 16 23 Saved yes $t8 $t9 24 25 More temporaries no $gp 28 Global pointer yes $sp 29 Stack pointer yes $fp 30 Frame pointer yes $ra 31 Return address yes FIGURE 2.14 MIPS register conventions. Register 1, called $at, is reserved for the assemb Section 2.12), and registers 26 27, called $k0 $k1, are reserved for the operating system. This infor is also found in Column Prof. 2 of Silvana the MIPS Rossetto Reference Traduzindo Data Card instruções at the MIPS front em instruções of this book. de máquina Copyright
Formato das instruções Formatos de instruções MIPS O layout de uma instrução é chamado formato da instrução e é composto de vários campos cujos valores são mapeados para números binários Todas as instruções MIPS possuem 32 bits Como as instruções requerem parâmetros diferentes, o MIPS define diferentes formatos de instruções: R-format (R): formato usado pelas instruções aritméticas I-format (I): formato usado pelas instruções de transferência de dados ou com valores imediatos J-format (J): formato usado pelas instruções de desvio
Formato das instruções Formatos de instruções MIPS Name Fields Field size 6 bits 5 bits 5 bits 5 bits 5 bits 6 bits A R-format op rs rt rd shamt funct A I-format op rs rt address/ immediate T J-format op target address J FIGURE 2.20 MIPS instr uction formats. Copyright 2009 Elsevier, Inc. All ri
Formato R (registrador) Formatos de instruções MIPS Campos do formato R op: código da operação básica rs: número do registrador do primeiro operando rt: número do registrador do segundo operando rd: número do registrador de destino (resultado da operação) shamt: quantidade de shift (deslocamento) funct: código da função, seleciona uma variante da operação no campo op
Formatos de instruções MIPS Exemplo de tradução da instrução add no formato R
Mapeamento das instruções de shift Formatos de instruções MIPS As instruções de shift também são mapeadas no formato R Elas fazem uso do campo shamt (shift amount) O campo rd contém o registrador de destino, o campo rt contém o registrador operando, e o campo shamt contém o valor do deslocamento O campo rs não é usado e então recebe sempre valor 0
Formatos de instruções MIPS Exemplo de tradução da instrução sll no formato R
Formato I (imediato) Formatos de instruções MIPS Campos do formato I op: código da operação básica rs: número do registrador do primeiro operando rt: número do registrador do segundo operando constante/endereço:
Formatos de instruções MIPS Exemplo de tradução da instrução lw no formato I Figura: Obs.: O campo rs recebe 19 ($s3 e o campo rt recebe 8 ($t0).
Formato J (jump) Formatos de instruções MIPS Campos do formato J op: código da operação endereço: endereço de desvio
Endereçamento de operandos imediatos de 32 bits Endereçamento em desvios Modos de endereçamento do MIPS Endereçamento de operandos imediatos de 32 bits Operandos imediatos de 32 bits A instrução lui (load upper immediate) foi acrescentada pelo MIPS para permitir constantes que requerem mais de 16 bits Ela permite setar os 16 bits mais altos de uma constante em um registrador, a instrução seguinte deve especificar os 16 bits mais baixos da constante A instrução lui transfere os 16 bits imediato para os 16 bits mais a esquerda do registrador, preenchendo os 16 bits mais a direita com zeros Ex., lui $t0, 255
Instrução lui Sumário Endereçamento de operandos imediatos de 32 bits Endereçamento em desvios Modos de endereçamento do MIPS The machine language version of lui $t0, 255 # $t0 is register 8: 001111 00000 01000 0000 0000 1111 1111 Contents of register $t0 after executing lui $t0, 255: 0000 0000 1111 1111 0000 0000 0000 0000 FIGURE 2.17 The effe ct of the lui instruction. The instruction lui transfers the 16-bit immediate cons leftmost 16 bits of the register, filling the lower 16 bits with 0s. Copyright 2009 Elsevier, Inc. All rights reserved.
Exemplo de uso da instrução lui Endereçamento de operandos imediatos de 32 bits Endereçamento em desvios Modos de endereçamento do MIPS
Uso da instrução lui Endereçamento de operandos imediatos de 32 bits Endereçamento em desvios Modos de endereçamento do MIPS O compilador ou o montador deve quebrar constantes grandes em pedaços e remontá-los em um registrador No MIPS essa tarefa é do montador Ele usa um registrador temporário: $at (reservado para uso do montador)
Endereçamento em desvios Endereçamento de operandos imediatos de 32 bits Endereçamento em desvios Modos de endereçamento do MIPS Nos desvios incondicionais, o campo de endereço tem 26 bits (formato J) Nos desvios condicionais, o campo de endereço tem 16 bits (formato I) Para ampliar o espaço de endereçamento das instruções de desvio condicional, a idéia é usar um registrador base, cujo valor sempre deve ser adicionado ao endereço de desvio (novo endereço = Reg + endereço de desvio) Mas quem deve ser Reg?
Endereçamento em desvios Endereçamento de operandos imediatos de 32 bits Endereçamento em desvios Modos de endereçamento do MIPS Observar como os desvios condicionais são normalmente usados: Os desvios condicionais aparecem em loops e em sentenças if, então eles tendem a desviar a execução para uma instrução próxima Dado que o registrador PC tem o endereço da instrução corrente, podemos desviar + 2 15 palavras a partir da instrução corrente, usando o PC como registrador base do endereço de desvio
Endereçamento relativo ao PC Endereçamento de operandos imediatos de 32 bits Endereçamento em desvios Modos de endereçamento do MIPS Definição Regime de endereçamento no qual o endereço é a soma do valor do PC e a constante na instrução Como as instruções MIPS possuem 32 bits, o endereçamento relativo ao PC refere-se ao número de palavras até a próxima instrução (ao invés do número de bytes) Permite tratar o caso do desvio para as subrotinas (usando a instrução jal) (as subrotinas podem não estar próximas ao PC) (o espaço de endereçamento é então esticado de 4 vezes) O endereço relativo é sempre em relação ao endereço seguinte a instrução corrente: PC+4
Endereçamento de operandos imediatos de 32 bits Endereçamento em desvios Modos de endereçamento do MIPS Exemplo de endereçamento relativo ao PC Figura: A instrução Prof. j usa Silvana o endereço Rossetto cheio, Traduzindo 20000 instruções * 4, MIPS para em instruções ir para de Loop. máquina
Aumentando o espaço de endereçamento Endereçamento de operandos imediatos de 32 bits Endereçamento em desvios Modos de endereçamento do MIPS Se o endereço de desvio for distante, ultrapassando o endereçamento possível com 16 bits, o montador pode inserir um jump incondicional para atingir o alvo e inverter a condição
Endereçamento de operandos imediatos de 32 bits Endereçamento em desvios Modos de endereçamento do MIPS Sumário dos modos de endereçamento do MIPS As diferentes formas de endereçamento do MIPS são genericamente chamadas modos de endereçamento, e incluem: Endereçamento imediato: o operando é uma constante dentro da própria instrução Endereçamento por registrador: o operando é um registrador Endereçamento de base: o operando está em uma localização de memória cujo endereço é a soma de um registrador e uma constante presentes na instrução
Modos de endereçamento do MIPS Endereçamento de operandos imediatos de 32 bits Endereçamento em desvios Modos de endereçamento do MIPS
Endereçamento de operandos imediatos de 32 bits Endereçamento em desvios Modos de endereçamento do MIPS Sumário dos modos de endereçamento do MIPS Endereçamento relativo ao PC: o endereço de desvio é a soma do valor atual do PC e a constante na instrução (adiciona um endereço de memória de 16 bits deslocado à esquerda de 2 com o valor de PC) Endereçamento pseudo-direto: o endereço de desvio são os 26 bits da instrução, concatenados com os bits mais altos do PC (concatena um endereço de 26 bits deslocado à esquerda de 2 com os 4 bits mais altos do PC)
Modos de endereçamento do MIPS Endereçamento de operandos imediatos de 32 bits Endereçamento em desvios Modos de endereçamento do MIPS
Decodificando a linguagem de máquina Endereçamento de operandos imediatos de 32 bits Endereçamento em desvios Modos de endereçamento do MIPS Algumas vezes pode ser necessário engenharia reversa da linguagem de máquina (ex., para tratar um core dumped )
Decodificando a linguagem de máquina Endereçamento de operandos imediatos de 32 bits Endereçamento em desvios Modos de endereçamento do MIPS
A representação ASCII (Americam Standard Code for Information Interchange) é normalmente usada para representar caracteres O conjunto de instruções MIPS permite extrair um byte de uma palavra, então as operações para carregar e armazenar uma palavra (lw, sw) são suficientes para transferir bytes e palavras
Representação de caracteres ASCII
Intruções sobre bytes load byte (lb) e store byte (sb)..entretanto, como é comum operações sobre bytes (caracteres de um texto), o MIPS provê instruções para movimentação de bytes: lb (load byte): carrega um byte da memória, coloca o byte nos 8 bits mais a direita do registrador sb (store byte): armazena um byte na memória, pega os 8 bits mais a direita do registrador Exemplos lb $t0, 0($sp) (lê do ponteiro da pilha) sb $t0, 0($gp) (escreve no ponteiro da pilha)
Carga de bytes com ou sem sinal O tratamento de dados com ou sem sinal se aplica para operações aritméticas e também para a carga de dados na memória A função da carga sinalizada é copiar o sinal para preencher o restante do registrador (de modo a guardar a representação correta do valor no registrador) Cargas (transferências) não sinalizadas simplesmente acrescentam ZEROs
Carga de bytes com ou sem sinal Quando uma palavra de 32 bits é carregada para um registrador (de 32 bits), a carga sinalizada ou não-sinalizada tem o mesmo efeito Para a carga de bytes, o MIPS oferece duas alternativas de instruções: lb, lbu
Carga de bytes com ou sem sinal Carga com sinal (lb) lb: trata o byte como um número com sinal, e então estende o sinal para preencher o restante do registrador Carga sem sinal (lbu) lbu: usado com números não-sinalizados (usado normalmente para trabalhar com caracteres)
Representação de Strings Caracteres são normalmente concatenados em strings, há 3 maneiras de representar strings: 1 A primeira posição da string é reservada para indicar o tamanho da string 2 Uma variável que acompanha a string guarda o tamanho da string (como uma estrutura de dados) 3 A última posição da string é ocupada por um caractere especial, usado para marcar o final da string (C usa essa opção) ex., a string Cae é representada em C por 4 bytes (67,97,108,0)
Caracteres e strings em Java Java usa 16 bits para representar caracteres (codificação Unicode) e uma palavra adicional para guardar o tamanho da string (similar a vetores em Java) O MIPS oferece instruções especiais para carga e armazenamento de quantidades de 16 bits (halfwords) lh: carrega 16 bits de memória para os 16 bits mais a direita de um registrador, fazendo extensão do sinal lhu: trabalha com valores sem sinal sh: pega os 16 bits mais a direita do registrador e escreve na memória
Alinhamento da pilha O MIPS tenta manter a pilha alinhada com os endereços de palavras, para permitir que o programa use lw, sw para acessar a pilha Essa convenção significa que uma variável char de C alocada na pilha ocupa 4 bytes, mesmo que ela precise de apenas 1 Entretanto, uma variável string C irá empacotar 4 bytes (char) por palavra
1 Organização e projeto de computadores: a interface hardware/software, D. A. Patterson e J. L. Hennessy, Elsevier, 2005.