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.
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.
: "=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.
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;
}
1. Función leerPuerto:
2. Función main:
leerPuerto con el puerto 0x60.
ioperm o iopl para habilitar el acceso a los puertos de E/S.
Jorge García
Fullstack developer