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.