section
seguido do nome que você quer dar para a seção e os atributos que você quer definir para ela. As seções .text
, .data
, .rodata
e .bss
já tem seus atributos padrões definidos e por isso não precisamos defini-los..text
e por isso nós não a definimos na nossa PoC. Mas poderíamos reescrever nossa PoC desta vez especificando a seção:.text
, que é destinada ao código executável do programa e por padrão tem o atributo de execução (exec) habilitado pelo NASM.global
. Podemos exportar mais de um símbolo de uma vez separando cada nome de rótulo por vírgula, exemplo:extern
que serve para declarar no arquivo objeto que estamos acessando um símbolo que está em outro arquivo objeto.assembly
que estava em um arquivo externo. A diretiva extern
serve para inserir essa informação na tabela de símbolos do arquivo objeto de saída. A diretiva extern
segue a mesma sintaxe de global
:number
e no arquivo assembly.asm usamos a diretiva extern
na linha 2 para declarar o acesso ao símbolo number
, que chamamos na linha 8..data
ou .bss
. A seção .data
do executável nada mais é que uma cópia dos dados contidos na seção .data
do arquivo binário. Ou seja o que despejarmos de dados em .data
será copiado para a memória RAM e será acessível em tempo de execução e com permissão de escrita.db
e semelhantes. Cada uma despejando um tamanho diferente de dados mas todas tendo a mesma sintaxe de separar cada valor numérico por vírgula. Veja a tabela:dt, do, dy e dz
não suportam que seja passado uma string como valor..data
e acessar ela a partir do código fonte em C, bem como também no próprio código em Assembly. Exemplo:extern
para especificar que a variável global myVar
estaria em outro arquivo objeto, comportamento muito parecido com a diretiva extern
do NASM..bss
é usada para armazenar variáveis não-inicializadas, isto é, que não tem um valor inicial definido. Basicamente essa seção no arquivo objeto tem um tamanho definido para ser alocada pelo sistema operacional em memória mas não um conteúdo explícito copiado do arquivo binário.resb
e suas semelhantes que seguem a mesma premissa de db
. Os tamanhos disponíveis de dados são os mesmos de db
por isso não vou repetir a tabela aqui. Só ressaltando que a última letra da pseudo-instrução indica o tamanho do dado. A sintaxe da pseudo-instrução é:equ
:.rodata
. Essa seção é muito parecida com .data
com a diferença de não ter permissão de escrita. Exemplo:$
serve como um atalho para se referir ao endereço da linha de código atual, algo equivalente a declarar um rótulo como abaixo:$
seria equivalente a declarar um rótulo no início da seção, como em:$
:$
é equivalente ao endereço do início do binário.