您的位置:首页 > 运维架构 > Linux

《linux 内核全然剖析》 include/asm/io.h

2017-08-02 21:28 381 查看

include/asm/io.h 



#define outb(value,port) \
__asm__ ("outb %%al,%%dx"::"a" (value),"d" (port))
//宏定义outb用汇编实现了在端口地址port处写入值value
//使用的寄存器是al,一个byte长度,而端口port使用的是2byte长度地址来标记的寄存器,注意这里寄存器的使用

#define inb(port) ({ \
unsigned char _v; \
__asm__ volatile ("inb %%dx,%%al":"=a" (_v):"d" (port)); \
_v; \
})
//这里inb是在端口port处读入读入一个byte长度的数据。并把读入数据保存在变量_V中

#define outb_p(value,port) \
__asm__ ("outb %%al,%%dx\n" \
"\tjmp 1f\n" \
"1:\tjmp 1f\n" \  //这里jmp 1f是老把戏了。就是继续向下运行语句。纯粹的通过“反复运行没啥意义的机器指令”短暂延时一下而已
"1:"::"a" (value),"d" (port))
//outb_p 和outb 差别在于前者有短暂延时。后者没有

#define inb_p(port) ({ \
unsigned char _v; \
__asm__ volatile ("inb %%dx,%%al\n" \
"\tjmp 1f\n" \
"1:\tjmp 1f\n" \
"1:":"=a" (_v):"d" (port)); \
_v; \
})
//inb_p 和inb 差别在于前者有短暂延时,后者没有















内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: