A linguagem assembly é uma linguagem de programação de baixo nível que expõe as instruções utilizadas pelo computador para operar o seu hardware. Neste artigo, exploramos a linguagem assembly como uma introdução à programação, com exemplos de código e explicações. Se você já se perguntou o que é um "ponteiro" ou "pilha" e se deve aprender assembly em sua busca para se tornar um programador, continue lendo. Este artigo explica o que é linguagem assembly, suas vantagens e desvantagens, exemplos de casos de uso comuns para linguagens assembly e alguns recursos se você quiser aprender mais sobre este tópico. Vamos começar!
Definição de linguagem de montagem
A linguagem assembly é uma linguagem de programação de baixo nível específica para um determinado tipo de processador. Geralmente é escrita em forma mnemônica, que é uma representação simbólica do código de máquina gerado pelo assembler. Na linguagem assembly, os códigos de operação das instruções da máquina são substituídos por mnemônicos, e os endereços das instruções ou operandos são substituídos por símbolos de endereço ou rótulos. Em diferentes dispositivos, a linguagem assembly corresponde a diferentes conjuntos de instruções de linguagem de máquina e é convertida em instruções de máquina através do processo de montagem. Existe uma correspondência um-para-um entre uma linguagem assembly específica e um conjunto específico de instruções de linguagem de máquina, e ela não é diretamente portátil entre diferentes plataformas.
História da linguagem assembly
A história da linguagem assembly remonta aos primórdios da computação. Uma das primeiras linguagens assembly foi criada na década de 1950 para o computador IBM 701. Essa linguagem, chamada Autocode, foi desenvolvida por Alick Glennie e baseava-se no código existente usado para o predecessor do 701, o IBM 650.
O Autocode foi logo seguido por várias outras linguagens de montagem, incluindo a Linguagem de Montagem FORTRAN (FAL) e a Linguagem de Montagem COBOL (CAL). Essas linguagens foram projetadas para facilitar a programação em suas respectivas linguagens de alto nível e foram muito bem-sucedidas.
Linguagem de programação
Desde o advento do primeiro computador eletrônico do mundo em 1946, a forma e a linguagem de comunicação entre humanos e máquinas tornou-se a principal direção de pesquisa dos engenheiros de software e profissionais de informática. Linguagens de programação mais eficientes e simples tornaram-se as novas queridinhas dos engenheiros de software. Com o rápido desenvolvimento dos computadores, a velocidade de atualização do hardware dos computadores está ficando cada vez mais rápida e os requisitos para linguagens de programação estão se tornando cada vez mais rigorosos. As linguagens de programação evoluíram muito nas últimas décadas, e até hoje já houve três gerações de linguagens. Para atender aos requisitos de programação e às funções de software em diferentes campos, um grande número de linguagens de programação passou por um processo de modificação, substituição e desenvolvimento, culminando na diversificação das linguagens de programação atuais. Apesar das muitas tentativas de encontrar uma linguagem universal que se adaptasse a todos os ambientes de programação, nenhuma delas foi bem-sucedida. A linguagem de programação está avançando com a tecnologia moderna, e a sabedoria dos seres humanos está se manifestando cada vez mais.

1 geração: Linguagem de máquina
A linguagem de máquina é a linguagem de programação de primeira geração. No início da invenção do computador, para controlar o computador para realizar suas próprias tarefas ou projetos, as pessoas só podiam escrever sequências binárias de números, como "0" e "1", para controlar o computador. Essa linguagem é a linguagem de máquina. Intuitivamente, a linguagem de máquina é muito obscura e difícil de entender, e seu significado geralmente é compreendido consultando tabelas ou manuais. É muito trabalhoso usá-la, especialmente quando você precisa modificar o programa concluído. Esse tipo de linguagem de máquina desordenada faz com que você não consiga iniciar e dificulta a localização de erros no programa. Além disso, o ambiente operacional de diferentes computadores é diferente, e as instruções e métodos de operação também são diferentes. Portanto, quando você tem uma especificidade nessa linguagem de máquina, só pode executá-la em um computador específico. E, uma vez que você muda a máquina, precisa reprogramar, o que reduz muito a eficiência de uso e promoção do programa. No entanto, devido à especificidade da linguagem de máquina, ela se adapta perfeitamente a um tipo específico de computador, portanto, sua eficiência operacional é muito maior do que a de outras linguagens.

2ª geração: Linguagem assembly
Não é difícil perceber que a linguagem de máquina, como linguagem de programação, tem pouca flexibilidade e legibilidade. Para aliviar o desconforto causado pela linguagem de máquina aos engenheiros de software, as pessoas atualizaram e melhoraram a linguagem de máquina: usam letras e palavras fáceis de entender e lembrar no lugar de uma instrução específica. Por meio desse método, fica fácil para as pessoas lerem o programa concluído ou entenderem a função que o programa está executando, e o reparo de bugs e a operação e manutenção do programa existente se tornam mais fáceis e convenientes. Essa linguagem é o que chamamos de linguagem assembly, a linguagem de computador de segunda geração.

