对于这个看似小问题的道歉,但我似乎无法在任何地方找到答案 - 我只是想在我的Z80模拟器中实现DAA指令,并且我在Zilog手册中注意到它是为了调整二进制编码的十进制算术的累加器。它表示该指令旨在在加法或减法指令后运行。Z80 DAA指令
我的问题是:
- 如果另一指令运行后会发生什么?
- 它是如何知道前面有什么指令的呢?
- 我意识到有N标志 - 但这肯定不会明确指出前面的指令是加法或减法指令?
- 不管前面的指令如何,它是否只是根据DAA表中列出的条件修改累加器?
对于这个看似小问题的道歉,但我似乎无法在任何地方找到答案 - 我只是想在我的Z80模拟器中实现DAA指令,并且我在Zilog手册中注意到它是为了调整二进制编码的十进制算术的累加器。它表示该指令旨在在加法或减法指令后运行。Z80 DAA指令
我的问题是:
是否只是修改累加器无论如何,根据载于DAA表的条件,不管前面的指令?
是的。该文档仅告诉您DAA旨在用于何种用途。也许你是指表在this link:
--------------------------------------------------------------------------------
| | C Flag | HEX value in | H Flag | HEX value in | Number | C flag|
| Operation | Before | upper digit | Before | lower digit | added | After |
| | DAA | (bit 7-4) | DAA | (bit 3-0) | to byte | DAA |
|------------------------------------------------------------------------------|
| | 0 | 0-9 | 0 | 0-9 | 00 | 0 |
| ADD | 0 | 0-8 | 0 | A-F | 06 | 0 |
| | 0 | 0-9 | 1 | 0-3 | 06 | 0 |
| ADC | 0 | A-F | 0 | 0-9 | 60 | 1 |
| | 0 | 9-F | 0 | A-F | 66 | 1 |
| INC | 0 | A-F | 1 | 0-3 | 66 | 1 |
| | 1 | 0-2 | 0 | 0-9 | 60 | 1 |
| | 1 | 0-2 | 0 | A-F | 66 | 1 |
| | 1 | 0-3 | 1 | 0-3 | 66 | 1 |
|------------------------------------------------------------------------------|
| SUB | 0 | 0-9 | 0 | 0-9 | 00 | 0 |
| SBC | 0 | 0-8 | 1 | 6-F | FA | 0 |
| DEC | 1 | 7-F | 0 | 0-9 | A0 | 1 |
| NEG | 1 | 6-F | 1 | 6-F | 9A | 1 |
|------------------------------------------------------------------------------|
我必须说,我从来没有见过一个dafter指令规范。如果仔细检查表格,您会看到指令的效果仅取决于标志C
和H
以及累加器中的值 - 它不依赖于前一条指令。另外,如果例如C=0
,H=1
和累加器中的低位数字是4或5,它不会泄露发生的情况。因此,在这种情况下您将必须执行NOP
,或者生成错误消息或其他内容。
只是想补充一点,N标记是他们谈论前面的操作时的意思。加法设置N = 0,减法设置N = 1。因此A寄存器的内容和C,H和N标志确定结果。
该指令旨在支持BCD算术,但有其他用途。考虑下面的代码:
and 15
add a,90h
daa
adc a,40h
daa
它结束转换寄存器的低4位为ASCII值 '0', '1',... '9', 'A', 'B',.. 。, 'F'。换句话说,一个二进制到十六进制的转换器。
我发现这个指令相当混乱,但我发现它的行为描述从z80-heaven是最有帮助的。
当执行此指令时,A寄存器使用标志的内容进行BCD校正。确切的过程如下:如果A的最低有效四位包含一个非BCD数字(即它大于9)或H标志置位,则$ 06被添加到寄存器。然后检查四个最重要的位。如果这个更重要的数字也恰好大于9或设置了C标志,则增加60美元。
这提供用于指令一个简单的模式:
此外,尽管DAA是旨在的加减运算后运行,它可以在任何时候运行。
它看起来像缺少最后四个操作(SUB,SBC,NEG和DEC)。 – Salgat
@Salgat当'N = 1'时,同样的规则适用。唯一的是你必须在'N = 1'时减去修正值。 – GabrielOshiro
非常感谢 - 我希望找到像这样的更多含糊不清的指令:-) – PhilPotter1987
Z80的DAA应该与x86的DAA和DAS相同,因为它们具有相同的目的。查看两者的x86描述。许多CPU都可以使用某种DAA。 –
@Alex:x86芯片有两个十进制调整指令:DAA(加法后的十进制调整)和DAS(减法后的十进制调整)。 Z80 DAA指令将它们组合为一个,假定最新的加/减操作数是有效的BCD数字。 – TonyK