Organización del Código Assembler

 

El ensamblador proporciona directivas (como db, dw, dd, dq, etc.) para definir el tipo y el tamaño de los datos que se van a almacenar. Por ejemplo:

  • db (define byte): para definir datos de 8 bits.
  • dw (define word): para definir datos de 16 bits.
  • dd (define double word): para definir datos de 32 bits.
  • dq (define quad word): para definir datos de 64 bits.

Organización del Código Assembler:

En ensamblador, un programa se organiza típicamente en varias secciones, siendo las más comunes:

  • .text: Contiene las instrucciones del programa (el código ejecutable).
  • .data: Contiene variables globales y estáticas inicializadas.
  • .bss: Contiene variables globales y estáticas no inicializadas.

¿Pueden las Secciones .data y .text Estar en Archivos Separados?

  • No es lo común, pero es posible: En la mayoría de los casos, las secciones .text y .data (y .bss) se definen dentro del mismo archivo de ensamblador. Esto facilita la organización del código y la comprensión del programa.
  • Enlazado: Sin embargo, es técnicamente posible definir estas secciones en archivos de ensamblador separados. El enlazador, que es el programa que combina los archivos objeto generados por el ensamblador, puede combinar las secciones de diferentes archivos para crear el archivo ejecutable final.
  • Organización de Proyectos Grandes: Esto podría ser útil en proyectos muy grandes para mejorar la modularidad y la organización del código, pero complica un poco el proceso de compilación y enlazado.

 

Ejemplos Estructurales de Uso de .text, .data, y .bss en Hardware Real

Las secciones .text, .data y .bss son fundamentales en la programación de ensamblador para organizar el código y los datos en la memoria. A continuación, se presentan ejemplos estructurales de su uso en un contexto de hardware real, específicamente en sistemas embebidos y microcontroladores.

 

1. Sistema Embebido Sencillo (Microcontrolador)

Escenario: Control de un LED mediante un microcontrolador AVR (como el ATmega328P). El LED se encenderá y apagará en intervalos regulares.

Estructura del Código:

; Archivo: led_parpadeante.asm
; Descripción: Programa para hacer parpadear un LED en un microcontrolador AVR

; Sección .include: Incluye archivos de definición del microcontrolador
.include <avr/io.h>       ; Define los registros de E/S del AVR
.include <util/delay.h>    ; Funciones de retardo

; Sección .data: Datos inicializados
.data
    led_pin_number:  .db 5    ; Número del pin al que está conectado el LED
    delay_time_ms:   .dw 500  ; Tiempo de retardo en milisegundos

; Sección .bss: Datos no inicializados (opcional en este caso simple)
.bss
    ; No se utilizan variables no inicializadas en este ejemplo

; Sección .text: Código del programa
.text
.global main           ; Punto de entrada del programa

main:
    ; Configurar el pin del LED como salida
    ldi r16, 1 << led_pin_number ; Calcula la máscara para el pin del LED
    out DDRB, r16             ; Establece la dirección del pin como salida (DDRB es el registro de dirección de datos del puerto B)

bucle_principal:
    ; Encender el LED
    ldi r16, 1 << led_pin_number
    out PORTB, r16            ; Establece el pin del LED en alto (PORTB es el registro de datos del puerto B)

    ; Esperar un tiempo
    ldi r16, low(delay_time_ms)  ; Carga la parte baja del retardo
    ldi r17, high(delay_time_ms) ; Carga la parte alta del retardo
    call delay_ms           ; Llama a la función de retardo

    ; Apagar el LED
    ldi r16, 0
    out PORTB, r16            ; Establece el pin del LED en bajo

    ; Esperar un tiempo
    ldi r16, low(delay_time_ms)
    ldi r17, high(delay_time_ms)
    call delay_ms           ; Llama a la función de retardo

    rjmp bucle_principal       ; Volver al principio del bucle

; Función de retardo (implementación básica)
delay_ms:
    ;r16: parte baja del retardo, r17 parte alta
    push r20
    push r21
    ldi r20, 0
    ldi r21, 0
    ; Aquí iría el código para el retardo
    ;usar un loop para consumir ciclos
delay_loop:
    add r20, r16
    adc r21, r17
    cpi r20, 0xFF
    cpc r21, 0xFF
    brne delay_loop
    pop r21
    pop r20
    ret

Explicación:

  • .include: Incluye archivos de encabezado específicos del microcontrolador para acceder a definiciones de registros y funciones.

  • .data: Define las variables inicializadas:

    • led_pin_number: Almacena el número del pin del LED (5 en este caso).
    • delay_time_ms: Almacena el tiempo de retardo deseado (500 ms).
  • .text: Contiene el código ejecutable:

    • main: La función principal que configura el pin del LED como salida, enciende y apaga el LED, y llama a la función de retardo.
    • delay_ms: Una función de retardo (podría usar una función de biblioteca más precisa).

2. Sistema Embebido Más Complejo (Procesador ARM)

