一、OUTx
在一个I/O的地址上写数据,关键字"a"表示,要在这条asm语句执行前,就把val的值放到eax寄存器中;关键字"Nd“表示,允许一个字节的常量值可以被汇编称为一个常量,这样就释放了edx让其他程序使用。
static inline void outb(uint16_t port, uint8_t val)
{
asm volatile ( "outb %0, %1" : : "a"(val), "Nd"(port) );
}
二、INx
从一个I/O地址读取数据,把port上的数据读取到ret上,实际上就是把port上的数据提前放到eax上,然后把eax的指赋给ret
static inline uint8_t inb(uint16_t port)
{
uint8_t ret;
asm volatile ( "inb %1, %0"
: "=a"(ret)
: "Nd"(port) );
return ret;
}