Este livro fornece uma introdução suave à programação em linguagem assembly. O que torna esta introdução “suave” é que ela pressupõe que o leitor já esteja confortável com a codificação C ou C++. Usamos esse conhecimento assumido para fazer uma ponte para o ISA (Instruction Set Architecture) de baixo nível.
Dirigimos para casa um ponto muito agudo:
A linguagem assembly não é nada para se temer!Conforme mencionado, se você já está familiarizado com C (ou linguagens descendentes de C, como C++), este livro começa com o que você já sabe.
Os capítulos posteriores se aprofundam nos cantos e recantos do ARM V8 ISA e são adequados para aqueles que desejam dominar o rico conjunto de instruções dos processadores ARM de 64 bits.
Sim, absolutamente.
A programação em linguagem assembly depende bastante da arquitetura de hardware subjacente. O ambiente operacional host desempenha um papel descomunal na determinação de como os programas em linguagem assembly são construídos. Uma "convenção de chamada" refere-se a como as funções são chamadas e como os parâmetros são passados.
Originalmente, este livro ensinava apenas as convenções ARM LINUX. No entanto, com o tempo, desenvolvemos um conjunto de macros que torna muito mais fácil escrever código para uso no MacOS ou no LINUX.
Este link levará a uma cópia atual deles, bem como à documentação. Macros que tornam a programação um pouco mais fácil também estão incluídas.
Este capítulo fornece algumas informações adicionais sobre a programação em linguagem assembly do Apple Silicon.
Você notará que usamos o tempo de execução C diretamente, em vez de fazer chamadas ao sistema operacional. Então, por exemplo, se quisermos chamar write()
, chamamos write
da linguagem assembly.
Esta versão da write
de chamada do sistema é uma função wrapper incorporada ao tempo de execução C (CRT) que lida com os detalhes de nível inferior da execução de uma chamada do sistema. Veja aqui o que realmente acontece dentro dessas funções wrapper.
A vantagem de usar os wrappers CRT é que existem diferenças entre as distribuições e arquiteturas que são mascaradas pelo uso dos wrappers CRT. Portanto, quando você usa os wrappers em vez do método direto de fazer chamadas do sistema, seu código será mais portátil.
Por mais louváveis que sejam os designs do ARM, as convenções de nomenclatura do ARM para suas propriedades intelectuais são horríveis. Neste livro, AARCH64 e ARM V8 são considerados sinônimos da arquitetura de conjunto de instruções ARM (ISA) de 64 bits.
É muito difícil encontrar documentação no site ARM porque eles possuem tantas versões , tantos nomes para a mesma coisa e tanta documentação em geral. Realmente pode ser enlouquecedor.
Dentro do texto forneceremos links pertinentes conforme apropriado.
Aqui está um link para a página principal do conjunto de instruções "a".
Obter as ferramentas para o desenvolvimento da linguagem assembly é bastante simples - talvez você já as tenha. Usando apt
no terminal Linux, diga:
sudo apt update
sudo apt install build-essential gdb
No tipo Macintosh:
xcode-select --install
em um terminal e siga as instruções. Observe que gdb
foi substituído por lldb
com diferenças suficientes para fazer você chorar.
Então você precisará do seu editor favorito. Nós mesmos usamos vi
para edições rápidas e o Visual Studio Code para qualquer trabalho pesado.
Usamos gcc
, o "compilador" C. g++
também pode ser usado. No Mac, clang
também pode ser usado.
Que sentido isso faz... usar o "compilador" para "compilar" a linguagem assembly?
Bem, para responder a isso é preciso entender que a palavra “compilador” se refere a apenas uma etapa em uma sequência de construção. O que chamamos de "compilador" é na verdade um guarda-chuva que inclui:
Um pré-processador que atua em qualquer #
comando do pré-processador como #include
. Esses comandos não fazem parte de C ou C++. Em vez disso, são comandos para o pré-processador.
Observe que gcc
invocará o pré-processador C se o seu arquivo de linguagem assembly terminar em .S
- S maiúsculo. Ele pode ou não ser invocado se o seu arquivo terminar em s minúsculo ou qualquer outra extensão de arquivo dependendo do seu sistema.
O compilador real , cuja função é transformar linguagens de alto nível, como C e C++, em linguagem assembly.
O assembler, que transforma a linguagem assembly em código de máquina que ainda não está pronto para execução.
E, finalmente, o vinculador, que combina potencialmente muitos arquivos de código de máquina intermediários (chamados de arquivos objeto), potencialmente muitos arquivos de biblioteca (.dlls vinculados estaticamente no Windows e arquivos .a no Linux). O linker é a última etapa desta cadeia.
Aqui está um vídeo explicando esse processo.
Usamos gcc e g++ diretamente porque, sendo guarda-chuvas, eles automatizam as etapas acima e se vinculam automaticamente ao CRT.
Suponha que você implementou main()
em um arquivo C (main.c) e deseja usar um arquivo de linguagem assembly que você escreveu (asm.S). Isso pode ser feito de várias maneiras.
gcc main.c asm.S
Isso é tudo que você precisa para uma construção mínima. O programa resultante será gravado em a.out
. Todos os arquivos intermediários gerados serão removidos.
gcc -c main.c
gcc -c asm.S
gcc main.o asm.o
Usados desta forma, os arquivos .o
são deixados no disco. Usando o método anterior, os arquivos .o
são removidos sem que você os veja.
Suponha que main()
seja implementado em linguagem assembly e main.s
seja independente, então simplesmente:
gcc main.S
Freqüentemente, você desejará habilitar o depurador gdb
ou lldb
. Faça isso:
gcc -g main.S
Sem a opção de linha de comando -g
, seu depurador pode não funcionar corretamente.
Para repetir, se você deseja que gcc
execute seu código através do pré-processador C (para entregar #include
por exemplo), nomeie seus arquivos de código-fonte em linguagem assembly com S maiúsculo. Então, no Linux:
gcc main.s
Não passará pelo pré-processador C, mas
gcc main.S
vai.
Para deixar claro que o "compilador" é um guarda-chuva, usar o gcc para "compilar" um programa faz com que o seguinte seja chamado no Ubuntu rodando em ARM:
/usr/bin/cpp
/usr/lib/gcc/aarch64-linux-gnu/11/cc1
/usr/bin/as
/usr/lib/gcc/aarch64-linux-gnu/11/collect2 which is...
/usr/bin/ld
cpp
é o pré-processador C - é uma ferramenta geral que também pode ser usada por outras linguagens (C++, por exemplo).
cc1
é o compilador real.
as
o montador.
ld
é o vinculador.
Você pode ver por que usamos o comando guarda-chuva por padrão neste livro.
Começamos fornecendo o que chamamos de "ponte" de C e C++ para a linguagem assembly. Usamos o conhecimento que você já possui para aprender novos conhecimentos - que legal isso!
Capítulo | Remarcação | |
---|---|---|
0 | Início rápido | Link |
1 | Olá mundo | Link |
2 | Se declarações | Link |
3 | Laços | |
3a | Enquanto Loops | Link |
3b | Para loops | Link |
3c | Implementação Continuar | Link |
3d | Implementando Pausa | Link |
4 | Interlúdios | |
4a | Registros | Link |
4b | Carregar e armazenar | Link |
4c | Mais sobre ldr | Link |
4d | Cadastrar Tamanhos | Link |
4e | Hexadecimal | Link |
5 | switch | Link |
6 | Funções | |
6a | Ligando e retornando | Link |
6b | Passando Parâmetros | Link |
6c | Exemplo de chamada de algumas funções comuns de tempo de execução C | Link |
7 | FizzBuzz - um programa completo | Link |
8 | Estruturas | |
8a | Alinhamento | Link |
8b | Definindo | Link |
8c | Usando | Link |
8d | O que é isso" | Link |
9 | const | Link |
As operações de ponto flutuante usam suas próprias instruções e seu próprio conjunto de registradores. Portanto, as operações de ponto flutuante são abordadas em sua própria seção:
Capítulo | Remarcação | |
---|---|---|
0 | Visão geral do capítulo | Link |
1 | O que são números de ponto flutuante? | Link |
2 | Registros | Link |
3 | Truncamento e arredondamento | Link |
4 | Literais | Link |
5 | fmov | Link |
6 | Flutuadores de meia precisão | Link |
7 | NEON SIMD ainda não escrito | Link |
O que seria um livro sobre linguagem assembly sem críticas?
Capítulo | Remarcação | |
---|---|---|
1 | Campos de bits | |
1a | Sem campos de bits | Link |
1b | Com campos de bits | Link |
1c | Revisão das instruções recentemente descritas | Link |
2 | Endianismo | Link |
Nesta seção, apresentamos diversos materiais, incluindo nossa "palestra mundialmente famosa" sobre depuração. Esta palestra foi convidada em diversas faculdades e universidades. Destina-se ao público que trabalha com linguagens como C, C++ e linguagem assembly, mas algumas das lições nele contidas são aplicáveis a todas as linguagens.
Capítulo | Remarcação | |
---|---|---|
1 | Silício da Apple | Link |
2 | Convergência Apple/Linux | Link |
3 | Funções Variádicas | Link |
4 | Nos bastidores: chamadas do sistema | Link |
5 | Determinando comprimentos literais de string para funções C | Link |
6 | Chamando linguagem assembly de Python | Link |
7 | Operações Atômicas | Link |
8 | Tabelas de salto | Link |
9 | argumento | CÓDIGO ASM |
10 | bloqueios giratórios | Link |
- | Palestra de depuração | PPTX |
Conforme indicado imediatamente acima, o conjunto de macros pode ser encontrado aqui.
Aqui estão algumas especificações do projeto para oferecer um desafio ao seu domínio crescente. Aqui estão descrições muito breves apresentadas em ordem alfabética.
Talvez antes de abordar isso, verifique primeiro o programa FIZZBUZZ totalmente descrito.
Então tente isso como seu primeiro projeto. Com algumas linhas em branco e comentários, pesa 35 linhas.
O projeto DIRENT demonstra como uma struct
complexa pode ser usada em linguagem assembly.
O projeto PI demonstra instruções de ponto flutuante. O programa irá "lançar dardos em um alvo", calculando uma aproximação do PI rastreando quantos dardos "atingiram o alvo" versus o número total de dardos "lançados".
O projeto SINE enfatiza matemática e funções de ponto flutuante.
O projeto SNOW usa tecnologia da década de 1970 para animar um sistema simples de partículas. Este projeto demonstra um processo de design razoável para dividir problemas complexos em partes mais simples.
O WALKIES apresenta uma pequena animação demonstrando looping com alguma desreferenciação de ponteiro.
A carreira de Perry Kivolowitz nas Ciências da Computação se estende por pouco menos de cinco décadas. Lançou mais de 5 empresas, principalmente relacionadas com hardware, processamento de imagem e efeitos visuais (para cinema e televisão). Perry recebeu o reconhecimento do Emmy por seu trabalho em The Gathering, o episódio piloto de Babylon 5. Mais tarde, ele recebeu um prêmio Emmy de Engenharia junto com seus colegas da SilhouetteFX, LLC. SilhouetteFX é usado em quase todos os filmes importantes para rotoscopia, pintura, rastreamento, reconstrução 2D para 3D, composição e muito mais.
Em 1996, Perry recebeu um Oscar de Realização Científica e Técnica por sua invenção do Shape Driven Warping and Morphing. Esta é a técnica responsável por muitos dos famosos efeitos de Forrest Gump, Titanic e Stargate.
Vinte e vinte e três marcam o 19º ano de Perry ensinando Ciência da Computação em nível universitário, dez anos na UW Madison e agora 8+ no Carthage College.
A linguagem assembly é uma paixão para Perry, tendo trabalhado nos seguintes ISAs (em ordem cronológica):
Univac 1100
Corporação de Equipamentos Digitais PDP-11
Corporação de Equipamentos Digitais VAX-11
Motorola 68000
ARM começando com AARCH64
Este trabalho é dedicado à minha esposa Sara e aos filhos Ian e Evan.
Perry criou uma biblioteca com cerca de 200 projetos de programação adequados para aulas de CS 1, CS 2, Estruturas de Dados, Redes, Sistemas Operacionais e Organização de Computadores. Se uma editora de livros didáticos de CS (ou outro conteúdo relacionado a CS) estiver interessada em comprar a biblioteca, entre em contato.
Além disso, confira Get Off My L@wn, um romance de zumbis para programadores.
Você leu certo... o programador de elite Doug Handsman se aposenta para morar no norte de Wisconsin, terra natal de sua esposa Ruth Ann. E então, bem, o apocalipse acontece. Desapontamento.
Avaliado com 4,3 de 5, com mais de 70 avaliações, é uma leitura divertida e custa quase nada.