我正在编写一个Z80仿真器,并且试图理解十进制调整指令对某些操作数的作用。 在真正的Z80上,这些操作码的结果是什么(在寄存器A和F中)?
LD A,1h
ADD A,99h
DAA
我的代码当前在A寄存器中以0xA0结束,并设置了半个进位和溢出位。但它应该返回0吗?
答案 0 :(得分: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或更高),并且未能计划创建一个顶部半字节进位。
答案 1 :(得分:0)
仅在ADD指令之后执行DAA,该指令在A寄存器中留下两个BCD数字字节。
ADD操作数应包含两个打包的BCD数字。 DAA指令调整A寄存器以包含正确的两位压缩十进制结果,溢出,进位和零标志也会受到影响。 如果结果(DAA执行后)大于99,则在DAA之后设置进位标志。
x86 CPU还支持DAA指令,它非常接近Z80 DAA指令,因此如果您在x86平台上工作,可以在仿真时使用它。