Soy nuevo en ensambladores y microcontroladores y estoy tratando de descubrir cómo funcionan.
Ahora, he leído mucho sobre cómo en el ensamblaje los segmentos text y data son para almacenar el código del programa y los datos iniciales del mismo.
En todas partes, la gente dice [ 1 , < a href="http://jaxcoder.com/Projects.aspx?id=912541054#captcha"> 2 , 3 ] (si dicen algo) data segment almacena valores preinicializados para el programa.
Pero en AVR, según entiendo, data significa SRAM .
Y para que se inicialice, debe indicar a su microcontrolador que ponga algunos valores reales allí.
Solo tener instrucciones bajo .dseg en algún lugar de su código no pone mágicamente los valores en SRAM . El microcontrolador tiene que alcanzar las instrucciones de inicialización siguiendo su ritmo, siguiendo el programa de manera habitual: comienza en 0x0 del segmento program , que es flash en AVR, y sigue las instrucciones.
Por ejemplo, en este question el tipo examina el código, producido por avr-gcc desde C , y encuentra las rutinas que inicializan SRAM desde flash , es decir, el segmento program del código.
Si es así, ¿cuál es el propósito de tener .dseg ?
Tal vez sea para diferentes ensambladores u otras herramientas (como avr-gcc en la referenciada question , o avrstudio en el enlace 1 ), que agregaría las instrucciones de inicialización necesarias al procesar el código con .dseg ?
Pero si trabajas con "huesos desnudos", el microcontrolador comienza desde 0x0 (o en algún otro lugar, de acuerdo con la hoja de datos), aquí es donde comienza tu programa y no hay nada más, ¿verdad? (Por supuesto, coloca una tabla de vectores para las interrupciones, si quieres manejarlas. Y 0x0 es la dirección a la que RESET trae el microcontrolador. Pero no es esencial).
PS
Pensé que .dseg / cseg podría implicar diferentes espacios de direcciones: cuando escribes una dirección en .dseg es para SRAM , en .cseg - para flash .
Pero el direccionamiento de las costuras depende únicamente de la definición de la instrucción: ADD a1, a2 - a# son registros, RJMP a - a es flash (es decir, program ), se accede indirectamente a SRAM a través de los registros - - LDS R1, 0x0060 .
De nuevo, puede ser así, que el código bajo la etiqueta .dseg como en 1 :
.DSEG ; Start data segment
var1: .BYTE 1 ; reserve 1 byte to var1
sustituye el acceso indirecto a SRAM a través de registros?
Probablemente esta información debería buscarse en la documentación del ensamblador en particular. De nuevo, ¿el conjunto de instrucciones AVR de "hueso desnudo" no proporciona nada de eso?