- 论坛徽章:
- 0
|
本帖最后由 guoruimin 于 2010-06-13 11:04 编辑
只顾掐架了,没帮上楼主什么忙,实在惭愧。
楼主的第三段代码是正确无误的,除了有点小警告。如果不能输出OK,就是编译器的bug了。
在我的系统:
Target: x86_64-linux-gnu
gcc version 4.3.2 (Debian 4.3.2-1.1)
是会输出OK的。
这段程序归根结底是 无符号整数0x80000000 与 无符号整数0x7FFFFFFF 的比较。
显而易见是应该输出OK的。
在上面汇编代码中:
mov -0x4(%rbp), %eax
add $0x1, %eax
是将 last_jobid 的值存入寄存器 eax,然后加 1。
test %eax, %eax
jns 0x4005c7 <main+75>
是判断 eax 的值是否为负数?
这里其实是一个技巧,本质上是判断 eax 的最高位是否为 1?
因为负数的最高位为 1,0 和正数的最高位为 0;
但咱们这里是无符号数的比较,所以就无正负之分了;
最高位为 1 的肯定大于最高位为 0 的。
0x7FFFFFFF 的最高位为 0,它是最大的 int,也是最高位为 0 的最大的 unsigned int;
0x80000000 的最高位为 1,它是最小的 int,也是最高位为 1 的最小的 unsigned int;
0x80000000 ~ 0xFFFFFFFF 的最高位都为 1,所以作为无符号数都是大于 0x7FFFFFFF 的。
所以就不必用 cmp 指令将 eax 中的值和 0x7FFFFFFF 比较了,直接用 test %eax, %eax 然后 jns 应该效率更高!
对于 jns(非负即最高位为 0 则跳转)指令,eax 中的值 0x80000000 显然是不符合条件的,
所以要继续向下执行,输出 “OK”! |
|