3

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

LD   A,1h
ADD  A,99h
DAA

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

4

2 回答 2

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

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

于 2013-10-01T04:02:56.550 回答
0

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

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

x86 CPU 还支持非常接近 Z80 DAA 指令的 DAA 指令,因此如果您在 x86 平台上工作,您可以在仿真中使用它。

于 2013-09-30T17:54:30.820 回答