assembly
está em um arquivo separado da função main
, mas de alguma maneira mágica a função pode ser executada e seu retorno capturado. Isso acontece graças a uma ferramenta chamada linker que junta vários arquivos objetos em um arquivo executável de saída..text
-- Usada para armazenar o código executável do nosso programa..data
-- Usada para armazenar dados inicializados do programa, por exemplo uma variável global..bss
-- Usada para reservar espaço para dados não-inicializados, por exemplo uma variável global que foi declarada mas não teve um valor inicial definido..rodata
ou .rdata
-- Usada para armazenar dados que sejam somente leitura (readonly), por exemplo uma constante que não deve ter seu valor alterado em tempo de execução.read
-- Dá permissão de leitura para a seção.write
-- Dá permissão de escrita para a seção, assim o código executado pode escrever dados nela.exec
-- Dá permissão de executar os dados contidos na seção como código..outra
não tem nenhuma permissão padrão definida por não ser nenhum dos nomes padronizados.global
do NASM serve justamente para definir que aquele rótulo é global... Ou seja, que deve ser possível acessá-lo a partir de outros arquivos objetos.assembly
. O linker então se encarrega de procurar por esse símbolo, e ele acaba o achando no assembly.o. Ao achar o linker calcula o endereço para aquele símbolo e seja lá aonde ele foi utilizado em main.o o linker irá colocar o endereço correto.assembly
.