Volver a la página principal
lunes 6 enero 2025
13

Cómo usar __asm__ volatile con inb en C para leer puertos de E/S

La instrucción __asm__ volatile en C permite incluir ensamblador en línea dentro del código. Esta técnica es utilizada principalmente para interactuar directamente con hardware a través de puertos de entrada/salida. En este caso, la instrucción inb permite leer un byte de datos desde un puerto de E/S.

¿Qué hace la instrucción?

La sintaxis:

__asm__ volatile ("inb %1, %0"
                  : "=a"(ret)
                  : "Nd"(port));
  • inb %1, %0: Instrucción en ensamblador que lee un byte desde el puerto especificado (%1) y almacena el resultado en un registro de propósito general (%0).
  • volatile: Indica al compilador que no optimice ni elimine esta instrucción, ya que tiene efectos secundarios importantes.
  • Cláusulas:
  • : "=a"(ret): Salida, donde el resultado del puerto se almacena en el registro eax (asociado a la variable ret).
  • : "Nd"(port): Entrada, que indica que el puerto (almacenado en port) se pasará como operando.

Ejemplo práctico: Leer un byte de un puerto

Aquí tienes un ejemplo completo de cómo usar esta instrucción para leer datos del puerto 0x60 (usualmente asociado al teclado en sistemas x86):

#include <stdio.h>

unsigned char leerPuerto(unsigned short port) {
    unsigned char ret;
    __asm__ volatile ("inb %1, %0"
                      : "=a"(ret)
                      : "Nd"(port));
    return ret;
}

int main() {
    unsigned short puerto = 0x60; // Puerto del teclado
    unsigned char dato = leerPuerto(puerto);
    printf("Dato leído del puerto 0x60: 0x%02X\n", dato);
    return 0;
}

Explicación:

1. Función leerPuerto:

  • Usa ensamblador en línea para leer un byte del puerto especificado.
  • Devuelve el valor leído.

2. Función main:

  • Llama a leerPuerto con el puerto 0x60.
  • Muestra el valor leído.

Consideraciones

  • Permisos: Este tipo de operaciones requiere permisos elevados. En sistemas Linux, es necesario usar ioperm o iopl para habilitar el acceso a los puertos de E/S.
  • Precaución: El acceso directo a hardware puede causar problemas si no se hace correctamente, como bloqueos o corrupción de datos.
Etiquetas:
C
Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer