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