assembly - Z80 溢出 DAA

标签 assembly emulation z80

我正在编写一个 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/

相关文章:

assembly - 当被减数为零时,为什么在减法过程中设置进位标志?

java - 在模拟器上运行的新 GCM 实现有问题

testing - 如何在没有 wlan 的情况下免费测试手机上的网络应用程序?

android - 在模拟器中实现应用内结算

emulation - GBZ80 - ADC 指令失败测试

C 代码表示为汇编代码 - 如何解释?

assembly - Rust 组件 : how do I indicate that I need the value of the SP?

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

linux - at&t汇编中的 'push'和 'pushq'有什么区别

assembly - 在 ti 84+ 上的 ti 基本程序中使用十六进制代码