DAA指令中的半进位/半借位标志

5

很抱歉让这成为我第二个关于Z80 DAA的问题 - 我几乎已经实现了这个指令,但有一件事我不确定 - 这个指令是否设置H标志? Z80手册说“请参见指令”,但它只在DAA之前提到该标志,而不是在执行后。

我按以下方式设置标志:

如果结果为负数,则设置S(0x80和结果等于0x80) 如果结果为零,则设置Z H(不确定因此出现这个问题) 将P / V设置为结果的奇偶校验(如果为偶数,则为1;如果为奇数,则为0) 保持N不变 如果原始累加器值的高四位被修改,则设置C

除此之外,该指令似乎表现如我所预期的那样 :-) 希望有人能为我澄清这一点,非常感谢。

2个回答

3

我只能在这里找到这里,半进位/借位标志由DAA修改。

我建议这个标志应该像x86 CPU上的DAA和DAS指令设置AF(辅助进位)标志一样设置。我看不出为什么i8080/i8085/Z80和i8086的DAA/DAS之间应该有任何操作上的区别。

x86 DAA/DAS如果通过6来调整累加器的最低4位,则将AF设置为1。如果它没有调整它们,则将AF重置为0。

请参阅英特尔(或AMD)x86 CPU手册中DAA和DAS的伪代码。


1
正如您所知,Z80 CPU 没有 DAS 指令。Z80 的 DAA 指令将 i8086 的 DAA 和 DAS 指令合并为一个指令,这意味着它在某些方面与 i8086 的 DAA 不同。 - Emir Akaydın
1
你说过:“我看不出为什么i8080/i8085/Z80和i8086的DAA/DAS操作之间应该有任何差异。”我的评论是针对这句话的。检查x86的等效指令对于解释Z80的H标志的奇怪行为并没有帮助。 - Emir Akaydın
这似乎是合乎逻辑的行为,尽管在Z80手册中没有提到 - 这让我有点困扰 :-( - PhilPotter1987
@EmirAkaydın:这种差异被认为是已经理解的。 - Alexey Frunze
@PhilPotter1987:无论是Z80还是x86文档都没有提到在DAA/DAS执行后,H/AF有任何有意义的用途,并且它们也没有提供这样的用例。我认为,在DAA/DAS之后,很少有人会发现H/AF有用处。也许没有人会这么认为。如果你想确定,可以查看其他Z80和兼容CPU(如i8080和i8085)的文档。也许它们能更好地解释DAA。或者...找一个拥有Z80计算机(例如ZX Spectrum)的人,并请他们运行一个DAA测试。 - Alexey Frunze

2

这是一个很好的问题。是的,因为H标志位与DAA指令不符合标准,所以它的行为没有明确的文档说明。

如果A寄存器的低四位(最后四位)不是10进制数(如A、B、C、D、E或F),或者已经设置了H标志,则会向该寄存器添加6。这意味着即使低四位在0-9范围内,您也可以通过设置H标志来强制将6添加到A寄存器中。

就你的问题而言,根据我的经验,H标志通常保持不变,但您不能依赖它,因为“影响是非标准的”,这意味着H标志可能会根据情况而改变或不变。在这种情况下,即使您在测试中看到H标志未受影响,也应始终认为其受到执行后的DAA指令的影响。


谢谢 - 我明白了低位计算使用H标志的原因,只是不确定之后会发生什么 - 我认为如果修改了高位,则设置C标志,如果修改了低位,则可能设置H标志 - 这与其他Z80数学指令的行为保持一致,尽管手册根本没有说明这一点,所以我不会假设它。 - PhilPotter1987

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接