又见汇编技巧

在 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