处理器的标志位在比较指令操作后被设置。标志位同样可以被诸如MOV、ADD、AND、MUL等
基本算术和裸机指令改写。如果数据指令设置了标志位,N和Z标志位也将与结果与0比较一样
进行设置。N标志表示结果是否是负值,Z标志表示结果是否是0。
C语言中,处理器中的N和Z标志位与下面的指令联系在一起:有符号关系运
算x<0,x>=0,x==0,x!=0;无符号关系运算x==0,x!=0(或者x>0)。
C代码中每次关系运算符的调用,编译器都会发出一个比较指令。
如果操作符是上面提到的,编译器便会优化掉比较指令。例如:
int aFunction(int x, int y)
{
if (x + y < 0)
return 1;
else
return 0;
}
尽可能的使用上面的判断方式,这可以在关键循环中减少比较指令的调用,
进而减少代码体积并提高代码性能。C语言没有借位和溢出位的概念,因此,
如果不借助汇编,不可能直接使用借位标志C和溢出位标志V。但编译器支
持借位(无符号溢出),例如:
int sum(int x, int y)
{
int res;
res = x + y;
if ((unsigned) res < (unsigned) x) // carry set? //
res++;
return res;
}
|