程序14-14 linux/include/asm/io.h


    //// 硬件端口字节输出函数。

    // 参数:value - 欲输出字节;port - 端口。

  1 #define outb(value,port) \

  2 __asm__ ("outb %%al,%%dx"::"a" (value),"d" (port))

  3

  4

    //// 硬件端口字节输入函数。

    // 参数:port - 端口。返回读取的字节。

  5 #define inb(port) ({ \

  6 unsigned char _v; \

  7 __asm__ volatile ("inb %%dx,%%al":"=a" (_v):"d" (port)); \

  8 _v; \

  9 })

 10

    //// 带延迟的硬件端口字节输出函数。使用两条跳转语句来延迟一会。

    // 参数:value - 欲输出字节;port - 端口。

 11 #define outb_p(value,port) \

 12 __asm__ ("outb %%al,%%dx\n" \

 13                 "\tjmp 1f\n" \               // 向前跳转到标号1处(即下一条语句处)。

 14                 "1:\tjmp 1f\n" \             // 向前跳转到标号1处。

 15                 "1:"::"a" (value),"d" (port))

 16

    //// 带延迟的硬件端口字节输入函数。使用两条跳转语句来延迟一会。

    // 参数:port - 端口。返回读取的字节。

 17 #define inb_p(port) ({ \

 18 unsigned char _v; \

 19 __asm__ volatile ("inb %%dx,%%al\n" \

 20         "\tjmp 1f\n" \                       // 向前跳转到标号1处(即下一条语句处)。

 21         "1:\tjmp 1f\n" \                     // 向前跳转到标号1处。

 22         "1:":"=a" (_v):"d" (port)); \

 23 _v; \

 24 })

 25