内联汇编清楚变量指定位

打印 上一主题 下一主题

主题 1807|帖子 1807|积分 5421

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. static inline void clear_bit(int nr, volatile unsigned long *addr)
  2. {
  3.     __asm__ __volatile__(
  4.         "lock ; "
  5.         "btrl %1,%0"
  6.         : "=m" (*addr)
  7.         : "Ir" (nr));
  8. }
复制代码
这段代码是一个内联函数,用于在特定地点的位图中清除一个位。它使用了内联汇编来实现这一操作。以下是对这段代码的详细表明:
表明


  • 函数界说

    • static inline void clear_bit(int nr, volatile unsigned long *addr):

      • static inline:函数被界说为静态内联函数。这意味着该函数的代码会直接插入调用点,而不是进行函数调用。
      • void:函数没有返回值。
      • int nr:表示必要清除的位的索引。
      • volatile unsigned long *addr:指向一个 unsigned long 类型的地点(位图的基地点),而且被声明为 volatile,表明这个变量可能会在程序之外被修改,防止编译器对它进行优化。


  • 内联汇编

    • __asm__ __volatile__:告诉编译器这是内联汇编代码。volatile 关键字表示这段代码不应被优化掉,即使看起来没有副作用。
    • "lock ; ":这是一个前缀,指示这条指令必要在多处理处罚器情况下进行总线锁定,确保操作是原子的。
    • "btrl %1,%0":这条指令是 “Bit Test and Reset” 指令,nr 表示位的位置,addr 表示地点。该指令会清除指定位置的位。

  • 输出操作数

    • :"=m" (*addr):*addr 被指定为输出操作数,即这段汇编代码会修改 addr 所指向的内存。

  • 输入操作数

    • :"Ir" (nr):nr 被指定为输入操作数。I 表示立刻数(immediate),r 表示寄存器(register)。

总结

这个函数使用了内联汇编来清除特定位图中的某一位,确保该操作在多处理处罚器情况中是原子的。btrl 指令联合 lock 前缀,实现了对共享内存的安全修改。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

西河刘卡车医

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表