%
e dão um poder absurdo para a programação diretamente em Assembly no nasm. Abaixo irei listar as mais básicas e o seu uso.#define
do C, essa diretiva é usada para definir macros de uma única linha. Seja lá aonde o nome do macro for citado no código fonte ele expandirá para exatamente o conteúdo que você definiu para ele como se você estivesse fazendo uma cópia.mov eax, 31
como se tivesse feito uma cópia do valor definido para o macro. Podemos também é claro escrever um macro como parte de uma instrução, por exemplo:mov eax, [ebx*2 + 4]
mov eax, [ebx*2 + 4]
.
A linha 3 irá expandir para: mov eax, [esi*2 + 4]
.%define
.%endmacro
sinaliza o final do macro e todas as instruções inseridas entre as duas diretivas serão expandidas quando o macro for citado.%define
, ao invés do uso de parênteses o macro recebe argumentos seguindo a mesma sintaxe de uma instrução e separando cada um dos argumentos por vírgula. Para usar o argumento dentro do macro basta usar %n
, onde n seria o número do argumento que começa contando em 1.+
ao número de argumentos. Por exemplo:mov esi, edi, edx
, o que está errado.%%
. Exemplo:%macro
. O número de argumentos especificado deve ser o mesmo utilizado na hora de declarar o macro.%if
só é compilado se a condição for atendida. Caso não seja é possível usar a diretiva %elif
para fazer o teste de uma nova condição. Enquanto o código na diretiva %else
é expandido caso nenhuma das condições anteriormente testadas sejam atendidas. Por fim é usado a diretiva %endif
para indicar o fim da diretiva %if
.%if
e %elif
uma expressão matemática afim de testar o resultado de um cálculo com uma constante ou algo semelhante. Se o valor for diferente de zero a expressão será considerada verdadeira e o bloco de código será expandido no código de saída.%if
básico também podemos usar variantes que verificam por uma condição específica ao invés de receber uma expressão e testar seu resultado.%define
anteriormente. É possível também usar essas diretivas em forma de negação adicionando o 'n' após o 'if'. Ficando: %ifndef
e %elifndef
, respectivamente.%ifdef
porém para macros de múltiplas linhas declarados por %macro
. E da mesma que as diretivas anteriores também têm suas versões em negação: %ifnmacro
e %elifnmacro
.%error
imprime a mensagem como um erro e finaliza a compilação, enquanto %warning
emite a mensagem como um alerta e a compilação continua normalmente. Podemos por exemplo acusar um erro caso um determinado macro necessário para o código não esteja definido:#include
da linguagem C e ela faz exatamente a mesma coisa: Copia o conteúdo do arquivo passado como argumento para o exato local aonde ela foi utilizada no arquivo fonte. Seria como você manualmente abrir o arquivo, copiar todo o conteúdo dele e depois colar no código fonte.#include
na linguagem C é importante usar as diretivas condicionais para evitar a inclusão duplicada de um mesmo arquivo. Por exemplo:_ARQUIVO_ASM
será declarado. Se ele for incluído mais uma vez o macro já estará declarado e o %ifndef
da linha 1 terá uma condição falsa e portanto não expandirá o conteúdo dentro de sua diretiva.