为什么INC和DEC指令*不影响进位标志(CF)?

moh*_*hed 18 x86 assembly flags increment decrement

为什么x86指令INC(递增)和DEC(递减)不影响CFFLAGSREGISTER中的(进位标志)?

Ira*_*ter 29

要理解为什么你可能需要记住当前的"x86"具有32位和64位值的CPU开始使用更多有限的8位机器,回到英特尔8008.(我在1973年的世界编码,我仍然记住(呃)它!).

在那个世界里,登记册很珍贵.您需要INC/ DEC出于各种目的,最常见的是循环控制.许多循环涉及进行"多精度算术"(例如,16位或更多!)通过设置INC/ DEC设置Zero标志(Z),您可以使用它们非常好地控制循环; 通过坚持循环控制指令不改变进位标志(CF),进位在循环迭代中保留,并且您可以实现多精度操作而无需编写大量代码来记住进位状态.

一旦你习惯了丑陋的指令集,这个效果非常好.

在更大的单词大小的现代机器上,你不需要这么多,所以INC并且DEC可以在语义上等同于ADD......,1等.事实上,当我需要进位组时,我使用它: - }

大多数情况下,我远离INCDEC现在,因为他们做的部分条件代码更新,这样就可以在管道中引起滑稽的摊位,和ADD/ SUB没有.因此,无关紧要(大多数地方),我使用ADD/ SUB避免失速.我使用INC/ DEC仅在保持代码较小的情况下,例如,适合高速缓存行,其中一个或两个指令的大小产生足够的差异.这可能是毫无意义的纳米[字面意思!] - 优化,但我在编码习惯上相当老派.

我的解释告诉我们为什么INC/ DEC设置Zero标志(Z).我没有特别引人注目的解释为什么INC/ DEC设置符号(和奇偶标志).

编辑2016年4月:似乎在现代x86上处理失速问题更好.请参阅INC指令与ADD 1:重要吗?

  • 设置SF/OF以及ZF可以让你的'dec/jge`从n向下循环到0,而不是从n向下循环到1.(即当`dec`产生`-1`而不是'0`时会掉头.)这偶尔会有用. (2认同)

Aki*_*nen 5

为什么用inc / dec设置标志时为什么要签名的问题最好用以下问题解决:您宁愿不使用a选项吗?

a) for (n=7;n>=0;n--)   // translates to   `dec + jns`
b) for (n=8;n>0;n--)    // translates to   `dec + jnz`
Run Code Online (Sandbox Code Playgroud)

正如Ira Baxter已经阐明的那样,Carry标志被用于许多算法中-不仅是多精度算法,而且还用于单色/ cga / EGA时代的位图处理:这会将80像素宽的行右移一个像素...

        mov cx, 10
begin:  lodsb
        rcr al,1   // this is rotate though carry:
        stosb      // for the algorithm to work, carry must not be destroyed
        LOOP begin //
Run Code Online (Sandbox Code Playgroud)

但是然后:为什么要平价?

我相信答案就是为什么。该指令集来自70年代末晶体管短缺的时代。拒绝为某些特定指令计算奇偶校验标志没有任何意义,而只是增加了CPU的复杂性。