我正在编写一个 Z80 仿真器,但一直试图理解小数调整指令对某些操作数的作用。 这些操作码在真实 Z80 上的结果(在寄存器 A 和 F 中)是什么?
LD A,1h
ADD A,99h
DAA
我的代码当前以 A 寄存器中的 0xA0 和半进位和溢出位设置结束。但它应该返回 0 吗?
最佳答案
之后:
LD A, 1h
ADD A, 99h
A
应包含 9Ah。进位、半进位和溢出都应重置,因为从第 3 位到第 4 位或从第 7 位开始没有进位,并且在带符号的解释中,您将正数添加到负数,因此不可能发生溢出。
当您随后执行 DAA
时,处理器将发现低半字节的值大于 0x9。因此,它将决定添加 0x6 以从低位创建合适的十进制进位。
鉴于它要将 0x9 添加到低半字节,它将检查它是否会期望高半字节创建十进制进位。测试高四位字节是否大于0x8。这是。因此 DAA 也会决定将 0x6 添加到高半字节。
因此总体而言,DAA 将决定添加 0x66。
(0x9a + 0x66) MOD 0x100 = 0x00
因此 A
中的结果将为 0x00。
DAA 决定将 0x6 添加到顶部半字节。所以进位现在将被设置。
DAA 还决定将 0x6 添加到底部半字节。所以半进位也将被设置。
符号、零等将根据 0x00 结果设置。
如果我不得不猜测的话,看起来您的代码发现低半字节不正确并计划创建半进位。但是它随后无法检查顶部半字节是否会因此变得不正确(即它是否为 0x8 或更大),并且也没有计划创建顶部半字节进位。
关于assembly - Z80 溢出 DAA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19099892/