Este documento está em construção
Com o objetivo de criar um SDK em assembly voltado pra retro
computação usando como base o estilo de código do NASM,
facilitando a migração de novos usuários que vem do x86 para
processadores 8 bits.
| Ferramenta |
Descrição |
| HC Assembler |
Assembler com estrutura e estilo de código
baseado no NASM |
| HC Linker | Vinculador de objetos e gerador de
executáveis a partir de objetos e bibliotecas |
| HC Builder |
Gestor de Projetos, responsável por compilar
e limpar arquivos de saída do projeto |
| HC Librarian |
Gestor de Bibliotecas, que são conjuntos de
objetos que podem ser referenciados por um projeto |
| Download
para navegadores que não suportam javascript |
| Instalador para
Windows (Intel 64 bits) |
| Conjunto de binários para Windows (Intel 64 bits) |
| Pacote para
instalação em Debian/Ubuntu ou compatíveis (Intel 64 bits) |
| Conjunto de binários para Linux (Intel 64 bits) |
| Instalador para
macOS (Intel 64 bits/Apple Silicon) |
| Conjunto de binários para macOS (Intel 64 bits/Apple Silicon) |
| Download para navegadores que suportam javascript |
| Última
versão diretamente do GitHub |
Assembler compatível com o estilo do NASM.
O código fonte em assembly é composto por alguns blocos de
informações distintos:
Todos os tópicos listados acima serão explicados com mais
detalhes posteriormente
Exemplo:
| ; comentário, ao final de qualquer linha de
código é aceito comentário cujo a identificação é o seu
caractere inicial ponto e virgula ';' seguido por texto
livre até o final da linha atual mov ax, bx ; exemplo de mnemônico (comando da CPU) e seus argumentos xpto: ; exemplo de rótulo simples com comentário (este) xpto2: mov bx, cx ; exemplo de rótulo com comando mnemônico (podendo ser um comando do assembler) e comentário db 0, 1, 2 ; exemplo de comando do assembler, em sintaxe é idêntico a um comando mnemônico |
Para cada arquitetura suportada é disponibilizado um executável
do assembler, com o nome iniciado em "hcasm-" seguido do
processador suportado.
Exemplo para compilar um código para Z80 (arquivo.s) em um objeto
(arquivo.obj):
| hcasm-z80 -o arquivo.obj arquivo.s |
Existem 2 tipos de rótulos:
Opcionalmente para melhor identificação, a definição de um rótulo
pode ser seguido do caractere ':' como marcador separador entre o
rótulo e o próximo comando do tipo mnemônico/assembler, porém no
caso do uso do nome de rótulo como uma referência a um rótulo
existente, é vedado o uso do caractere ':'.
Qualquer rótulo que não esteja presente no arquivo atual porem
seja referenciado nele, será automaticamente considerado como se
viesse de outro objeto, e será tratado pelo HC Linker.
Exemplo (Código Intel 8086/8088):
| global primario1
; exporta o rótulo primario1 para uso em outros objetos,
será tratada as suas referencias automaticamente pelo HC
Linker primario1: ; este é um rótulo primario .secundario1: ; este é um rótulo fica dentro do primario1, podendo ser acessado dentro do primario1 pelo seu nome direto (.secundario1) ou de fora do rotulo primario1 usando o nome composto de primario1.secundario1primario2: ; este é o segundo rótulo primário do arquivo, a partir daqui todos os rótulos secundários dos rótulos primários anteriores deixam de ser acessíveis com seus nomes diretos .xpto: ; este rótulo é o primeiro rótulo secundário de dentro do primario2, podendo ser acessível como .xpto de dentro do primario2 ou primario2.xpto de qualquer parte do arquivo |
Toda constante é declarada como um rótulo, seguindo as mesmas
regras destes. (Ver Rótulos)
O que diferencia um rótulo de uma constante é que ao invés de
conter o ponteiro para aquela posição no código fonte/binário,
contém um valor pré-definido.
As constantes podem tanto ser nós secundários como primários de
outras constantes ou rótulos, não havendo distinção de seu uso em
código fonte, porém as constantes não são suscetíveis ao calculo
de realocação, sendo úteis para referencias fixas na memória.
Para declara uma constante basta, declarar um rótulo e na mesma
linha a seguir do rótulo usar o marcador 'equ' seguido da equação
desejada.
Exemplo:
estrutura_pessoa: equ
11 ; sugestão de uso: o rotulo primario como
estrutura, contendo o tamanho da estrutura.nome: equ 0 ; sugestão de uso: no caso de uma estrutura os campos contém o seu desvio a partir do inicio da estrutura, por exemplo o campo nome, é o primeiro campo, assim contém o desvio de 0 bytessection data ; define que o código a partir dessa linha pertence a seção de dados obj_pessoa: resb estrutura_pessoa ; exemplo da reserva do objeto do tipo estrutura_pessoa, utilizando a constante que armazena o tamanho da estrutura section text ; define que o código a partir dessa linha pertence a seção de texto(código fonte) mov si, obj_pessoa ; exemplo de uso indireto dos campos mov al, [si + estrutura_pessoa.idade] ; exemplo de leitura de um campo indireto, usando um ponteiro (registrador SI) mov al, [obj_pessoa + estrutura_pessoa.idade ; exemplo da leitura do campo diretamente sem uso de ponteiros |