计算机中数码的表示:

定义-》

正数:原码,反码,补码相同。

负数:原码为其对应正数原码最高符号位取反。

   反码为其原码除符号位外都取反。

   补码为其原码除符号位外取反加1。

所以最高位符号位都不变。

补码机:正数补码为其原码,负数为其正数原码取反加1。

NEG指令,相当于0-OPR,并影响进位标志CF.

数学意义上相当于:相当于0-OPR

在计算时实际是以补码形式运算,运算时只有0不影响CF,其它情况都影响CF.为什么,请看以下分析:

(1)假设有数:a=3;

那么:NEG a

分析:a补码为0011,0的补码为0000,所以0000-0011最终会向高位借1所以会有CF=1

(2)假设有数:a=-3;

那么:NEG a

分析:a为负数,补码为1101,所以0000-1101=0011即正数3,所以CF=1

NEG+SBB指令

假设有C语言:

  if(foo() != 0)

  {

    return(FALSE);

  }else{

    return(TURE);

  }

也可以是:

  if(foo() != 0) return(FALSE);

  return TURE;

可以这样汇编(用fasm语法):

  call [foo];调用foo(),返回值在eax中

  neg eax;把操作数按位求反后末位加1, 且if(EAX==0){CF=0}else{CF=1}

  sbb eax,eax; eax-eax-cf ==> (eax)

        ;操作结果:如果foo的返回值不是 0,此时 (eax) = -1

        ;    :如果foo的返回值是 0,此时 (eax) = 0

  inc eax  ; 操作结果:如果foo的返回值不是 0,此时 (eax) = 0

        ;    :如果foo的返回值是 0,此时 (eax) = 1

;===============================================================================

; 进一步解释

;===============================================================================

; if (EAX)=0 则:

; NEG EAX ;等价于: 0 - (EAX) = 0 , 结果: (EAX)=0 ,CF=0

; SBB EAX, EAX ; 等价于 (EAX)-(EAX)-(CF) , 结果为: (EAX)=0

; INC EAX ; ,结果 (EAX)=1

;if EAX!=0 (假设 EAX=5) 则:

; NEG EAX 等价于: 0 - 5 = -5 所以: (EAX)= -5 ,但CF=1

; SBB EAX, EAX 等价于 (EAX)-(EAX)-(CF) 即: (EAX)= -1

; INC EAX 结果 (EAX)=0

;-------------------------------------------------------------------------------

; 以下内容来自网络:

;-------------------------------------------------------------------------------

; 问:

; mov eax,ebx //ebx此时为16位的数,只有bx有值

; neg eax

; sbb eax,eax //eax难道不为零吗?如为零,上两句有何用?

; 此时eax到底是什么值?

; 答:

; 这个主要是sbb指令的作用吧。它除了'源操作数'减去'目的操作数 '外,还得减去'进位标记位CF '。所以,

; sbb eax, eax 的结果是看之前的 CF 的状态了, 你这里就是 neg eax 了.

; neg 指令对 CF 的影响: 如果操作数为0, 则 CF=0 ; 否则, CF=1.

; 所以, 这里的 sbb 指令后 eax 中的结果应该是,

; bx = 0, EAX = 0;

; bx <> 0, EAX = -1

;------------------

; NEG、NOT指令简介

;------------------

;格式:NEG OPR ;B/W执行的操作:←求补这条指令的执行影响全部标志位。

;下面就求补操作时对CF和OF两个标志位的影响做一个分析。求补操格式:NEG OPR ;B/W

;执行的操作:←求补

;这条指令的执行影响全部标志位。

;下面就求补操作时对CF和OF两个标志位的影响做一个分析。

;求补操作即是把操作数按位求反后末位加1,即FFFFH-OPR+1=0-OPR。

;也就是说,对一个操作数求补,相当于用0减去此操作数。

;参加求补运算的操作数当然是有符号数。

;对于CF而言,只有对0求补时,CF=0,其余情况都使CF=1。

;0减去负数应该是正数,但当操作数的值是80H或8000H时,求补后其值保持不变,

;仍为负数,固产生溢出,OF=1。;其余情况都使OF=0。

;

;求反指令NOT的操作是对操作数按位求反,即FFFFH-OPR。所以假定要对AX寄存器中的操作

;数进行求补,那么可以;有如下几种方法:

;

;方法1:NEG AX

;

;方法2:NOT AX

; INC AX

;

;方法3:MOV BX,0

; XCHG AX,BX

; SUB AX,BX

;

;注意:由于求补运算的结果应在AX中,所以方法3中要使用交换指令将AX和BX互换