domingo, 11 de octubre de 2020

Includes en cpctelera

 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

No hay comentarios:

Publicar un comentario