Pregunta sobre almacenamiento de datos

Si eres principiante y tienes alguna consulta entra en este foro.
Responder
Mensaje
Autor
guillero
Mensajes: 23
Registrado: 01/04/2019 11:28 am

Pregunta sobre almacenamiento de datos

#1 Mensaje por guillero » 13/05/2019 4:22 pm

Hola a todos. Soy nuevo en C (vengo de programación de NES). Ya los he molestado con algunas preguntas, y ahora tengo otra duda. Consideremos esta simplísima subrutina escrita en Assembly de 6502, el lenguaje de NES. Lo que hace es elegir el número de tema musical (bgm) para el nivel en el que se está. Se usan las variables "nivel" y "bgm" que son los bytes $20 y $21 de la ram, respectivamente. Lo que está después de ";" es un comentario y el símbolo "$" significa hexadecimal.

Código: Seleccionar todo

nivel	.equ $20    ;nombre que le asigno al byte $20 de la ram (variable "nivel")
bgm .equ $21    ;nombre que le asigno al byte $21 de la ram (variable "bgm")
.org $8000

LDX nivel           ;toma como índice el número de nivel actual, almacenado en el byte $20 de la ram (el valor viene de otro algoritmo)
LDA databgm,x  ;toma el número de tema musical del arreglo ‘databgm’, según el índice 
STA bgm           ;lo coloca en bgm (byte $21 de la ram)
RTS                  ;fin de la subrutina

databgm                   ;etiqueta para que el compilador ubique la dirección del siguiente arreglo
.db 4,5,0,3,1,7,2,6   ;almacena en la rom, a continuación de la subrutina, el arreglo con los números de temas musicales
Como se ve en el ejemplo, databgm es leída de la rom (que va insertada en la tarjeta de memoria del sistema).

Código de máquina producido por el compilador, mostrado en hexadecimal:
A6 20
BD 08 80
85 21
60
04 05 00 03 01 07 02 06

Como dije recién estoy empezando en C. Si entiendo bien, en dicho lenguaje la manera de crear los datos de databgm sería hacer un conjunto de variables (un arreglo) con los ocho números, con lo que se reservarían 8 bytes en la ram para almacenar sus valores.
Mi duda es: si son datos que nunca se van a modificar, que solo van a ser leídos, ¿no se pueden declarar como datos dentro del código de máquina, para ser leídos directamente de ahí, como lo hago en NES? Para no gastar tiempo y ram creando variables en la ram.
Como lo hace, por ejemplo:

printf("hola");
que saca la cadena de caracteres del código del programa, no de variables.
Última edición por mollok el 14/05/2019 6:18 am, editado 1 vez en total.
Razón: Los códigos deben ir entre etiquetas 'code', botón </>

mollok
Mensajes: 468
Registrado: 30/01/2018 9:47 am
Ubicación: Mallorca, España

Re: Pregunta sobre almacenamiento de datos

#2 Mensaje por mollok » 14/05/2019 7:07 am

Para hacer lo que dices puedes usar la directiva define del preprocesador. Algo así:

Código: Seleccionar todo

#include <stdio.h>
#define DATABGM (int[]){4, 5, 0, 3, 1, 7, 2, 6}

int main() {
    for(int i = 0; i < sizeof(DATABGM)/sizeof(DATABGM[0]); ++i) {
        printf("%d\n", DATABGM[i]);
    }
}
En este código por cada DATABGM que encuentre en el código lo va a sustituir por (int[]){4, 5, 0, 3, 1, 7, 2, 6}. Pero esto consumirá memoria de datos y de programa porque vas a cargar el array en el stack, además de que el código tendrá los ocho valores. Además estos valores podrán ser reescritos una vez que están en memoria.

Lo mejor es que crees un array constante global y accedas a él.
Por cierto, las cadenas literales se guardan en memoria de sólo lectura, lo que hacen es devolver su dirección de memoria. Si hay dos o más cadenas literales exactamente iguales éstas apuntan a la misma dirección de memoria. Por eso son inmutables.
while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}

