又见汇编技巧
在 arch/x86/include/asm/uaccess.h 中有这么一段代码:
define __range_not_ok(addr, size)
({
unsigned long flag, roksum;
__chk_user_ptr(addr);
asm(“add %3,%1 ; sbb %0,%0 ; cmp %1,%4 ; sbb $0,%0”
: “=&r” (flag), “=r” (roksum)
: “1” (addr), “g” ((long)(size)),
“rm” (current_thread_info()->addr_limit.seg));
flag;
})
这段汇编写得很有技巧性,充分利用了sbb指令和carry flag,值得你仔细体会一番。还有一个关于sbb的技巧:
sbb eax,eax
sbb eax,0FFFFFFFFh