Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15497585
  • 博文数量: 2005
  • 博客积分: 11986
  • 博客等级: 上将
  • 技术积分: 22535
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-17 13:56
文章分类

全部博文(2005)

文章存档

2014年(2)

2013年(2)

2012年(16)

2011年(66)

2010年(368)

2009年(743)

2008年(491)

2007年(317)

分类: LINUX

2007-07-07 19:47:48

浅析arm-linux内嵌汇编小程序

文章来源:http://gliethttp.cublog.cn
    
#define __range_ok(addr,size) ({                                \
    unsigned long flag, sum;                                    \
    __asm__("adds %1, %2, %3; sbcccs %1, %1, %0; movcc %0, #0"  \
        : "=&r" (flag), "=&r" (sum)                             \
        : "r" (addr), "Ir" (size), "0" (current->addr_limit)    \
        : "cc");                                                \
    flag; })
对内嵌汇编的理解:
//2007-07-07 gliethttp 7.7啊,值得记住啊
1."=&r" (flag)
  1.1 &                                           表示输出数据不会被覆盖
  1.2=&r(flag)                                 %0 flag为输出单元,r表示用寄存器r作为flag变量的引用,而非memory即volatile
2. "=&"(sum)                                   %1 sum为输出单元,用r寄存器作为sum的引用
3."r" (addr)                                   %2 输入单元变量addr用r寄存器引用
4."Ir" (size)                                  %3 输入单元32位变量size用r寄存器引用
5."0" (current->addr_limit)                    %4 输入单元变量current->addr_limit用%0的r寄存器引用,
                                                  即:进入__asm__嵌入汇编指令之前,%4输入变量被赋值也就是%0的r寄存器被赋值为current->addr_limit
6."cc"                                            该内嵌__asm__汇编指令将会改变CPU的条件状态寄存器cc
7.flag;                                           告知gcc编译器,flag作为最终的输出变量单元返回值,也就是说sum仅仅是一个输出单元中间量,
                                                  如果仅有一个输出单元,那这个flag;就没必要了;
                                                  但也有 flag == 0;这样的用法,表示将flag == 0;的比较结果作为最终输出返回值

阅读(1998) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~