2013-09-30 53 views
3

我正在写一个Z80模拟器,并试图了解小数调整指令对某些操作数所做的操作。 这些操作码在真实Z80上的结果是什么(在寄存器A & F中)?Z80溢出与DAA

LD A,1h 
ADD A,99h 
DAA 

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

+4

由于怀旧原因,请参阅http://www.worldofspectrum.org/faq/reference/z80reference.htm#DAA – Michael

+0

+1。不知道答案,但检查这个问题的答案:http://stackoverflow.com/questions/8119577/z80-daa-instruction?rq=1 – 2013-09-30 17:22:02

+0

@Michael伟大的链接谢谢。 –

回答

1

后:

LD A, 1h 
ADD A, 99h 

A应该包含9AH。进位,半进位和溢出应全部重置,因为没有进位从第3位到第4位或从第7位进位,并且在带符号的解释中,您给负数增加了一个正数,因此无法溢出。

然后当您执行​​时,处理器会发现低半字节的值大于0x9。因此它会决定它将添加0x6来创建一个低位数的合适的十进制数。

鉴于它将向低半字节添加0x9,它会检查它是否会期望高半字节创建十进制进位。测试是高半字节是否大于0x8。它是。所以DAA也会决定把0x6加到高位。

因此,在总体DAA将决定添加0x66。

(0x9a + 0x66) MOD 0x100 = 0x00 

因此,在A中留下的结果将是0x00。

DAA决定将0x6添加到最高半字节。所以携带现在将被设置。

DAA还决定将0x6添加到底部半字节。所以半场进行也将被设定。

符号,零等将根据0x00结果设置。

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

+0

感谢您的详细解答。你是对的,问题是我的代码检查每个半字节(以正确的顺序),并根据半字节和标志添加6h,60h或66h。我想我需要把它分成6小时和60小时。 –

0

只有在ADD指令后,在A寄存器中留下两个BCD数字字节后才执行DAA。

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

x86 CPU也支持非常接近Z80 DAA指令的DAA指令,因此如果您正在进行仿真,则可以在仿真中使用它x86平台。