You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何8086汇编中相同算术运算用SUB和ADD会设置不同标志位?

为什么8086中SUB指令和等价的ADD指令标志位不同?

核心原因很明确:数学上等价的减法操作,用SUB直接执行和用ADD加负数实现时,CF(进位/借位)与AF(辅助进位/借位)的定义逻辑因指令类型不同而存在差异,以下逐一拆解:

1. CF标志的差异

CF的含义在SUB和ADD中完全不同:

  • SUB指令的CF:代表无符号数运算的借位。当被减数的无符号值小于减数时,CF=1;否则CF=0。
    你的例子里,SUB al,15中al初始为F0H(无符号值240),减数15是0FH(无符号值15)。240-15=225,无借位,因此CF=0。
  • ADD指令的CF:代表无符号数运算的进位。当两个无符号数相加结果超过寄存器位数(8位即255)时,CF=1。
    你的例子里,ADD al,-15中al是F0H(240),-15的补码是F1H(无符号值241)。240+241=481,超过8位无符号数上限255,产生进位到第9位,因此CF=1。

2. AF标志的差异

AF针对低4位(半字节)的操作,同样因指令类型定义不同:

  • SUB指令的AF:代表低4位的借位。若低4位的被减数小于减数,需要向高4位借位,AF=1。
    例子中F0H - 0FH的低4位是0 - 0F,必须借位,因此AF=1。
  • ADD指令的AF:代表低4位的进位。若低4位相加结果超过15(0FH),向高4位进位,AF=1。
    例子中F0H + F1H的低4位是0 + 1 = 1,无进位,因此AF=0。

3. 其他标志位一致的原因

SF、PF、OF这三个标志只和最终运算结果的属性相关,与指令类型无关:

  • SF=1:结果E1H的最高位为1,对应有符号数的负数,因此SF置1。
  • PF=1:E1H的二进制为11100001,其中1的个数是4(偶数),因此PF置1。
  • OF=0:运算结果-31在8位有符号数的范围(-128~127)内,无溢出,因此OF置0。

内容的提问来源于stack exchange,提问作者blake

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 20:27:31