zoukankan      html  css  js  c++  java
  • 《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
    " 
    		"	jmp 1f
    " 
    		"1:	jmp 1f
    "   //这里jmp 1f是老把戏了。就是继续向下运行语句。纯粹的通过“反复运行没啥意义的机器指令”短暂延时一下而已
    		"1:"::"a" (value),"d" (port))
    //outb_p 和outb 差别在于前者有短暂延时。后者没有
    
    #define inb_p(port) ({ 
    unsigned char _v; 
    __asm__ volatile ("inb %%dx,%%al
    " 
    	"	jmp 1f
    " 
    	"1:	jmp 1f
    " 
    	"1:":"=a" (_v):"d" (port)); 
    _v; 
    })
    //inb_p 和inb 差别在于前者有短暂延时,后者没有















  • 相关阅读:
    路由器链接
    quartz cron表达式demo
    mybatis xml中常见配置demo
    PLSQL启动很慢的问题
    oracle触发器--if else demo
    去掉redhat linux提示注册
    linux 关闭电子邮件传输服务
    max(length()) oracle字段最长长度
    事件tou
    事件
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/7276936.html
Copyright © 2011-2022 走看看