Fran Gallego:
include hace lo que todos los includes hacen en cualquier lenguaje
es lo mismo que si copiaras y pegaras el archivo que incluyes
Pero es que eso es idéntico en C y en C++
Por eso, se usa para incluir sólo declaraciones, no definiciones
Como en C
no pones en los ficheros de cabecera definiciones
sólo declaraciones
El concepto es el mismo
Todos los ficheros se compilan siempre por separado
ningún fichero sabe nada de que existan otros ficheros
Entonces, cuando quieres usar un símbolo que está en otro fichero
simplemente en el fichero que lo vas a usar, lo declaras
Para que el ensamblador sepa que ese símbolo existe, aunque no sepa cuánto vale
Es después, cuando el linker recoge todos los ficheros compilados intermedios y los junta
cuando mira dónde está cada símbolo
Si tienes dos ficheros F1 y F2
Con esta estructura de símbolos
F1
etiqueta1::
etiqueta2::
F2
otra1::
otra2::
F1 y F2 se ensamblan por separado, individualmente
ninguno sabe de la existencia del otro
Así que si quieres que F1 pueda usar la etiqueta "otra2", por ejemplo
harías esto
F1
.globl otra2
etiqueta1::
etiqueta2::
F2
otra1::
otra2::
Simplemente, le dices al ensamblador "existe un símbolo otra2, que es global"
Y lo usas
como lo que haces con las llamadas a las funciones de CPCtelera
que son etiquetas, que no están en tu código
Si ahora resulta que tienes una etiqueta "cpct_doGame", que vas a usar tanto en F1 como F2
harías esto
F1
.globl cpct_doGame
etiqueta1::
etiqueta2::
F2
.globl cpct_doGame
otra1::
otra2::
Pero eso ya es duplicar código
mientras sólo sea una etiqueta vale
pero si ahora resulta que quieres usar 4 símbolos en ambos ficheros, la cosa crece
F1
.globl cpct_doGame_1
.globl cpct_doGame_2
.globl cpct_doGame_3
.globl cpct_doGame_4
etiqueta1::
etiqueta2::
F2
.globl cpct_doGame_1
.globl cpct_doGame_2
.globl cpct_doGame_3
.globl cpct_doGame_4
otra1::
otra2::
Y si tienes que hacer lo mismo en 5 ficheros, va siendo más feo
y si luego necesitas en los 5 ficheros, añadir un símbolo nuevo
te toca acordarte de todos los ficheros y editarlos uno a uno
Para evitar hacer eso
creas un tercer fichero
Un fichero de cabecera
Y haces esto
FH
.globl cpct_doGame_1
.globl cpct_doGame_2
.globl cpct_doGame_3
.globl cpct_doGame_4
.globl cpct_doGame_5
F1
.include "FH"
etiqueta1::
etiqueta2::
F2
.include "FH"
otra1::
otra2::
Eso es exactamente igual que haberlo escrito en los ficheros F1 y F2
Pero la ventaja es que sólo lo escribes en un sitio y cuando lo edites lo cambias para todos los que necesitan esas declaraciones
Así puedes tener 20 ficheros que incluyan FH
y en ninguno de ellos incurres en ningún coste
es lo mismo que haberlo escrito en los 20
totalmente igual, pero más práctico
cuidado, eso sí
no pongas en FH nada que no sean directivas, como has visto
Las directivas .globl
Sólo son información para el programa ensamblador
no generan bytes en el binario resultante
no existen en código máquina
sólo es información para el ensamblador para saber cosas sobre sus símbolos, mientras ensambla
Si metes código o bytes en un fichero del que luego hagas include
como lo estás duplicando en todas partes donde haces include
en todas ellas se generará ese código o bytes
por eso hay que saber usarlo, y entender el proceso, como te cuento ahora
Porque include es eso
un copy/paste automatizado