Aula 22: Linguagem de Montagem e Tipos de Endereçamento Diego Passos Universidade Federal Fluminense Fundamentos de Arquiteturas de Computadores . Diego Passos (UFF) Linguagem de Montagem; Tipos de Endereçamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FAC . . . . . . . 1 / 32 . Revisão . Diego Passos (UFF) Linguagem de Montagem; Tipos de Endereçamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FAC . . . . . . . 2 / 32 . Nas Aulas Anteriores. . . Vimos como implementar um processador simplificado. ▶ ▶ 10 instruções. Caminho de dados e lógica de controle. Implementamos vários tipos de instruções. ▶ ▶ ▶ Instruções de desvio condicional e incondicional. Instruções lógicas e aritméticas. Instruções de transferência de memória. Também vimos como implementar um pipeline. . Diego Passos (UFF) Linguagem de Montagem; Tipos de Endereçamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FAC . . . . . . . 3 / 32 . Na Aula de Hoje Aprenderemos como programar nosso processador. ▶ ▶ Como escrever programas. Compostos por sequências das 10 instruções estudadas. Discutiremos o que é uma linguagem de montagem. ▶ E como ela simplifica a escrita dos programas. Finalmente, discutiremos os modos de endereçamento usados pelas instruções. . Diego Passos (UFF) Linguagem de Montagem; Tipos de Endereçamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FAC . . . . . . . 4 / 32 . Linguagem de Montagem . Diego Passos (UFF) Linguagem de Montagem; Tipos de Endereçamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FAC . . . . . . . 5 / 32 . Motivação Instruções são armazenadas em memória como sequências de bits. ▶ Subdivididos em campos: OpCode, operandos, . . . Em aulas anteriores, vimos o formato de cada uma das instruções do processador estudado na disciplina. Exemplo (instrução add): 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 Opcode: 000000(2) = 0(10) Operando 1: 10001(2)=17(10) Operando 2: 10010(2)=18(10) Resultado: 01000(2)=8(10) Significado: Operação Lógica ou Aritmética Significado: Primeiro Operando está no Reg. 17 Significado: Segundo Operando está no Reg. 18 Significado: Armazenar Resultado no Reg. 8 Campo não Utilizado Nesta Instrução (deve sempre ser 0) Função: 100000(2)=32(10) Significado: Operação de Soma . Diego Passos (UFF) Linguagem de Montagem; Tipos de Endereçamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FAC . . . . . . . 6 / 32 . Motivação (II) Se tivéssemos um processador como o estudado nas últimas aulas, poderíamos programá-lo. ▶ ▶ Escrever sequências de instruções na memória. Já em formato binário. Tarefa não-trivial por dois motivos: ▶ ▶ Dificuldade em representar algoritmos complexos na forma de instruções básicas. Pouca praticidade na representação das instruções na memória. ⋆ ⋆ Decorar Opcodes, números de função, IDs de registradores, . . . Manipular bits. Nesta aula, atacaremos o segundo problema. . Diego Passos (UFF) Linguagem de Montagem; Tipos de Endereçamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FAC . . . . . . . 7 / 32 . Simplificando a Programação dos Computadores Esta mesma dificuldade de programação existia nos primeiros computadores eletrônicos. ▶ ▶ Era necessário conhecer intimamente o hardware. E manipular diretamente as instruções que compunham o programa. O ideal é que pudéssemos automatizar, de alguma forma, o processo de programação. ▶ Ou ao menos parte dele. . Diego Passos (UFF) Linguagem de Montagem; Tipos de Endereçamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FAC . . . . . . . 8 / 32 . Simplificando a Programação dos Computadores (II) Mais especificamente, seria interessante se: ▶ ▶ ▶ Pudéssemos pensar nas instruções em um nível mais alto de abstração. Esquecer os detalhes dos bits que devem ser colocados em posições específicas da memória. Pensar apenas em termos como: ⋆ ⋆ ▶ Somar registradores 2 e 3, e colocar resultado no registrador 4. Saltar para certo endereço se os registradores 0 e 5 forem iguais. Algum processo automático traduziria esta abstração para as sequências de bits corretas. A solução encontrada foi a criação das chamadas Linguagens de Montagem. . Diego Passos (UFF) Linguagem de Montagem; Tipos de Endereçamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FAC . . . . . . . 9 / 32 . Linguagem de Montagem ; Carregar um ponteiro com endereço base dos operandos. addi $0, $0, 100 ; Ler valores dos operandos ; Durante a execução, $1 acumula o quociente, $2 guarda o dividendo, $3 guarda o divisor, $4 é usado para comparações, $5 é usado como 0 para referência. lw $2, 0($0) lw $3, 4($0) TESTE: ; Teste: dividendo é menor que divisor? slt $4, $2, $3 beq $4, $5, SUBTRACAO Linguagem de programação. Programas descritos como sequências de instruções do processador. Instruções descritas por strings. ▶ ; Fim do algoritmo. Vamos salvar o quociente e o resto. sw $1, 8($0) sw $2, 12($0) FIM: j FIM ; loop infinito no final do programa SUBTRACAO: ; Aqui, subtraímos o dividendo do divisor e ; voltamos para o teste. sub $2, $2, $3 addi $1, $1, 1 j TESTE Nome, argumentos. Pode haver ainda outros elementos. ▶ Labels, constantes, IDs de registradores, comentários, . . . . Diego Passos (UFF) Linguagem de Montagem; Tipos de Endereçamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FAC . . . . . . . 10 / 32 . Linguagem de Montagem: Instruções ; Carregar um ponteiro com endereço base dos operandos. Operandos addi $0, $0, 100 Mnemônico ; Ler valores dos operandos ; Durante a execução, $1 acumula o quociente, $2 guarda o dividendo, $3 guarda o divisor, $4 é usado para comparações, $5 é usado como 0 para referência. lw $2, 0($0) lw $3, 4($0) TESTE: ; Teste: dividendo é menor que divisor? slt $4, $2, $3 beq $4, $5, SUBTRACAO ; Fim do algoritmo. Vamos salvar o quociente e o resto. sw $1, 8($0) sw $2, 12($0) FIM: j FIM ; loop infinito no final do programa SUBTRACAO: ; Aqui, subtraímos o dividendo do divisor e ; voltamos para o teste. sub $2, $2, $3 addi $1, $1, 1 j TESTE Instruções são identificadas por mnemônicos. ▶ ▶ Determinam a instrução a ser executada. Nomes mais intuitivos para campos OpCode, função. Operandos especificados através de notações específicas. ▶ ▶ Registradores. Constantes numéricas. . Diego Passos (UFF) Linguagem de Montagem; Tipos de Endereçamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FAC . . . . . . . 11 / 32 . Linguagem de Montagem: Labels ; Carregar um ponteiro com endereço base dos operandos. addi $0, $0, 100 ; Ler valores dos operandos ; Durante a execução, $1 acumula o quociente, $2 guarda o dividendo, $3 guarda o divisor, $4 é usado para comparações, $5 é usado como 0 para referência. lw $2, 0($0) lw $3, 4($0) Declaração TESTE: ; Teste: dividendo é menor que divisor? slt $4, $2, $3 beq $4, $5, SUBTRACAO ; Fim do algoritmo. Vamos salvar o quociente e o resto. sw $1, 8($0) sw $2, 12($0) FIM: j FIM ; loop infinito no final do programa SUBTRACAO: ; Aqui, subtraímos o dividendo do divisor e ; voltamos para o teste. sub $2, $2, $3 Uso addi $1, $1, 1 Labels são marcadores de “pontos” do programa. ▶ Endereços de instruções. Ao inserir um label, podemos referenciar a posição de memória por um nome. ▶ ▶ Mais legível. Simplifica processo de relocação. Referências a labels são comuns. ▶ Instruções de desvio (condicional ou não). j TESTE . Diego Passos (UFF) Linguagem de Montagem; Tipos de Endereçamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FAC . . . . . . . 12 / 32 . Linguagem de Montagem: Portabilidade Diferentemente de linguagens de alto nível (e.g., C, Pascal, Java), a linguagem de montagem é pouco portável. Existe uma forte correspondência entre a linguagem de montagem e o conjunto de instruções. ▶ ▶ Normalmente 1 para 1. Cada linha (útil) do programa corresponde a uma instrução. Por isso, cada conjunto de instrução possui sua linguagem de montagem particular. ▶ ▶ Portar um programa em linguagem de montagem significa reescrevê-lo. Alterar as instruções para as do conjunto do processador de destino. Para linguagens de alto nível, muitas vezes é suficiente trocar o compilador. . Diego Passos (UFF) Linguagem de Montagem; Tipos de Endereçamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FAC . . . . . . . 13 / 32 . Linguagem de Montagem: Múltiplas Linguagens Note que uma mesma linguagem de montagem não é compatível com conjuntos de instruções diferentes. Mas, para um mesmo conjunto de instruções, podem existir múltiplas linguagens de montagem. Exemplo para a arquitetura x86: Sintaxe AT&T Sintaxe Intel . Diego Passos (UFF) Linguagem de Montagem; Tipos de Endereçamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FAC . . . . . . . 14 / 32 . Linguagem de Montagem: o Montador Nome dado ao “compilador” da linguagem de montagem. Responsável por: ▶ ▶ Ler um arquivo texto contendo código na linguagem de montagem. Gerar um executável, i.e., sequência de instruções em formato binário. . Diego Passos (UFF) Linguagem de Montagem; Tipos de Endereçamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FAC . . . . . . . 15 / 32 . Linguagem de Montagem: Nesta Disciplina Ao invés de trabalharmos com uma linguagem de montagem real, complexa, usaremos uma simplificada. ▶ ▶ Específica para o conjunto de instruções visto até aqui. Apenas 10 instruções. Esta linguagem é a que deverá ser usada no restante da disciplina. ▶ ▶ Último Trabalho. Próximas provas. Nos próximos slides, veremos as regras e estrutura desta linguagem. . Diego Passos (UFF) Linguagem de Montagem; Tipos de Endereçamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FAC . . . . . . . 16 / 32 . Instruções Disponíveis e Suas Representações Instrução lw reg1, imm(reg2) sw reg1, imm(reg2) add reg1, reg2, reg3 addi reg1, reg2, imm sub reg1, reg2, reg3 slt reg1, reg2, reg3 and reg1, reg2, reg3 or reg1, reg2, reg3 beq reg1, reg2, imm j imm Descrição Carrega palavra de memória da posição reg2 + imm para o registrador reg1. Escreve valor da palavra em reg1 para a posição de memória reg2 + imm. Soma os valores dos registradores reg2 e reg3 e armazena resultado em reg1. Soma o valor do registrador reg2 ao valor do imediato e armazena resultado em reg1. Subtrai os valores dos registradores reg2 e reg3 e armazena resultado em reg1. Se o valor de reg2 é maior ou igual ao valor de reg3, escreve 0 em reg1. Escreve 1, caso contrário. Realiza operação lógica AND bit a bit entre reg2 e reg3 e armazena resultado em reg1. Realiza operação lógica AND bit a bit entre reg2 e reg3 e armazena resultado em reg1. Se os valores de reg1 e reg2 forem iguais, salta para PC + imm. Salto incondicional para endereço dado pelo imediato vezes 4, concatenado com 4 bits mais significativos do PC. Observações Imediato de 16 bits em complemento a dois. Imediato de 16 bits em complemento a dois. — Imediato de 16 bits em complemento a dois. Subtração com sinal em complemento a dois. Comparação com sinal em complemento a dois. — — Imediato de 16 bits em complemento a dois. Imediato de 28 bits sem sinal. . Diego Passos (UFF) Linguagem de Montagem; Tipos de Endereçamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FAC . . . . . . . 17 / 32 . Instruções Disponíveis e Suas Representações (II) Em resumo, a instrução é composta por seu mnemônico e seus operandos. Operandos são separados por vírgula. Há três tipos de operandos: ▶ Registradores. ⋆ ⋆ ▶ Imediatos. ⋆ ⋆ ⋆ ▶ Denotados por $x. x é inteiro, decimal, de 0 a 31. Constantes numéricas. Decimais ou hexadecimais (precedidos de “0x”). Decimais podem ser precedidos de menos. imm(reg). ⋆ ⋆ Base + deslocamento. Operando é resultado da soma da constante com o conteúdo do registrador. Note ainda que os imediatos estão sujeitos aos limites impostos pelos números de bits da representação. ▶ e.g., na instrução addi, imediato tem, no máximo 16 bits em complemento a dois. . Diego Passos (UFF) Linguagem de Montagem; Tipos de Endereçamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FAC . . . . . . . 18 / 32 . Declaração e Uso de Labels A linguagem permite a declaração e o uso de labels. ▶ ▶ Nomes que identificam pontos específicos no código. i.e., as posições de memória que correspondem às instruções. Labels podem ser compostos por letras maiúsculas e minúsculas, além de algarismos decimais. ▶ Mas devem, necessariamente, começar por uma letra. A declaração de um label deve ser feita da seguinte forma: ▶ ▶ ▶ O nome do label deve ser colocado no início de uma linha. O nome deve ser seguido de dois pontos (“:”). Exemplos: InicioLoop1: add $0, $1, $2 InicioLoop2: add $0, $1, $2 . Diego Passos (UFF) Linguagem de Montagem; Tipos de Endereçamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FAC . . . . . . . 19 / 32 . Declaração e Uso de Labels (II) Um label assume como valor a posição de memória referente à próxima instrução. ▶ i.e., à instrução que vem imediatamente após a declaração do label. Labels declarados em algum ponto do código, podem ser usados em instruções de desvio. ▶ ▶ Em substituição aos imediatos. Equivalem ao endereço de memória para onde saltar. Note que: ▶ Um label pode ser referenciado antes de ser declarado. ⋆ ▶ Mas ele precisa ser declarado em algum ponto do código. Labels são usados igualmente para desvios condicionais e incondicionais. ⋆ Que esperam endereços relativos e “absolutos”. . Diego Passos (UFF) Linguagem de Montagem; Tipos de Endereçamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FAC . . . . . . . 20 / 32 . Outras Características da Linguagem Linhas em branco e espaços adicionais são ignorados. ▶ ▶ Podem ser inseridos pelo programador. Não serão considerados pelo montador. Comentários podem ser inseridos através do caractere ponto-e-vírgula. ▶ ▶ Qualquer coisa à direita de um ponto-e-vírgula é considerada comentário. E ignorada pelo montador. . Diego Passos (UFF) Linguagem de Montagem; Tipos de Endereçamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FAC . . . . . . . 21 / 32 . Um Programa de Exemplo: Divisão ; Carregar um ponteiro com endereço base dos operandos. addi $0, $0, 100 ; Ler valores dos operandos ; Durante a execução, $1 acumula o quociente, $2 guarda o dividendo, $3 guarda o divisor, $4 é usado para comparações, $5 é usado como 0 para referência. lw $2, 0($0) lw $3, 4($0) TESTE: ; Teste: dividendo é menor que divisor? slt $4, $2, $3 beq $4, $5, SUBTRACAO ; Fim do algoritmo. Vamos salvar o quociente e o resto. sw $1, 8($0) sw $2, 12($0) FIM: j FIM ; loop infinito no final do programa SUBTRACAO: ; Aqui, subtraímos o dividendo do divisor e ; voltamos para o teste. sub $2, $2, $3 addi $1, $1, 1 j TESTE Programa realiza divisão (inteira) entre dois valores. Assume que valores de entrada estão nas posições 100 e 104 da MP. Funciona realizando subtrações sucessivas do dividendo pelo divisor. ▶ Quando o divisor é maior, chegamos ao resultado final. Há, portanto, uma repetição indefinida e um condicional. ▶ Note o uso dos labels TESTE e SUBTRACAO. Resultados são armazenados nas posições 108 e 112 da MP. . Diego Passos (UFF) Linguagem de Montagem; Tipos de Endereçamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FAC . . . . . . . 22 / 32 . Modos de Endereçamento . Diego Passos (UFF) Linguagem de Montagem; Tipos de Endereçamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FAC . . . . . . . 23 / 32 . Modos de Endereçamento Instruções normalmente precisam acessar/armazenar dados em algum lugar. Exemplos: ▶ ▶ ▶ Comparar valores em registradores. Transferir dado de determinada posição de memória. Alterar o valor do PC. De alguma forma, o programador deve dizer ao processador onde estes dados estão/devem ser guardados. ▶ Feito através dos operandos das instruções. Como já vimos, instruções diferentes codificam esta informação de formas diferentes. ▶ e.g., todos os dados estão em registradores, dado está em certa posição da memória principal, . . . A estes modos de determinar a posição de um determinado dado/instrução, damos o nome de Modo de Endereçamento. . Diego Passos (UFF) Linguagem de Montagem; Tipos de Endereçamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FAC . . . . . . . 24 / 32 . Modos de Endereçamento (II) Conjuntos de instruções reais usam (podem usar) vários modos de endereçamento diferentes. Nesta disciplina, estudaremos alguns exemplos comuns: ▶ ▶ ▶ ▶ ▶ ▶ Endereçamento Endereçamento Endereçamento Endereçamento Endereçamento Endereçamento por registrador. imediato (ou constante). direto. indireto. por base mais deslocamento. relativo ao PC. Nosso conjunto de instruções simplificado utiliza 4 destes modos. . Diego Passos (UFF) Linguagem de Montagem; Tipos de Endereçamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FAC . . . . . . . 25 / 32 . Endereçamento por Registrador Neste modo, dado se encontra/deve ser guardado em um registrador. Identificador do registrador se encontra codificado nos próprios bits da instrução. Vimos diversos exemplos deste tipo de endereçamento: ▶ ▶ ▶ ▶ Instrução add. Na linguagem de montagem: add $0, $1, $2 As duas parecelas da soma se encontram em registradores. O resultado também é dado como o ID de um registrador. . Diego Passos (UFF) Linguagem de Montagem; Tipos de Endereçamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FAC . . . . . . . 26 / 32 . Endereçamento por Imediato Também chamado de Endereçamento por Constante. Dado sobre qual a instrução opera está representado por bits da própria instrução. ▶ Uma constante numérica. Exemplo encontrado na nossa linguagem de montagem: instrução addi. ▶ Uma das parcelas está em um registrador, assim como o resultado. ⋆ ▶ ▶ Endereçamento por registrador. Mas a outra parcela está nos próprios bits da instrução. Na linguagem de montagem: addi $0, $1, 377 . Diego Passos (UFF) Linguagem de Montagem; Tipos de Endereçamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FAC . . . . . . . 27 / 32 . Endereçamento Direto Neste endereçamento, instrução terá que acessar posição da MP. Posição a ser acessada é diretamente indicada por constante numérica nos bits da instrução. Não temos um exemplo perfeito deste tipo de endereçamento no nosso conjunto de instruções. O exemplo mais próximo é a instrução jump. ▶ Indicamos um endereço quase diretamente por uma constante na própria instrução: jump 0x4567 ▶ Mas a constante sofre alterações. ⋆ ⋆ Multiplicada por 4. Concatenada com os 4 bits mais significativos do PC. Em um conjunto de instruções em que a operação jump usa a constante numérica diretamente como novo valor do PC, temos o endereçamento direto. . Diego Passos (UFF) Linguagem de Montagem; Tipos de Endereçamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FAC . . . . . . . 28 / 32 . Endereçamento Indireto Neste endereçamento, também fazemos referência a uma posição de memória. O endereço a ser acessado está armazenado em um registrador. O registrador é identificado por bits da instrução. Seu valor é usado como o endereço de leitura/escrita da MP. Novamente, não há exemplo deste tipo de endereçamento no nosso conjunto de instruções. Exemplo hipotético: load $3, $4 Em algum conjunto de instruções, isso poderia representar: “carregue o conteúdo da posição de memória dada pelo valor do registrador 4 no registrador 3”. . Diego Passos (UFF) Linguagem de Montagem; Tipos de Endereçamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FAC . . . . . . . 29 / 32 . Endereçamento por Base Mais Deslocamento Híbrido entre o endereçamento direto e o endereçamento indireto. Neste endereçamento, o alvo também é um endereço da MP. ▶ ▶ ▶ Parte do endereço é dada pelo valor de um registrador especificado na instrução. Outra parte é dada por uma constante numérica, também na instrução. Endereço a ser acessado é a soma destas duas partes. Tipo de endereçamento bastante comum. Exemplo no nosso conjunto de instruções: lw $3, 8($4) ▶ Endereço a ser acessado é a soma do valor do registrador 4 (base) com a constante 8 (deslocamento). Note que, geralmente, a constante pode ser negativa. ▶ Permite acessar dados antes do endereço base. . Diego Passos (UFF) Linguagem de Montagem; Tipos de Endereçamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FAC . . . . . . . 30 / 32 . Endereçamento Relativo ao PC Modo de endereçamento geralmente utilizado para instruções de desvio. Novo valor do PC é especificado na forma de um deslocamento aplicado ao PC. Deslocamento é dado por uma constante especificada nos bits da instrução. ▶ Novo valor do PC é a soma do valor atual do PC com a constante. Exemplo de uso no nosso conjunto de instruções: ▶ ▶ Instrução branch on equal. Na linguagem de montagem: beq $3, $5, 43 Assim como no endereçamento por base mais deslocamento, constante normalmente pode ser negativa. ▶ Permite pular para pontos anteriores do programa. . Diego Passos (UFF) Linguagem de Montagem; Tipos de Endereçamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FAC . . . . . . . 31 / 32 . Exercício Escreva um programa que multiplique dois números inteiros na linguagem de montagem vista em aula. Assuma que os dois fatores da multiplicação já estejam carregados nos registradores 0 e 1. . Diego Passos (UFF) Linguagem de Montagem; Tipos de Endereçamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FAC . . . . . . . 32 / 32 .