#include uint8_t inportb(uint16_t port) { uint8_t data; asm volatile("inb %1, %0" : "=a"(data) : "dN"(port)); return data; } void outportb(uint16_t port, uint8_t data) { asm volatile("outb %1, %0" : : "dN"(port), "a"(data)); } uint16_t inportw(uint16_t port) { uint16_t data; asm volatile("inw %1, %0" : "=a"(data) : "dN"(port)); return data; } void outportw(uint16_t port, uint16_t data) { asm volatile("outw %1, %0" : : "dN"(port), "a"(data)); } uint32_t inportl(uint16_t port) { uint32_t data; asm volatile("inl %%dx, %%eax" : "=a"(data) : "dN"(port)); return data; } void outportl(uint16_t port, uint32_t data) { asm volatile("outl %%eax, %%dx" : : "dN"(port), "a"(data)); } void outportsw(uint16_t port, void *data, uint32_t size) { asm volatile("rep outsw" : "+S"(data), "+c"(size) : "d"(port)); } void inportsw(uint16_t port, unsigned char *data, unsigned long size) { asm volatile("rep insw" : "+D"(data), "+c"(size) : "d"(port) : "memory"); }