【问题标题】:Z80 Overflow in with DAAZ80 使用 DAA 溢出
【发布时间】:2013-09-30 17:07:25
【问题描述】:

我正在编写一个 Z80 仿真器,并且一直试图理解十进制调整指令对某些操作数的作用。 这些操作码在真正的 Z80 上的结果(在寄存器 A 和 F 中)是什么?

LD   A,1h
ADD  A,99h
DAA

我的代码目前在 A 寄存器中以 0xA0 完成,并且设置了半进位和溢出位。但它应该返回 0 吗?

【问题讨论】:

标签: assembly emulation z80


【解决方案1】:

之后:

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 结果设置。

如果我不得不猜测,您的代码似乎发现低半字节不正确并计划创建半进位。但是它无法检查是否会因此导致最高 nibble 不正确(即,它是否为 0x8 或更大),并且也无法计划创建最高 nibble 进位。

【讨论】:

  • 感谢您非常详细的回答。你是对的,问题是我的代码检查每个半字节(以正确的顺序)并根据半字节和标志添加 6h、60h 或 66h。我想我需要把它分成加 6h 和 60h。
【解决方案2】:

仅在 A 寄存器中留下两个 BCD 位字节结果的 ADD 指令后执行 DAA。

ADD 操作符应由两个压缩的 BCD 数字组成。 DAA 指令调整 A 寄存器以包含正确的两位压缩十进制结果,溢出、进位和零标志也受到影响。 如果结果(DAA 执行后)大于 99,则在 DAA 后设置进位标志。

x86 CPU 也支持 DAA 指令,非常接近 Z80 DAA 指令,所以如果你在 x86 平台上工作,你可以在仿真中使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 2016-11-22
    • 1970-01-01
    相关资源
    最近更新 更多