Em comparação com a linguagem de máquina, a linguagem assembly tem maior dependência da máquina e é mais fácil de memorizar e escrever, mas ao mesmo tempo mantém a alta velocidade e eficiência da linguagem de máquina. A linguagem assembly ainda é uma linguagem orientada para a máquina, é difícil compreender a intenção do projeto do programa a partir do seu código, e o programa projetado não é fácil de ser transplantado, por isso não é tão amplamente utilizada como a maioria das outras linguagens de computador de alto nível. Portanto, nas linguagens de alto nível altamente desenvolvidas de hoje, ela é geralmente usada no nível inferior, normalmente para otimização de programas ou operação de hardware.
3ª geração: linguagem de alto nível
Depois que a linguagem de programação passou pela atualização da linguagem de máquina, linguagem assembly, etc., as pessoas descobriram o fator-chave que limita a generalização dos programas – a portabilidade do programa. É necessário projetar um programa que possa ser executado em diferentes máquinas, independentemente do hardware do computador. Dessa forma, muitos processos repetitivos de programação podem ser evitados e a eficiência pode ser melhorada. Ao mesmo tempo, a linguagem deve ser próxima da linguagem matemática ou da linguagem natural dos seres humanos. Na década de 1950, quando os computadores ainda eram escassos, nasceram as primeiras linguagens de programação de alto nível. Naquela época, o custo dos computadores era alto, mas a quantidade de cálculos por dia era limitada. Como usar efetivamente o poder de computação limitado dos computadores tornou-se um problema que as pessoas enfrentavam naquela época. Ao mesmo tempo, devido à escassez de recursos, a eficiência operacional dos computadores também se tornou o objetivo perseguido pelos engenheiros daquela época.

