Como ocorre a conversão de um programa em linguagem de alto nível para o código que é executado pelo processador?

Origem: Wikipédia, a enciclopédia livre.

Como ocorre a conversão de um programa em linguagem de alto nível para o código que é executado pelo processador?

Assembly ou linguagem de montagem é uma notação legível por humanos para o código de máquina que uma arquitetura de computador específica usa, utilizada para programar códigos entendidos por dispositivos computacionais, como microprocessadores e microcontroladores. O código de máquina torna-se legível pela substituição dos valores em bruto por símbolos chamados mnemónicos[1][2].

Por exemplo, enquanto um computador sabe o que a instrução-máquina IA-32 (B0 61) faz, para os programadores é mais fácil recordar a representação equivalente em instruções mnemónicas MOV AL, 61h. Tal instrução ordena que o valor hexadecimal 61 (97, em decimal) seja movido para o registrador 'AL'. Embora muitas pessoas pensem no código de máquina como valores em binário, ele é normalmente representado por valores em hexadecimal.

A tradução do código Assembly para o código de máquina é feita pelo montador ou assembler. Ele converte os mnemónicos em seus respectivos opcodes, calcula os endereços de referências de memória e faz algumas outras operações para gerar o código de máquina que será executado pelo computador.

Arquitetura[editar | editar código-fonte]

Ao contrário do que acontece nas linguagens de alto nível, existe uma correspondência de 1 para 1 entre o código programado e o resultante. Isto é, uma instrução do programa equivale a uma operação do computador.[3]

Cada arquitetura de computador tem seu próprio código de máquina, e cada montador gera códigos para uma arquitetura específica. Cada um desses montadores tem sua própria versão de código Assembly, que pode diferir ao uso de registradores, representação de números, ou até mesmo instruções mnemónicas. E isso pode dificultar um pouco na portabilidade do código, tendo em vista que o mesmo precisaria ser reescrito para poder ser montado para outra arquitetura.

Registradores[editar | editar código-fonte]

Os registradores são pequenas e rápidas áreas de memória utilizada para diversos fins. Alguns desses registradores são utilizados para designar os locais da memória em que o processador vai executar ou pegar informações.

Registradores de segmento[editar | editar código-fonte]

Segmento é uma área da memória usada para armazenar instruções, dados ou usado pela pilha[4]. Os seguintes registradores são usados para designar estas áreas:

  • CS - Code Segment, segmento de código em execução.
  • DS - Data Segment, segmento de dados.
  • SS - Stack Segment, segmento de pilha.
  • ES - Extra Segment, segmento extra para armazenamento de dados.

Registradores ponteiros[editar | editar código-fonte]

Esses registradores são utilizados para indicar posições da memória de instruções e dados.

  • BP - Base Pointer, usado como ponteiro para indicar a base da stack frame atual. É usado por linguagens de programação de alto nível, como C, para controlar a área de memória na pilha usada por cada função.
  • IP - Instruction Pointer, aponta para a próxima instrução que será executada.
  • SP - Stack Pointer, aponta para o final da pilha.
  • SI - Source Index, usado em operações com blocos de dados para apontar para o bloco de memória fonte.
  • DI - Destination Index, usado em operações com blocos de dados para apontar para o bloco de memória de destino.

Registradores de dados[editar | editar código-fonte]

Usado de forma geral no programa, para várias operações. Embora possam ser utilizados em outras ocasiões, cada um desses registradores foram feitos para tarefas específicas.

  • AX - Registrador Acumulador, usado para operações aritméticas.
  • BX - Registrador de Base, usado para indexar endereços na memória.
  • CX - Registrador Contador, usado para contagem usando a instrução de loop.
  • DX - Registrador de Dados, usado para armazenar dados de forma geral. Seja para cálculos ou operações de [I/O].

Esses registradores na verdade são uma junção de dois registradores de 8bits, somando ao todo 16bits. Eles são AH, AL, BH, BL, CH, CL, DH, DL.

Também existem versões de 32 e 64bits desses registradores. Onde eles são:

  • 32 bits - EAX, EBX, ECX, EDX
  • 64 bits - RAX, RBX, RCX, RDX

Montador[editar | editar código-fonte]

O montador ou assembler (não confundir com assembly) é um programa que cria o código objeto traduzindo as instruções da linguagem de montagem (assembly) para código de máquina. Além dos comandos básicos, que são traduzidos diretamente para a linguagem de máquina, alguns montadores também aceitam diretivas, que são comandos específicos para o montador. Por exemplo, é possível definir constantes na memória utilizando diretivas.[5]

O montador possui tabelas, onde armazena informações importantes sobre o programa que está sendo montado. Tabelas de rótulos, de constantes e de comandos são as mais comuns.[5]

Exemplo de código Assembly[editar | editar código-fonte]

Um exemplo de código Olá Mundo feito para arquitetura x8086:

lea si, string ; Atribui SI ao endereço de string.
call printf    ; Coloca o endereço atual na pilha e chama o processo printf

hlt            ; Encerra o computador.
string db "Ola mundo!", 0

printf PROC
   mov AL, [SI] ; Atribui à AL o valor no endereço SI.
   cmp AL, 0    ; Compara AL com nulo.
   je pfend     ; Pula se comparação der igual.

   mov AH, 0Eh
   int 10h      ; Executa uma função da BIOS que imprime o caractere em AL.
   inc SI       ; Incrementa em um o valor de SI.
   jmp printf   ; Pula para o início do processo.

   pfend:
   ret          ; Retorna para o endereço na posição atual da pilha.
printf ENDP

Ver também[editar | editar código-fonte]

  • Compilador
  • Desmontador
  • Mnemónico
  • Linguagens de programação
  • Linguagem de baixo nível
  • Processador
  • Registrador
  • Arquitetura SMS - simulador de programação Assembly
  • Lista de linguagens de programação

Referências

  1. Assembly - Knol
  2. Linguagem de montagem - UFF
  3. Conversões de Linguagens: Tradução, Montagem, Compilação, Ligação e Interpretação
  4. [PDF Memória Segmentos.
  5. a b Ricardo Anido (25 de Fevereiro de 2011). «Introdução à Organização de Computadores e Linguagens de Montagem» (PDF). Universidade Estadual de Campinas. Consultado em 11 de março de 2012

Ligações externas[editar | editar código-fonte]

  • «IA-32 Intel® Architecture Software Developer's Manual Volume 1: Basic Architecture» (em inglês)

Quem converte um programa feito em linguagem de alto nível para a linguagem de máquina?

Interpretadores, compiladores e tradutores. O computador deve converter os comandos dados em linguagem de alto nível para linguagem de máquina (códigos binários).

Como se chamam os dois processos de conversão de linguagens de alto nível em linguagens inteligíveis pelo computador?

Como se chamam os dois processos de conversão de linguagens de alto nível em linguagens inteligíveis pelo computador? Tradução e interpretação. Compilação e interpretação. Análise sintática e análise léxica.

Como uma linguagem alto nível é convertida em binário?

Compiladores e interpretadores são formas de tradução de um código geralmente de alto nível para um código que o computador (a máquina) interprete. Este tradutor tem a função de traduzir uma linguagem abstrata para uma linguagem binária.

Quais são os processos de transformação do código fonte?

Um programa-fonte deve ser criado em um editor de textos (sem formatação). Após a criação, este programa é submetido a um compilador que analisa o código-fonte e o converte este para um código-objeto (ou programa-objeto). O código-objeto é a versão em linguagem de máquina do programa-fonte.