指令系统对于6个条件状态位的影响


CF:借位

OF:溢出

ZF:相等 /零

SF:符号

AF:辅助进位

PF:偶奇

一.ADD指令

有符号:运算结果超过有符号数范围,比如说:8位系统能够表示的有符号数范围为:
− 2 7 → 2 7 − 1 ( − 128 → 127 ) -2^7\to 2^7-1(-128\to 127) 27271(128127)
如果运算结果超出了该范围,那么OF=1,否则OF=0

无符号:如果两个无符号数字相加超过了最大取值范围,比如说:8位系统能够表示的无符号数字范围:
0 → 2 8 − 1 ( 0 → 255 ) 0\to 2^8-1(0\to 255) 0281(0255)
那么CF=1,否则=0


tips:换句话说,无符号不可能溢出。


二.SUB指令

与ADD指令类似,稍微值得注意的是:无符号的情况是如果被减数小于了减数,那么OF要置位。其他的标志位看根运算结果修改。

三.NEG指令

NEG是求补指令,两种方式:
取 反 后 + 1 取反后+1 +1
另一种为:
2 n − X 2^n-X 2nX
因此,可以看的出来,NEG指令可以看成是用0减去擦偶哦书,那么很明显:

  • X=0时,CF=0;
  • 否则,CF=1;

其他的标志位根据情况置位。

四.INC/DEC指令

**不会影响CF标志位,这是它与add/sub x,1最大的区别。**其他的标志位根据情况置位。

五.逻辑布尔指令

AND/OR/NOT/XOR/TEST

  • NOT指令不修改标志位;
  • 其他的四个指令都会使得:OF=0,CF=0;
  • 辅助标志位无定义;
  • 其他的标志位根据情况置位;

六.逻辑移位指令

对于,算术和逻辑移位、双精度移位:

  • 进位标志位为移入CF的数值;
  • AF无定义;
  • 其他4个标志位根据情况置位;

特别注意,对于**(带进位的)循环移位**:

  • 进位标志位为移入CF的数值;

  • OF的影响:

    1. 移位次数等于1的时候,如果以为前后符号改变,那么OF=1;
    2. 如果移动次数不为1的时候,OF无定义;
  • 不影响/修改:SF、ZF、PF、AF;

七.乘除法影响标志位

MUL/DIV-IMUL/IDIV

DIV/IDIV

执行DIV或IDIV后,所有算术运算状态标志位的值都不确定。

MUL

  • 乘积高位不为0则CF=1,OF=1;
  • PF/ZF/AF/SF无定义;

IMUL

  • 如果乘积的高半部分不是低半部分符号位的扩展,那么进位标志位、溢出标志位置位;

    tips:举个例子,如果低位是1011,那么高位的符号扩展应该为1111 总体为:1111 1011.

  • SF/ZF/AF/PF无定义;

参考文章和书籍:

ecpm-2-106307500-null-null.142v17rank_v33,157v15new_3&utm_term=标志位的影响总结&spm=1018.2226.3001.4187));

  • 书籍:IBM-PC汇编语言程序设计;