Escenario: Un sistema embebido basado en ARM Cortex-M4 que lee datos de un sensor, los procesa y los muestra en una pantalla LCD.

Estructura del Código:

; Archivo: sensor_display.asm
; Descripción: Programa para leer un sensor, procesar datos y mostrar en un LCD

; Directivas del ensamblador (para un ensamblador ARM como GNU Assembler)
.syntax unified    ; Usa la sintaxis unificada de ARM
.thumb           ; Genera código Thumb (más compacto)

; Sección .include: Incluye archivos de encabezado
.include "stm32f4xx.h"  ; Definiciones de registros para el STM32F4
.include "lcd.h"       ; Definiciones y funciones para la pantalla LCD

; Sección .data: Datos inicializados
.data
    sensor_name:    .asciz "Sensor DHT11"  ; Nombre del sensor (cadena terminada en nulo)
    unidad_temperatura: .asciz "C"
    mensaje_inicio:  .asciz "Iniciando..."
    formato_temperatura: .asciz "Temperatura: %d.%d %s" ; Formato para mostrar la temperatura
    tabla_conversion: .byte 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 ;valores de ejemplo

; Sección .bss: Datos no inicializados
.bss
    sensor_data:    .space 4      ; Almacena la lectura del sensor (4 bytes)
    temperatura:    .space 4      ; Almacena la temperatura procesada

; Sección .text: Código del programa
.text
.global main
.global SysTick_Handler ; Handler para el SysTick timer

main:
    ; Inicialización del sistema (relojes, periféricos, etc.)
    bl init_system      ; Llama a la función de inicialización del sistema
    bl lcd_init         ; Inicializa la pantalla LCD

    ; Mostrar mensaje de inicio
    ldr r0, =mensaje_inicio
    bl lcd_display_string

bucle_principal:
    ; Leer datos del sensor
    bl read_sensor      ; Llama a la función para leer el sensor
    ; Procesar los datos del sensor
    bl process_data    ; Llama a la función para procesar los datos
    ; Mostrar los datos en la pantalla LCD
    bl display_data    ; Llama a la función para mostrar los datos
    b bucle_principal

; Función para inicializar el sistema
init_system:
    ; Código para configurar el reloj, los pines de E/S, etc.
    ; ...
    bx lr

; Función para leer el sensor
read_sensor:
    ; Código para comunicarse con el sensor y leer los datos
    ; ...
    ldr r0, =sensor_data ; Dirección de memoria para almacenar los datos
    ;store data
    bx lr

; Función para procesar los datos
process_data:
    ; Código para convertir los datos del sensor a temperatura, etc.
     ldr r0, =sensor_data
     ldr r1, [r0]
    ; Ejemplo de conversion, r1 contiene la lectura
     ldr r2, =tabla_conversion
     ldrb r3, [r2, r1] ;r3 = tabla_conversion[r1]
     str r3, temperatura
    bx lr

; Función para mostrar los datos en la pantalla LCD
display_data:
    ; Código para formatear los datos y mostrarlos en la pantalla LCD
    ldr r0, =formato_temperatura ; Carga la cadena de formato
    ldr r1, =temperatura
    ldr r1, [r1]
    ldr r2, =unidad_temperatura
    ;Llamar a la funcion de la lcd para mostrar
    bl lcd_display_formatted_string
    bx lr

; Función de retardo usando el SysTick timer
SysTick_Handler:
    ; Manejador de interrupción para el SysTick timer
    ; Decrementa un contador, por ejemplo
    bx lr

Explicación:

  • .include: Incluye archivos de encabezado para el microcontrolador STM32F4 y la pantalla LCD.

  • .data: Define datos inicializados:

    • sensor_name, unidad_temperatura, mensaje_inicio, formato_temperatura: Cadenas de texto para mostrar en la LCD.
    • tabla_conversion: Una tabla de ejemplo para convertir lecturas del sensor a valores de temperatura.
  • .bss: Define datos no inicializados:

    • sensor_data: Reserva espacio para almacenar la lectura del sensor.
    • temperatura: Reserva espacio para almacenar el valor de temperatura procesado.
  • .text: Contiene el código ejecutable:

    • main: La función principal que inicializa el sistema, lee el sensor, procesa los datos y los muestra en la LCD.
    • Funciones como init_system, read_sensor, process_data, y display_data para realizar tareas específicas.
    • SysTick_Handler: Un manejador de interrupción para el temporizador del sistema (SysTick), que se puede utilizar para generar retardos o realizar otras tareas periódicas.

Estos ejemplos ilustran cómo se utilizan las secciones .text, .data y .bss para estructurar programas en ensamblador en hardware real. La sección .text contiene el código del programa, la sección .data contiene los datos inicializados y la sección .bss contiene los datos no inicializados. Esta organización permite al procesador acceder y ejecutar el código y los datos de manera eficiente.

 

 

Destacado

Bootloader Avanzado en Ensamblador

Bootloader Avanzado en Ensamblador Características del Bootloader Se carga en la dirección 0x7C00 (BIOS). ...