浅析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;的比较结果作为最终输出返回值
|