对这个看似微不足道的问题表示歉意,但我似乎找不到答案--我只是想在我的Z80模拟器中实现DAA指令,我在Zilog手册中注意到,它是为了调整二进制编码算术的累加器。它说指令打算在加法或减法指令之后立即运行。
我的问题是:
发布于 2011-11-14 09:55:14
它是否只是根据DAA表中规定的条件修改累加器,而不管前面的指令是什么?
是。文档只告诉您DAA打算用于什么。也许您指的是此链接的表
--------------------------------------------------------------------------------
| | 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 |
|------------------------------------------------------------------------------|我必须说,我从来没有见过指令规范。如果仔细检查表,您将看到指令的效果仅取决于C和H标志以及累加器中的值--它根本不依赖于前面的指令。另外,如果C=0、H=1和累加器中的下位数为4或5,则不会透露会发生什么情况。因此,在这种情况下,您必须执行NOP,或者生成错误消息或其他内容。
发布于 2012-01-13 09:03:42
只是想补充一下,当他们谈论上一次操作时,N标志是什么意思。加法集N= 0,减法集N= 1。因此A寄存器和C、H和N标志的内容决定结果。
该指令旨在支持BCD算法,但还有其他用途。请考虑以下代码:
and 15
add a,90h
daa
adc a,40h
daa它将A寄存器的下4位转换为ASCII值'0‘、'1’、…'9‘、'A’、'B‘、……、'F’。换句话说,二进制到十六进制转换器。
发布于 2015-05-01 15:39:50
我也觉得这条指令相当令人困惑,但是我发现Z80-天堂对它的行为的描述是非常有用的。
执行此指令时,使用标志的内容校正A寄存器。确切的过程如下:如果A的最不重要的四位包含一个非BCD数字(即它大于9)或者设置了H标志,那么$06将被添加到寄存器中。然后检查四个最重要的位。如果这个更重要的数字也恰好大于9或设置了C标志,则添加$60。
这为指令提供了一个简单的模式:
另外,虽然DAA打算在加法或减法之后运行,但它可以在任何时候运行。
https://stackoverflow.com/questions/8119577
复制相似问题