Código de máquina como linguagem de programação. Linguagem Assembler

Computadores

A linguagem assembly (ou assembler) élinguagem de programação de baixo nível para um computador ou outro firmware, em que há uma correlação entre a linguagem e a instrução do código de máquina da arquitetura. Cada linguagem orientada a máquina (na terminologia profissional - "colecionador") refere-se a uma arquitetura de computador específica. Em contraste, a maioria das linguagens de programação de alto nível é de plataforma cruzada, mas requer interpretação ou compilação.

Código orientado a plataforma também podechame uma linguagem simbólica ou um conjunto de instruções executadas diretamente pelo processador central do computador. Cada programa executado pelo processador consiste em uma série de instruções. O código da máquina, por definição, é o nível mais baixo de programação visível para um programador.

código de máquina

Use

Muitas operações requerem um ou maisoperandos capazes de construir instruções completas, e muitos montadores podem aceitar expressões de números e constantes, assim como registradores e rótulos como operandos. Isso libera o especialista em programação na linguagem de código de máquina a partir de cálculos tediosos e repetitivos. Dependendo da arquitetura, esses elementos também podem ser combinados para instruções específicas ou modos de endereçamento usando offsets ou outros dados, bem como endereços fixos. Muitos “montadores” oferecem mecanismos adicionais para facilitar o desenvolvimento de programas, controlar o processo de compilação e depurar o suporte.

Perspectiva Histórica

A primeira linguagem assembly foi desenvolvida em 1947Kathleen Booth para a ARC2 na Birkbeck University of London, enquanto trabalhava com John von Neumann e Herman Goldstin no Institute for Advanced Study. SOAP (Symbolic Optimal Assembly Program) foi uma linguagem assembler para o IBM 650, criado por Stan Pole em 1955.

Historicamente, muitas soluções de software foramescrito apenas em assembler. Os sistemas operacionais foram escritos exclusivamente nesta linguagem antes da introdução do MCP Burroughs (1961), que foi escrito em Linguagem Orientada a Problemas de Sistemas Executivos (ESPOL). Muitos aplicativos comerciais foram escritos em uma linguagem orientada a máquina, incluindo um grande número de softwares de mainframe IBM criados por gigantes da TI. O COBOL e o FORTRAN acabaram por eliminar a maior parte do trabalho, embora muitas organizações de grande porte mantivessem as infraestruturas de aplicativos assembler na década de 1990.

o que é código binário

A maioria dos primeiros microcomputadores foram baseadosem linguagem assembly com codificação manual, incluindo a maioria dos sistemas operacionais e aplicativos de grande escala. Isso se deve ao fato de que essas máquinas tinham limitações severas de recursos, memória individual carregada e arquitetura de exibição, além de fornecerem serviços de sistema limitados com erros. Talvez mais importante tenha sido a falta de compiladores de linguagem de alto nível, de primeira classe, adequados para uso em um microcomputador, o que dificultou o aprendizado do código do computador.

Âmbito de aplicação

Idiomas de montagem eliminam a maior parte do problema,programação tediosa e demorada em montadores da primeira geração, necessária nos primeiros computadores. Isso libera os programadores da rotina de memorizar códigos numéricos e calcular endereços. Nos estágios iniciais, os “montadores” eram amplamente utilizados para todos os tipos de programação. No entanto, até o final da década de 1980. seu uso foi largamente suplantado por linguagens de alto nível em busca de melhor desempenho de programação. Atualmente, a linguagem assembler ainda é usada para manipulação direta de hardware, acesso a instruções de processador especializadas ou para resolver problemas críticos de desempenho. Aplicativos típicos incluem drivers de dispositivo, sistemas incorporados de baixo nível e parâmetros em tempo real.

Amostras de aplicação

Exemplos típicos de programas grandes em linguagem assembly são os sistemas operacionais IBM PC DOS, o compilador Turbo Pascal e os primeiros aplicativos, como o programa de planilha Lotus 1-2-3.

códigos de operação

Linguagem Orientada por Máquina - Idioma Primáriodesenvolvimento para muitos PCs caseiros populares dos anos 80 e 90 (como o MSX, o Sinclair ZX Spectrum, o Commodore 64, o Commodore Amiga e o Atari ST). Isso se deve ao fato de que os diálogos BASIC interpretados nesses sistemas forneceram baixa velocidade de execução, bem como oportunidades limitadas de fazer uso total dos equipamentos existentes. Alguns sistemas até têm um ambiente de desenvolvimento integrado (IDE) com ferramentas de depuração altamente desenvolvidas e macro-objetos. Alguns compiladores disponíveis para o Radio Shack TRS-80 e seus sucessores tiveram a oportunidade de combinar a fonte de compilação interna com programas de alto nível. Após a compilação, o montador inline gerou código binário em linha.