rrnum7
Mensajes: 5
Registrado: 02/04/2019 4:08 pm

Re: Pregunta sobre almacenamiento de datos

#3 Mensaje por rrnum7 » 14/05/2019 12:38 pm

Como ya te comentaron, las cadenas literales, como en tu ejemplo de "hola", se guardan en memoria de sólo lectura, pero lo que afirmas de que saca la cadena del código del programa, no es necesariamente correcto. Algunos compiladores, sobre todo antiguos, sí guardaban las cadenas literales en el segmento de código, junto con las instrucciones del programa, pero en la actualidad, suelen guardarlo en el segmento de datos, justo como las variables, y simplemente marcan la página de memoria donde la literal se encuentra, como de sólo lectura.

En cualquier caso, lo que comentas de almacenar los valores en el código en vez de variables para ahorrar RAM y tiempo, no es relevante en la PC. Aquí no hay ningún tipo de ROM donde estén las instrucciones. Todo se carga en RAM. Así, si tienes un arreglo de 20 bytes, da igual si lo almacenaste en el código (lo cual se puede, programando en ensamblador) o en una variable; una vez que el programa está en ejecución, el arreglo estará ocupando 20 bytes de RAM en ambos casos.

guillero
Mensajes: 23
Registrado: 01/04/2019 11:28 am

Re: Pregunta sobre almacenamiento de datos

#4 Mensaje por guillero » 14/05/2019 6:02 pm

¿Pero no estaría dos veces el arreglo (en la rom y en la ram)?

guillero
Mensajes: 23
Registrado: 01/04/2019 11:28 am

Re: Pregunta sobre almacenamiento de datos

#5 Mensaje por guillero » 14/05/2019 6:07 pm

Lo que no entiendo es: si el arreglo está de cualquier forma en el código de máquina del programa, ¿por qué no leerlo de allí en lugar de pasarlo además a la ram?

guillero
Mensajes: 23
Registrado: 01/04/2019 11:28 am

Re: Pregunta sobre almacenamiento de datos

#6 Mensaje por guillero » 14/05/2019 6:38 pm

Estuve leyendo un poco más en la web y creo que ahora entendí: Al iniciarse la ejecución del programa se cargan todas las variables en el segmento de datos y el código en el segmento de código. Yo pensaba que era como en Nes, que está todo en el sector para la rom y al momento de querer tener esos datos en la ram para convertirlos en variables hay que realizar la tarea de pasarlos. (De modo que están dos veces, pero solo en ram se pueden leer y escribir).

mollok
Mensajes: 468
Registrado: 30/01/2018 9:47 am
Ubicación: Mallorca, España

Re: Pregunta sobre almacenamiento de datos

#7 Mensaje por mollok » 15/05/2019 12:11 pm

La memoria del ordenador, cómo y la vas a ver, y siempre que hablemos de PC modernos, va a ser un único bloque de memoria que el sistema operativo le va a dar a tu programa. Después C hará su magia y te lo dividirá en la stack, heap, datos permanentes e instrucciones.
En unos no podrás reescribir (permanentes), otra te la maneja C (stack), otra la debes manejar manualmente (heap) y la de programa que, bueno es el programa.
while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}

guillero
Mensajes: 23
Registrado: 01/04/2019 11:28 am

Re: Pregunta sobre almacenamiento de datos

#8 Mensaje por guillero » 15/05/2019 5:13 pm

¿Las variables se crean en tiempo de ejecución o al arrancar el programa?

mollok
Mensajes: 468
Registrado: 30/01/2018 9:47 am
Ubicación: Mallorca, España

Re: Pregunta sobre almacenamiento de datos

#9 Mensaje por mollok » 15/05/2019 9:39 pm

Las globales al inicio, las demás a petición.
while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 5 invitados