- Global con inicialización (int a=100;)
- Se reserva doble espacio (en RAM y ROM. RAM contiene la variable, ROM el valor inicial, 100. En nuestro caso, ambos en RAM realmente).
- La variable no se inicializa, porque el código que copia los valores ROM a RAM está eliminado en CPCtelera (no tiene sentido para juegos en RAM).
- El valor inicial de la variable es 0, ya que su espacio es estático, por tanto existe en el fichero binario y debe tener un valor ahí que es copiado a memoria junto a todo el binario. Esto es así para todas las variables globales/estáticas.
- Global sin inicialización (int x;) y posterior inicialización, por ejemplo, dentro de main (x = 100;)
- Se reserva un espacio único en memoria (RAM). Al no haber valor inicial, este no debe ser almacenado en ROM.
- El valor inicial de la variable es 0, dado que es estática (está en el binario).
- Importante tener en cuenta que X = 100; en el main ocupa espacio (código) y es normalmente más que el que ocupa la variable.
- Constante global con inicialización (const int x = 100;)
- Se reserva un espacio único en memoria (ROM según SDCC, aunque en este caso, será RAM en Amstrad).
- El valor inicial de la constante es 100. No es necesario tener copia en RAM porque, al ser constante, no se espera que cambie. Por eso sólo se crea un valor.
- Para modificar su valor hay que hacerlo con un poco de maña (a través de un puntero no constante a esa zona de memoria, o de cualquier otra forma que permita acceder a esa zona de RAM y cambiarla).
- Constante global sin inicialización (const int x;)
- Idéntico al caso anterior, sólo que el valor sería 0.
- No sé si el compilador te dejará. Debería quejarse, porque las constantes es obligatorio inicializarlas.
Ejemplo:
Código: Seleccionar todo
#include <cpctelera.h>
#include <stdio.h>
// SDCC sólo deja ensamblador inline dentro de una función
// Así que creamos una función __naked para que el código compile.
// Esta función sólo producirá una etiqueta (_dummy_function::) en ensamblador
// por lo que no nos generará nada de código adicional
void dummy_function() __naked {
__asm
;; Definimos una variable entera (int, 16 bits) y asignamos un valor
;; Los identificadores en C se convierten en etiquetas con un subrayado delante "_"
;; al ser compilados a ensamblador
_x:: .dw #0x1234
__endasm;
}
// Declaramos en C la existencia de la variable x, indicándole al
// compilador que no debe definirla (crear el espacio), sino sólo
// utilizarla porque ya existe y está definida en otro sitio (extern)
extern int x;
void main(void) {
// Usamos la variable X en lo que queramos, con normalidad
printf("My variable X vale %d\r\n", x);
while(1);
}