Considere um programa composto pelos seguintes módulos:
typedef struct {
char cc;
int ci;
} St;
extern St dados[];
#include "dados.h"
St dados[3] = {{1,10}, {0,20}, {1,15}};
#include <stdio.h>
#include "dados.h"
int main() {
int i;
St *p = dados;
int max = 0;
for (i = 0; i <3; i++) {
if (p->cc && p->ci > max)
max = p->ci;
p++;
}
printf("%d\n",max);
return 0;
}
dados.c
e main.c e produz o executável
prog, que reúne código e dados definidos nesses
dois módulos.
gcc -o prog dados.c main.cExecute o programa gerado, verificando seu resultado.
Repare que o array dados (global) é declarado em um módulo
(dados.c) e referenciado em outro (main.c).
Essa "referência externa" do módulo main.c é resolvida
durante o processo de linkedição (ou amarração)
responsável pela geração do arquivo executável.
Traduza agora para assembly o módulo main.c,
criando um arquivo mainasm.s.
Note que, assim como o módulo C, seu módulo assembly pode conter
uma "referência externa" para o símbolo dados!
Use o comando abaixo para gerar o novo executável:
gcc -o prog2 dados.c mainasm.s
Execute o novo programa, e verifique se o resultado é igual ao obtido antes.