Código da máquina para manequins. Terminologia

O programa assembler cria códigos de operação portradução de regras mnemônicas e sintáticas para operações e modos de endereçamento em seus equivalentes numéricos. Essa representação normalmente inclui um código de operação, bem como outros bits e dados de controle. O montador também calcula expressões constantes e define nomes simbólicos para localizações de memória e outros objetos.

Os códigos de instruções da máquina de montagem tambémexecute alguns tipos simples de otimização, dependendo do conjunto de comandos. Um exemplo específico disso pode ser o popular x86 "colecionadores" de diferentes fornecedores. A maioria deles pode executar comandos de transição de substituição em qualquer número de passes, mediante solicitação. Também é capaz de realizar o reagrupamento simples ou a inserção de instruções, como alguns montadores de arquiteturas RISC, que podem ajudar a otimizar o agendamento inteligente de comandos para maximizar o uso do pipeline da CPU.

Como as primeiras linguagens de programação, comoFortran, Algol, Cobol e Lisp, montadores estão disponíveis desde a década de 1950, como as primeiras gerações de interfaces de computador baseadas em texto. No entanto, os coletores apareceram pela primeira vez porque são muito mais fáceis de escrever do que os compiladores de linguagens de alto nível. Isso se deve ao fato de que cada mnemônico, assim como modos de endereçamento e operandos de instruções, são traduzidos em representações numéricas de cada instrução específica sem um grande contexto ou análise. Havia também um número de classes de tradutores e geradores de código semi-automáticos com propriedades semelhantes a ambos os conjuntos e linguagens de alto nível, com o código de velocidade talvez sendo um dos exemplos mais conhecidos.

Número de passes

Existem dois tipos de programação em assembler, com base no número de passagens através da fonte (pelo número de tentativas de leitura) para criar um arquivo de objeto.

linguagem de máquina
Os montadores de uma passagem passam pelo código-fonte uma vez. Qualquer caractere usado antes de sua definição exigirá uma errata no final do código do objeto.
Montadores Multi-pass criam tabelas com todos os caracteres e seus valores nas primeiras passagens e, em seguida, usam a tabela em passadas subseqüentes para gerar o código.

Razão inicial para usoos coletores de uma passagem tinham velocidade de montagem - frequentemente, a segunda passagem exigia o rebobinamento e a releitura da fonte do programa para a fita. Computadores posteriores com quantidades muito maiores de memória (especialmente para armazenar discos) tinham espaço para executar todo o processamento necessário sem reler. A vantagem do assembler multi-pass é que a ausência de erros leva ao fato de que o processo de ligação (ou o carregamento do programa, se o montador criar diretamente o código executável) é mais rápido.

O que é código binário?

Um programa escrito em linguagem assemblyconsiste em uma série de instruções mnemônicas de processador e meta-operadores (conhecidos como diretivas, pseudo-instruções e pseudo-ops), comentários e dados. Instruções de linguagem assembly geralmente consistem em um mnemônico opcode. É seguido por uma lista de dados, argumentos ou parâmetros. Eles são traduzidos pelo montador em instruções de linguagem de máquina que são carregadas na memória e executadas.

Por exemplo, a instrução abaixo dizO processador x86 / IA-32 move o valor de 8 bits para registrar. O código binário para este comando é 10110, seguido por um identificador de 3 bits para o qual o registrador é usado. O identificador AL é 000, então o código a seguir carrega o registrador AL com os dados 01100001.

Surge a pergunta: o que é código binário? Este é um sistema de codificação que usa dígitos binários "0" e "1" para representar uma letra, número ou outro símbolo em um computador ou outro dispositivo eletrônico.

Exemplo de código de máquina: 10110000 01100001.

Características técnicas

A conversão de uma linguagem de montagem em código de máquina étrabalho de montagem. O processo inverso é realizado usando um desmontador. Ao contrário das linguagens de alto nível, há uma correspondência de um para um entre o conjunto de operadores de montagem simples e as instruções de linguagem de máquina. No entanto, em alguns casos, o montador pode fornecer pseudo-instruções (macros). Eles cobrem várias instruções de linguagem de máquina para fornecer a funcionalidade normalmente necessária. A maioria dos montadores com recursos completos também fornece uma linguagem de macro avançada que é usada por fornecedores e programadores para gerar códigos e seqüências de dados mais complexos.

programação em linguagem assembly

