neg指令:intel指令手册是这样说明的
IF DEST = 0
THEN CF <- 0;
ELSE CF <- 1
就是说,当操作数为0时,cf标志为0,否则cf被置1.(这让我们联想到c语言中很多函数返回0和非0,然后用if来判断0或者非0走不同的分支)
neg指令的作用就是对操作数求反,neg eax :用伪代码表示就是 eax = -eax;
那么neg指令的初级作用就是对一个数来求绝对值
[plain] view plaincopy
cmp al,0
jge xx
neg al;al小于0就求绝对值
xx:
进一步,neg对cf标志的影响可以用来优化条件跳转语句。看到cf标志,会联想到sbb这个指令,
[plain] view plaincopy
sbb 目的操作数,源操作数
sbb的作用就是用目的操作数减去源操作数,再减去cf,结果送到目的操作数
也就是说,我们可以先用neg指令来影响cf标志,接着调用sbb指令,那么这个sbb指令就会根据neg指令中操作数是否为0来决定减去0(此时cf为0),或者减去1(此时cf为1)。
看这段代码: