Skip to main content

C y bcc


¿Qué es el lenguaje C?

C es un lenguaje de programación de propósito general, de nivel intermedio, diseñado en los años 70 por Dennis Ritchie. Se caracteriza por:

  • Bajo nivel de abstracción.
  • Acceso directo a memoria.
  • Eficiencia y portabilidad.
  • Uso extendido en sistemas embebidos y desarrollo de sistemas operativos.

En este contexto, usamos C para escribir funciones simples que puedan ejecutarse en modo real de 16 bits, típico del arranque de una computadora.


¿Qué es bcc?

bcc (Bruce's C Compiler) es un compilador de C cruzado para arquitectura x86 en modo real (16 bits). Fue creado por Bruce Evans y usado originalmente en sistemas como Minix 1.x.

Características clave:

  • Genera código compatible con modo real de 16 bits
  • No requiere un sistema operativo subyacente
  • Trabaja con sintaxis K&R C, no ANSI C moderno

⚠️ Importante: bcc genera código en sintaxis AT&T, incompatible directamente con NASM.


Instalación de bcc

Nosotros lo hemos usado en Linux

sudo apt install bcc

Ejemplo de código C (random.c)

Este es codigo del comando random de DariOS

// random.c - Generador pseudoaleatorio de 16 bits

unsigned long seed = 0x12345678;

void srand(unsigned long new_seed) {
seed = new_seed;
}

unsigned short rand(void) {
seed = seed * 1103515245 + 12345;
return (unsigned short)(seed >> 16);
}

Este código define un generador pseudoaleatorio simple, ideal para ser integrado en un entorno de 16 bits.

El comando, al igual que el resto de codigo se explica detalladamente en la seccion de codigo.


Compilando a ensamblador con bcc

Para compilar tu código C a ensamblador AT&T de 16 bits:

bcc -S -o random.asm random.c

Esto genera un archivo random.asm en formato AT&T, compatible con el modo real de 16 bits.


Contenido del archivo random.asm (AT&T)

Ejemplo de salida:

.text
_srand:
push %bp
mov %sp, %bp
mov -4(%bp), %ax
mov -6(%bp), %bx
mov %ax, _seed
mov %bx, _seed+2
pop %bp
ret

Este código no puede ser usado directamente con NASM, ya que NASM usa sintaxis Intel.


Conversión manual a sintaxis NASM

Aquí tienes cómo convertir el fragmento anterior a NASM:

_srand:
push bp
mov bp, sp
mov ax, [bp - 4]
mov bx, [bp - 6]
mov [seed], ax
mov [seed + 2], bx
pop bp
ret

Diferencias clave entre AT&T y NASM:

ElementoAT&TNASM
Registros%axax
Constantes$4242
Memoria(%ax)[ax]
Comentarios# comentario; comentario

Incluir el código en tu proyecto NASM

Una vez que tengas el archivo .asm adaptado a NASM tendrás que renombrarlo y convertirlo en un archivo .inc, puedes incluirlo en tu proyecto principal así:

%include "random.inc"

Y llamar a las funciones desde tu bootloader:

call _srand