汇编语言标志寄存器 SF 标志

  计算机中通常用补码来表示有符号数据。计算机中的一个数据可以看作是有符号数,也可以看成是无符号数。比如:
  00000001B,可以看作无符号数 1,或有符号数 +1
  10000001B,可以看作为无符号数 129,也可以看作有符号数 -127
  也就是说,对于同一个二进制数据,计算机可以将它当作无符号数据来运算,也可以当作有符号数据来运算。比如:

  mov al,10000001B
  add al,1

  结果:(al)=10000001B。

  可以将 add 指令进行的运算当作无符号数的运算,那么 add 指令相当于计算 129+1,结果为 130(10000010B);也可以将 add 指令进行的运算当作有符号数的运算,那么 add 指令相当于计算 -127+1,结果为 -126(10000010B)。
  不管我们如何看待,CPU 在执行 add 指令的时候,就已经包含了两种含义,也将得到用同一种信息来记录的两种结果。关键在于我们的程序需要哪一种结果。
  SF 标志,就是 CPU 对有符号数运算结果的一种记录,它记录数据的正负。在我们将数据当作有符号数来运算的时候,可以通过它来得知结果的正负。如果我们将数据当作无符号数来运算,SF 的值则没有意义,虽然相关的指令影响了它的值。
  这也就是说,CPU 在执行 add 等指令的时候,是必然要影响到 SF 标志位的值的。至于我们需不需要这种影响,那就看我们如何看待指令所进行的运算了。
比如:

  mov  al,10000001B
  add  al,1

执行后,结果为10000010B, sf=1,表示:如果指令进行的是有符号数运算,那么结果为负;

  mov  al,10000001B
  add  al,01111111B

执行后,结果为0. s=0,表示:如果指令进行的是有符号数运算,那么结果为非负。
某些指令将影响标志寄存器中的多个标记位,这些被影响的标记位比较全面地记录了指令的执行结果,为相关的处理提供了所需的依据。比如指令sub al,al执行后,ZF, PF,SF等标志位都要受到影响,它们分别为:1, 1, O

511遇见


发布日期:

所属分类: 编程 标签:  


没有相关文章!