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