Cada arquitetura de computador tem seu própriolinguagem de máquina própria. Os computadores diferem no número e nos tipos de operações que eles suportam, em tamanhos diferentes e no número de registros, bem como em representações de dados no repositório. Embora a maioria dos PCs de uso geral seja capaz de executar quase a mesma funcionalidade, as maneiras pelas quais eles fazem isso são diferentes. As respectivas linguagens assembly refletem essas diferenças.

Muitos conjuntos de mnemônicos ou sintaxes emlinguagem assembly pode existir para um único conjunto de comandos, geralmente criados em diferentes programas. Nestes casos, o mais popular é, via de regra, aquele fornecido pelo fabricante e usado em sua documentação.

Linguagem de Design

Existe um grande grau de diversidadeComo autores, os colecionadores classificam as aplicações e a nomenclatura que usam. Em particular, alguns descrevem tudo o que é diferente de uma máquina ou mnemônico estendido, como uma pseudo-operação. O dicionário básico de montagem consiste em um sistema de comandos - três tipos principais de instruções que são usadas para definir operações de software:

  • mnemônicos opcode;
  • definições de dados;
  • diretivas de colecionador.

Mnemônicos opcionais e mnemônicos estendidos

Instruções escritas em linguagem assemblyelementar, ao contrário das linguagens de alto nível. Como regra geral, mnemônicos (caracteres arbitrários) é um símbolo para uma única instrução de código executável. Cada instrução geralmente consiste em um opcode mais zero ou mais operandos. A maioria dos comandos se refere a um ou dois valores.

Mnemônicos estendidos são frequentemente usadosoperação especializada de instruções - para fins não óbvios a partir do nome do manual. Por exemplo, muitos processadores não possuem uma instrução NOP explícita, mas possuem algoritmos internos que são usados ​​para essa finalidade.

código orientado para plataforma

Muitos coletores suportam macros incorporadas elementares que podem gerar duas ou mais instruções de máquina.

Diretivas de dados

Existem instruções usadas paradefinições de item para armazenar dados e variáveis. Eles definem o tipo de dados, comprimento e alinhamento. Essas instruções também podem determinar a disponibilidade de informações para programas externos (coletados separadamente) ou apenas para o programa no qual a seção de dados é definida. Alguns montadores os definem como pseudo-operadores.

Diretrizes de montagem

Diretivas de coletor, também chamadas de pseudo-códigosou pseudo-ops, são comandos fornecidos ao montador e direcionados para executar operações diferentes das instruções de montagem. As diretivas afetam o trabalho do montador e podem afetar o código do objeto, a tabela de símbolos, o arquivo de listagem e os valores dos parâmetros internos do montador. Às vezes, o termo pseudocódigo é reservado para diretivas que geram código de objeto.

Os nomes de pseudo-ops geralmente começam com um ponto,para ser diferente dos comandos da máquina. Outro uso comum de pseudo-ops é reservar áreas de armazenamento para dados de tempo de execução e possivelmente inicializar seu conteúdo para valores conhecidos.

sistema de comando

Código de autodocumentação

Os montadores de caracteres permitem que programadoresassocie nomes arbitrários (rótulos ou caracteres) com células de memória e várias constantes. Muitas vezes, cada valor constante e variável recebe seu próprio nome, de modo que as instruções podem se referir a esses locais pelo nome, contribuindo, assim, para o código de autodocumentação. No código executável, o nome de qualquer sub-rotina corresponde ao seu ponto de entrada, portanto, qualquer chamada à sub-rotina pode usar seu nome. Dentro das rotinas são atribuídos rótulos GOTO. Muitos coletores suportam caracteres locais que são lexicamente diferentes dos caracteres comuns.

Os montadores da NASM fornecem flexibilidadegerenciamento de caracteres, permitindo que os programadores gerenciem diferentes namespaces, calculem automaticamente os deslocamentos nas estruturas de dados e atribuam rótulos que se referem a valores literais ou o resultado de cálculos simples executados por um montador. Os atalhos também podem ser usados ​​para inicializar constantes e variáveis ​​usando endereços realocáveis.

Idiomas de montagem, como a maioria das outras linguagenscomputador, permite adicionar comentários ao código-fonte do programa, que será ignorado durante o processo de compilação. Comentários judiciais são importantes em programas em linguagem assembly, uma vez que a definição e o propósito de uma sequência de instruções binárias sobre máquinas é difícil de determinar. Linguagem assembly “sem tratamento” (sem comentar) criada por compiladores ou desmontadores é bastante difícil de ler quando mudanças precisam ser feitas.