Prévia do material em texto
Linguagem de Máquina SST Ancelmo, Jose Roberto Linguagem de Máquina / Jose Roberto Ancelmo Ano: 2020 nº de p. : 11 Copyright © 2020. Delinea Tecnologia Educacional. Todos os direitos reservados. Linguagem de Máquina 3 Apresentação Neste momento, vamos entender a linguagem de montagem, o formato e a codificação de instruções, bem como os tipos de instruções. Veremos, também, os tipos de endereçamento e as chamadas a funções. Linguagem de montagem Segundo Tanenbaum (2013, p. 300), a linguagem de montagem, de modo geral, pode ser dividida em dois grupos, dependendo da relação entre a linguagem-fonte e a linguagem-alvo. Para o autor, quando a linguagem-fonte é, em essência, uma representação simbólica para uma linguagem de máquina numérica, o tradutor é denominado assembler (montador) e a linguagem-fonte é denominada “linguagem de montagem” (assembly language). Quando a linguagem-fonte é uma linguagem de alto nível, como Java ou C, e a linguagem-alvo é uma linguagem de máquina numérica ou simbólica de uma linguagem de máquina numérica, o tradutor é chamado “compilador”. Desde a origem dos computadores, os arquitetos e engenheiros da computação procuram facilitar a interação entre o homem e a máquina, para que as tarefas e execuções sejam mais eficientes, ou seja, tenham um menor tempo de execução e armazenamento, reduzindo os recursos e custos operacionais. Para a máquina compreender a linguagem natural (ou seja, o que desejamos que ela execute), é necessário entendermos a linguagem da máquina ou linguagem de baixo nível. No entanto, a linguagem da máquina é binária e há um esforço grandioso para realizarmos solicitações e execuções de operações ao nível da máquina. Com o tempo, foram criados os montadores (interpretadores) e compiladores, convertendo códigos de alto nível e de montagem em linguagem de máquina para códigos executáveis. A linguagem de montagem é uma notação legível por humanos, constituída por símbolos ou mnemônicos para o entendimento do código de máquina que determinada arquitetura de computador utiliza. 4 Uma linguagem de montagem é quando a linguagem-fonte for essencialmente uma representação simbólica para uma linguagem de máquina numérica. Ela também é chamada de Linguagem Assembly. Já o montador é o tradutor entre a linguagem-fonte e a linguagem de máquina numérica (também chamado de Assembler). No caso de uma linguagem de alto nível (C ou Pascal) e uma “linguagem alvo” forem uma linguagem de máquina numérica ou uma representação simbólica dessa linguagem (linguagem de montagem), o tradutor é chamado de compilador. (SOUZA FILHO; ALEXANDRE, 2014, p. 67) Na figura a seguir, veja um esquema sobre o processo de tradução (montagem ou compilação) e ligação de código-fonte, escrito em linguagens de programação, em um código binário executável. Perceba que a linguagem de baixo nível (linguagem de montagem ou linguagem Assembly) (1a), por meio do montador ou Assembler (2a), gera um código objeto (3a) que será executado pelo código binário executável (5a) (gerado pelo ligador [linkeditor] [4a]). Já a linguagem de alto nível (1b), por meio do compilador (2b), gera um código traduzido em forma de linguagem de montagem (2b') para o montador gerar o código- objeto (3b), por meio do ligador, que, por sua vez, gera o código binário executável. A função do ligador é coletar procedimentos traduzidos separadamente e ligá-los uns aos outros para que eles possam executar como uma unidade chamada código executável (o programa) (SOUZA FILHO; ALEXANDRE, 2014, p. 69). É utilizada a técnica de geração de dois códigos-objeto (objetos separados do passo 3a), a fim de que o ligador execute o código binário executável. Isso ocorre porque o processo é mais rápido do que uma tradução, pois o único procedimento a ser executado novamente é se houvesse alterações no código-fonte. Os ligadores também são chamados de link-editores ou linkers. Processo de tradução (montagem ou compilação). Fonte: Adaptada de Souza Filho e Alexandre (2014, p. 67). 5 Segundo Patterson e Hennessy (2005, p.10): Os primeiros programadores se comunicavam com os computadores em números binários, isso era tão maçante que rapidamente inventaram novas notações mais parecidas com a maneira como os homens pensam. […] Usando a própria máquina para ajudá-los a programá-la, os pioneiros inventaram programas para traduzir a notação simbólica [linguagem de montagem] para binário. O primeiro desses programas foi chamado de montador (Assembler). Esse programa traduz a versão simbólica de uma instrução para uma versão binária. Por exemplo, o programador escreveria Add A, B. E o montador traduziria essa notação como: 1000110010100000. Essa instrução diz ao computador para somar números, A e B. O nome criado para essa linguagem simbólica, ainda em uso hoje, é linguagem Assembly. Já para Weber (2012), um montador (ou Assembler) é uma ferramenta indispensável para o desenvolvimento de programas que devem acessar os recursos de arquitetura de um processador. Outra questão que devemos entender: por que usar uma linguagem de montagem? Souza Filho e Alexandre (2014) comentam que programar em uma linguagem de montagem é mais trabalhoso. Não é uma linguagem produtiva, pois consome tempo de desenvolvimento. Em contrapartida, pode produzir um código enxuto e mais eficiente do que uma codificação em linguagem de alto nível. Além disso, a linguagem de montagem pode ter acesso total ao hardware, realizando procedimento que, em uma linguagem de alto nível, não seria possível. Para Null e Lobur (2010, p. 273): Os empregadores frequentemente preferem contratar pessoas com conhecimento de linguagens simbólicas, não porque precisam de alguém capaz de entender a arquitetura simbólica, mas porque eles precisam de alguém capaz de entender a arquitetura de computadores, para escrever programas mais eficientes e eficazes. A linguagem de montagem também permite a compreensão do funcionamento de uma CPU, da programação baseada em microcontroladores e de sistemas embarcados e para recursos não disponíveis em linguagens em alto nível. 6 Codificação de instruções Vimos que atualmente uma linguagem de montagem é compreendida para um melhor entendimento da arquitetura de um computador, fazendo com que as execuções das tarefas computacionais e automatizações tenham uma maior eficiência. Para Null e Lobur (2010), o método tradicional para descrever uma arquitetura de computador é especificar o número máximo de operandos ou endereços contidos em cada instrução. Portanto, devemos entender o que é uma instrução e seu formato em uma linguagem de montagem. A função básica desempenhada por um computador é executar um programa, constituído por um “conjunto de instruções” armazenadas na memória. O processador realiza o trabalho efetivo de executar as instruções específicas de um programa (STALLINGS, 2002). Internamente, cada instrução é representada como uma sequência de bits dividida em campos, correspondendo aos elementos de uma instrução, como você pode conferir na figura a seguir. Essa instrução significa “[…] some o número contido na posição de memória M ao número armazenado na posição de memória N e coloque o resultado de memória P” (AGUILAR, 2011, p. 20). A imagem ilustra o código binário da operação de soma e transferência de valores para um local de memória, sendo realizada a operação matemática de soma: P = M + N. Instrução típica de soma em linguagem montadora e de máquina. Fonte: Adaptada de Aguilar (2011, p. 20-21). Stallings (2002) comenta que há dois passos para o processador de instruções: [(1)] o processador lê (busca) instruções na memória, uma de cada vez, e [(2)] executa uma a uma. Esse processo é repetitivo, envolvendo várias operações. A figura a seguir mostra o processamento necessário para a execução de uma instrução, chamado ciclo de instrução. O processador buscará as instruções sequencialmente nas posições de memória ou de maneiraalternada. 7 Ciclo de instrução básico. Fonte: Adaptada de Stallings (2002, p. 58). Como vimos na figura acima, dados e instruções são armazenados na memória, e os números e as instruções devem ser representados em forma binária. O processador, especificamente a unidade de controle do processador, controla a operação da memória, efetuando buscas das instruções e realiza a execução delas, por meio do ciclo de instrução básico. Esse ciclo pode variar em sua complexidade, dependendo da arquitetura do computador. A figura a seguir ilustra o ciclo de execução de instrução e a movimentação de dados entre a CPU e a instrução de dados. Para Silberschatz, Galvin e Gagne (2008), um sistema computadorizado de uso geral consiste em uma CPU e vários controladores de dispositivos conectados por um barramento comum. As informações são transferidas do dispositivo para um buffer local pelo barramento por meio de interrupções do sistema operacional. Esse procedimento é válido para pequenas quantidades. Já o acesso direto à memória transfere uma quantidade maior de dados (DMA). Em seguida, a controladora realiza a transferência dos dados do buffer para a memória sem intervenção da CPU. Após os dados na memória, a CPU inicia o processo de busca das instruções pelo ciclo básico de instrução. Variantes mais complexas do ciclo de execução de instruções podem existir em arquiteturas variadas. Veja como funciona esse sistema computadorizado moderno. da 8 Como funciona um sistema computadorizado moderno Formatos de palavras Os formatos de uma palavra na memória, baseada no modelo de computador projetado por Von Neumann, são chamados “IAS” e constituem um protótipo de todos os computadores de propósito geral. Cada número é representado por um bit de sinal e um valor de 39 bits (item [a] armazenamento de um número) (STALLINGS, 2002). Já uma palavra pode conter duas instruções de 20 bits, cada uma consistindo em um código de operação (opcode) com 8 bits, que especifica a operação executada, e de um endereço com 12 bits, que designa uma palavra na memória (numerada de 0 a 999) (STALLINGS, 2002). Veja que cada instrução (esquerda e direita) é alocada nos 20 bits. Formatos de uma palavra na memória no modelo “IAS” de Von Neumann. Fonte: Adaptada de Stallings (2002, p. 22). 9 Portanto, as instruções são formadas basicamente por dois campos: Código de operação (Opcode): subgrupo de bits que identifica a operação a ser realizada pelo processador. “É o campo da instrução cujo valor binário identifica a operação a ser realizada […]” (MONTEIRO, 2007 apud FÁVERO, 2011, p. 75). A figura a seguir mostra o código de operação de uma instrução de adição ADD = 0110. Cada instrução tem um código único de identificação para a unidade de controle do processador. As instruções básicas podem ser adição, subtração e comparação e outras, conforme a orientação da arquitetura, atualmente RISC (Reduced Instruction Set Computer) ou CISC (Complex Instruction Set Computer). Código de operação. Fonte: Adaptada de Stallings (2002, p. 22). Operando: subgrupo de bits que identifica o endereço de memória em que está contido o dado que será manipulado, ou pode conter o endereço no qual o resultado da operação será armazenado (MONTEIRO, 2007 apud FÁVERO, 2011). A que segue ilustra o operando de uma instrução, contendo o endereço de memória de manipulação dos dados. Operando de uma instrução. Fonte: Elaborada pelo autor (2017). 10 Segundo Null e Lobur (2010, p. 278), as instruções em arquiteturas atuais podem ser formatadas de duas maneiras: Tamanho fixo: desperdiça espaço, mas é rápida e resulta em um melhor desempenho quando é usado pipeline em nível de instrução. Tamanho variável: mais complexa de decodificar, mas economiza espaço. Fechamento Chegamos ao final do estudo e compreendemos o conceito da linguagem de máquina e como uma máquina compreende em forma de codificação uma linguagem natural a partir dos programa de computadores. Na sequência, vimos a codificação de instruções através do ciclo de instruções básicas, o funcionamento de um sistema computacional moderno e os formatos de palavras que os sistemas trabalham. 11 Referências AGUILAR, L. J. Fundamentos de Programação: algoritmos, estruturas de dados e objetos. 3. ed. Porto Alegre: AMGH, 2011. FÁVERO, E. M. de B. Organização e arquitetura de computadores. Pato Branco: UTFPR, 2011. NULL, L.; LOBUR, J. Princípios Básicos de Arquitetura e Organização de Computadores. Porto Alegre: Bookman, 2010. PATTERSON, D. A.; HENNESSY, J. L. Organização e projeto de computadores. Rio de Janeiro: Elsevier, 2005. SILBERSCHATZ, A.; GALVIN, P. B.; GAGNE, G. Sistemas Operacionais com Java. Rio de Janeiro: Elsevier, 2008. STALLINGS, W. Arquitetura e Organização de Computadores: projeto para o desempenho. São Paulo: Prentice Hall, 2002. TANENBAUM, A. S. Organização estruturada de computadores. 6. ed. São Paulo: Pearson, 2013. WEBER, R. F. Fundamentos de arquitetura de computadores. 4. ed. Porto Alegre: Bookman, 2012.