你能解释一下这段代码吗?我真的不明白。
请参阅http://lxr.free-electrons.com/source/arch/arm/include/asm/uaccess.h#L70
#define __addr_ok(addr) ({ \
unsigned long flag; \
__asm__("cmp %2, %0; movlo %0, #0" \
: "=&r" (flag) \
: "" (current_thread_info()->addr_limit), "r" (addr) \
: "cc"); \
(flag == 0); })
/* We use 33-bit arithmetic here... */
#define __range_ok(addr,size) ({ \
unsigned long flag, roksum; \
__chk_user_ptr(addr); \
__asm__("adds %1, %2, %3; sbcccs %1, %1, %0; movcc %0, #0" \
: "=&r" (flag), "=&r" (roksum) \
: "r" (addr), "Ir" (size), "" (current_thread_info()->addr_limit) \
: "cc"); \
flag; })
这是来自ARM Linux内核,__ range_ok
答案 0 :(得分:1)
作为有关注册用法和其他装饰的一般信息来源,请查看GCC Extended Inline Assembly的文档
我建议您通过
运行此来源gcc .... -S
看看产生的结果是什么。
你也可以运行
objdump -dC -S <objectfile.o>
您将需要来自交叉编译器工具链的objdump。 此外,使用调试信息进行编译以获取源注释(-S)。 使用-O0编译以避免因优化而产生混淆。