Composição em linguagem assembly
Devido ao enorme sistema de instruções de montagem, é necessário construir um sistema de instruções, que possui um grande número de instruções, formatos complexos e baixa memorabilidade. A parte mais difícil da instrução é o modo de endereçamento suportado pela instrução, e sua essência é como obter o operando na instrução. Para o processador, trata-se de como encontrar os dados de que ele precisa. No entanto, para a linguagem de montagem na parte inferior do computador, esse método de endereçamento envolverá um grande número de formatos de armazenamento de computação e está intimamente relacionado ao complexo método de gerenciamento de armazenamento, por isso é difícil de entender. Por fim, as instruções de montagem também estão relacionadas à forma como afetam os sinalizadores, mas os sinalizadores do processador são muito complexos, por isso é mais difícil compreender o mecanismo.
enviar comando
As instruções do comando enviar incluem:
- instrução geral de transferência de dados: MOV;
- instrução de transferência condicional: CMOVcc;
- instrução de operação de pilha: PUSH, PUSHA, PUSHAD, POP, POPA, POPAD;
- instrução de troca: XCHG, XLAT, BSWAP;
- instrução de transferência do seletor de endereço ou descritor de segmento: LEA, LDS, LES, LFS, LGS, LSS, etc.
operação lógica
Esta parte das instruções é usada para realizar operações aritméticas e lógicas, incluindo:
- instrução de adição: ADD, ADC;
- instrução de subtração: SUB, SBB;
- instrução mais um: INC;
- instruções de ajuste decimal: AAA, AAS, DAA, DAS;
- instrução menos um: DEC;
- instrução de operação de comparação: CMP;
- instruções de extensão de sinal: CBW, CWDE, CDQE;
- instrução de multiplicação: MUL, IMUL;
- instrução de divisão: DIV, IDIV;
- instruções de operação lógica: AND, NOT, OR, XOR, TEST.
instrução de mudança
Esta parte da instrução é usada para mover um operando de registro ou memória um número especificado de vezes.
- instrução de deslocamento lógico para a esquerda: SHL;
- instrução de deslocamento lógico à direita: SHR;
- instrução de deslocamento aritmético para a esquerda: SAL;
- instrução de deslocamento aritmético à direita: SAR;
- instrução de deslocamento circular para a esquerda: ROL ;
- instrução de deslocamento circular à direita: ROR, etc.
manipulação de bits
Esta parte das instruções inclui:
- a instrução de teste de bit: BT;
- a instrução de teste e definição de bits: BTS;
- a instrução de teste e reinicialização de bits: BTR;
- a instrução de teste e negação de bits: BTC;
- a instrução de varredura de bits para frente: BSF;
- a instrução de varredura de bits para trás: BSR.
transferência de controle
Esta parte inclui:
- instrução de transferência incondicional: JMP;
- instrução de transferência condicional: JCC, JCXZ;
- instrução de loop: LOOP, LOOPE, LOOPNE;
- instrução de chamada de procedimento: CALL;
- instrução de retorno de subprocedimento: RET;
- instrução de interrupção: INTn, INT3, INTO, IRET e assim por diante.
Manipulação de strings
Esta parte das instruções é usada para operar a cadeia de dados, incluindo:
- a instrução de transferência de cadeia: MOVS;
- a instrução de comparação da cadeia: CMPS;
- a instrução de varredura da cadeia: SCANS;
- a instrução de gravação da cadeia: STOS;
- a instrução de carregamento da cadeia: LODS.
entrada Saída
Esta parte das instruções é utilizada para trocar dados com dispositivos periféricos, incluindo instruções de entrada de porta IN/INS e instruções de saída de porta OUT/OUTS.
Exemplo de linguagem assembly
Aqui está um programa simples em linguagem assembly que somará dois números:
; add.asm
;
; This program adds two numbers together
;
section .data
; These are the two numbers we will be adding
; We must store them in memory so the CPU can access them
num1: dw 1234
num2: dw 5678
section .text
; This is the code section of the program
; The code is a set of instructions for the CPU to execute
global _start
_start:
; Load the two numbers into registers
mov eax, [num1]
mov ebx, [num2]
; Add the numbers together
add eax, ebx
; Store the result in the num1 memory location
mov [num1], eax
; Exit the program
mov eax, 1
int 0x80
Características da linguagem assembly
1. dependência da máquina
Esta é uma linguagem de baixo nível orientada para máquinas, normalmente concebida para um computador específico ou família de computadores. Por ser uma representação simbólica das instruções da máquina, diferentes máquinas têm diferentes linguagens de montagem.
2. Alta velocidade e alta eficiência
A linguagem assembly mantém as vantagens da linguagem de máquina e tem as características de objetividade e simplicidade. Ela pode acessar e controlar efetivamente vários dispositivos de hardware do computador, como discos, memória, CPU, portas de E/S, etc., e ocupa menos memória e tem velocidade de execução rápida. É uma linguagem de programação eficiente.
3. A complexidade da escrita e da depuração
Como o hardware é controlado diretamente e tarefas simples também exigem muitas instruções em linguagem assembly, é necessário cobrir todos os aspectos ao projetar programas. Todos os problemas possíveis precisam ser considerados, e vários recursos de software e hardware devem ser alocados e usados de forma razoável. Dessa forma, isso inevitavelmente aumentará a carga sobre o programador. Da mesma forma, ao depurar um programa, uma vez que haja um problema com a operação do programa, é difícil descobrir.
Vantagens
Como linguagem de programação de segunda geração acima da linguagem de máquina, a linguagem assembly também tem muitas vantagens:
- Pode ler facilmente o estado da memória e o estado da interface de E/S do hardware.
- O código escrito pode ser executado com precisão, pois há muito menos links de compilação.
- Como linguagem de baixo nível, é altamente extensível.
Desvantagens
- Como o código é muito monótono e há poucos caracteres de instrução especiais, ele se torna prolixo e difícil de escrever.
- Como a montagem ainda precisa chamar a memória para armazenar os dados por conta própria, é fácil ter bugs e não é fácil depurar.
- Mesmo que um programa seja concluído, levará muito tempo para mantê-lo posteriormente.
- Devido à particularidade da máquina, ocorre o defeito de baixa compatibilidade do código.
Linguagem de montagem vs. linguagem de máquina
A principal diferença entre a linguagem assembly e a linguagem de máquina é que a linguagem assembly é uma linguagem de programação de baixo nível que requer um assembler separado para traduzi-la em código de máquina, enquanto a linguagem de máquina é uma representação direta do código de máquina subjacente.
A linguagem assembly é mais legível para humanos do que a linguagem de máquina, mas ainda é bastante difícil de ler e escrever. Ela foi projetada para ser próxima do código de máquina nativo, facilitando para o programador entender o que o código está fazendo. No entanto, isso também torna mais difícil escrever código portátil, uma vez que o código está intimamente ligado à arquitetura específica da máquina.
A linguagem de máquina, por outro lado, é o código nativo da máquina e não é legível por humanos. Ela é executada diretamente pelo processador e, portanto, é mais eficiente do que a linguagem assembly. No entanto, é muito mais difícil programar nela, pois o programador precisa lidar com as instruções do código de máquina subjacente.
Recursos para aprender linguagem assembly
Se você quiser aprender mais sobre linguagem assembly, há muitos recursos diferentes à sua disposição. Você pode encontrar livros sobre linguagem assembly na Amazon e em livrarias locais. Você também pode encontrar cursos online em sites como Coursera, edX e Udemy. Se você quiser aprender mais sobre arquitetura de computadores, também há muitos livros sobre esse assunto. Esses recursos podem ajudá-lo a entender o que é linguagem assembly e suas implicações no design de hardware e software de computadores.



