首页 > 代码库 > 《linux 内核完全剖析》 include/asm/io.h
《linux 内核完全剖析》 include/asm/io.h
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 区别在于前者有短暂延时,后者没有
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。