我正在编写一个Z80仿真器,试图理解十进制调整指令对某些操作数的作用。这些操作码在真实Z80上的结果(在寄存器A&F中)是什么?
LD A,1h
ADD A,99h
DAA我的代码目前在A寄存器中用0xA0完成,并且设置了一半的进位和溢出位。但是它应该返回0吗?
发布于 2013-10-01 04:02:56
之后:
LD A, 1h
ADD A, 99hA应该包含9Ah。进位、半进位和溢出应全部重置,因为从第3位到第4位或从第7位到第7位没有进位,而且在签名的解释中,您在否定的情况下添加了一个正数,所以溢出是不可能的。
然后,当您执行DAA时,处理器会发现低咬口的值大于0x9。因此,它将决定要添加0x6,以便从低位数创建一个合适的十进制进位。
考虑到它将将0x9添加到低咬口,它将检查是否会期望高咬口创建十进制进位。测试是高咬口是否大于0x8。它是。因此DAA也将决定将0x6添加到高咬口。
因此,DAA将决定添加0x66。
(0x9a + 0x66) MOD 0x100 = 0x00因此,A中留下的结果将是0x00。
DAA决定将0x6添加到最上面的咬口。因此,现在将设置进位。
DAA还决定将0x6添加到底部小口。所以一半的进位也会被设定。
符号、零等将根据0x00的结果进行设置。
如果我不得不猜测的话,你的代码似乎发现低咬口是不正确的,并计划创建一半的进位。但是,它没有检查顶部的咬口是否会因此变得不正确(例如,它是否是0x8或更高的),并且也没有计划创建一个顶咬带。
发布于 2013-09-30 17:54:30
只在添加指令后执行DAA,该指令在A寄存器中留下两个BCD数字字节结果。
添加操作符应该由两个打包的BCD数字组成。DAA指令调整寄存器以包含正确的两位数打包的十进制结果,溢出、进位和零标志也会受到影响。如果结果( DAA执行后)大于99,则在DAA之后设置进位标志。
x86 CPU还支持与Z80 DAA指令非常接近的DAA指令,所以如果您在x86平台上工作,您可以在仿真时使用它。
https://stackoverflow.com/questions/19099892
复制相似问题