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?