#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 差别在于前者有短暂延时,后者没有
《linux 内核全然剖析》 include/asm/io.h
转载
include/asm/io.h
本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
上一篇:TypeError: Error #1034: 强制转换类型失败:无法将 flash.events::MouseEvent@73b7cc1 转换为 mx.events.ItemClickEvent。
下一篇:C++设计模式之建造者模式(二)
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章