Ira*_*ter 29
要理解为什么你可能需要记住当前的"x86"具有32位和64位值的CPU开始使用更多有限的8位机器,回到英特尔8008.(我在1973年的世界编码,我仍然记住(呃)它!).
在那个世界里,登记册很珍贵.您需要INC
/ DEC
出于各种目的,最常见的是循环控制.许多循环涉及进行"多精度算术"(例如,16位或更多!)通过设置INC
/ DEC
设置Zero标志(Z
),您可以使用它们非常好地控制循环; 通过坚持循环控制指令不改变进位标志(CF
),进位在循环迭代中保留,并且您可以实现多精度操作而无需编写大量代码来记住进位状态.
一旦你习惯了丑陋的指令集,这个效果非常好.
在更大的单词大小的现代机器上,你不需要这么多,所以INC
并且DEC
可以在语义上等同于ADD
......,1等.事实上,当我需要进位组时,我使用它: - }
大多数情况下,我远离INC
而DEC
现在,因为他们做的部分条件代码更新,这样就可以在管道中引起滑稽的摊位,和ADD
/ SUB
没有.因此,无关紧要(大多数地方),我使用ADD
/ SUB
避免失速.我使用INC
/ DEC
仅在保持代码较小的情况下,例如,适合高速缓存行,其中一个或两个指令的大小产生足够的差异.这可能是毫无意义的纳米[字面意思!] - 优化,但我在编码习惯上相当老派.
我的解释告诉我们为什么INC
/ DEC
设置Zero标志(Z
).我没有特别引人注目的解释为什么INC
/ DEC
设置符号(和奇偶标志).
编辑2016年4月:似乎在现代x86上处理失速问题更好.请参阅INC指令与ADD 1:重要吗?
为什么用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的复杂性。