【问题标题】:how to set auxiliary flag for 16bits binary addition如何为 16 位二进制加法设置辅助标志
【发布时间】:2016-07-29 07:13:48
【问题描述】:

我知道在执行8位二进制加法时,如果第3位到第4位有进位,则辅助标志设置为1;但是添加 2 个 16 位数字呢?我在网上看不到任何明确的答案。

我正在研究英特尔 8086 微处理器...

例如,当我添加这两个数字时,0x30a2 和 0xf1ac

0011 0000 1010 0010 + 1111 0001 1010 1100

CF=1
ZF=0
PF=1
SF=0
OF=1
AF=? 

我不知道在哪里检查它

【问题讨论】:

  • 哪个cpu?并非所有行为都相同,通常第 3 位到第 4 位进位标志用于 BCD 支持。
  • Th AF 标志仍然仅适用于执行最低半字节(最低 4 位)。在您的示例中,最低的半字节是 0010+1100 。显然第 3 位没有进位,所以 AF =0.
  • 风向标回答说“高或低半字节s到LOW顺序BYTE的16-位值。” .所以被引用的半字节在最低有效字节中。半字节总是 4 位(不是 8 位)。它基本上说,无论您的寄存器有多少位(也适用于 32 位),AF 标志将始终根据低位(最低有效字节)中最低半字节的执行来设置
  • 您真正想要完成的是什么?您是否正在尝试进行 BCD 算术?如果没有,AF 标志就不是很有用。
  • 如果您不再将 bit 3 称为 3rd bit 并将 bit 4 称为第 4 位。唯一好的措辞是:第 3 位是第 4 位第 4 位是第 5 位

标签: assembly binary addition alu carryflag


【解决方案1】:

来自 James W. Coffron 的“8086/8088 编程”:

AF 辅助进位标志。如果设置了此标志,则存在进位 从低半字节到高半字节或从高半字节借用 到低点。高或低半字节是指一个低位字节 16 位值。

在我的日子里,我们会编写一小段代码来观察处理器的行为。您可以通过添加或减去两个 16 位数字来检查它,然后是 pushfpop ax 以随意检查状态标志。

编辑。

(获取标志的另一种方法是使用 LAHF 加载带有标志的 AH 的 5 位,AF 转到第 4 位。)

所以AF 表示从位 3 到位 4 的进位,无论操作数的大小如何。

请注意,没有依赖于AF 的分支指令。 DAA 指令在内部使用它在 ADD 指令之后立即进行小数调整,通常与 AL 一起使用。

【讨论】:

  • 但 Michael Petch 说“AF 标志仍然只适用于执行最低四位(最低 4 位)。在您的示例中,最低四位是 0010+1100 。显然没有执行位 3 所以 AF =0。"
  • @Xsmael 一个半字节是四位。上面的引用说对于 16 位算术,有问题的半字节在低位字节中。因此,在回答您的问题时,16 位操作数与 8 位操作数相同。换句话说,AF 表示从第 3 位到第 4 位的进位(加法),或从第 4 位到第 3 位的借位(减法)。
【解决方案2】:

在 8086 上,adjust flag (bit 4) 在第 3 位到第 4 位进位或从第 4 位到第 3 位借位时设置,这是针对 BCD operation support

8086 上的BCD operations 仅为 8 位,BCD 调整操作仅在 AL 寄存器上运行。

对于 16 位操作,我希望它的行为与 8 位操作相同。

进位标志(位 0)基于操作是 8 位还是 16 位。如果是16位,则结果> 65535时进位​​。如果是8位,则结果> 255时进位。

【讨论】:

  • 调整标志的另一个名称。有时也称为半进位标志。
【解决方案3】:

进位标志的“位置”取决于运算符指令,它始终是最高位

例如add ax,bx :由于操作数是 16 位,进位表示第 16 位相加的进位 即使您添加 ax (值为 3) 和 9 (这些值将被视为 0000000000000011 和 0000000000000101)

【讨论】:

  • 不知道你是否理解我的问题,我说的是辅助标志,不是携带标志
猜你喜欢
  • 1970-01-01
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
  • 2017-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多