首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Z80 DAA指令

Z80 DAA指令
EN

Stack Overflow用户
提问于 2011-11-14 09:34:34
回答 4查看 9.8K关注 0票数 21

对这个看似微不足道的问题表示歉意,但我似乎找不到答案--我只是想在我的Z80模拟器中实现DAA指令,我在Zilog手册中注意到,它是为了调整二进制编码算术的累加器。它说指令打算在加法或减法指令之后立即运行。

我的问题是:

  • 如果在另一条指令之后运行,会发生什么情况?
  • 它怎么知道是什么指令超过了它?
  • 我意识到有N标志--但这肯定不能明确地表明以前的指令是加或减指令?
  • 它是否只是根据DAA表中规定的条件修改累加器,而不管前面的指令是什么?
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-11-14 09:55:14

它是否只是根据DAA表中规定的条件修改累加器,而不管前面的指令是什么?

是。文档只告诉您DAA打算用于什么。也许您指的是此链接的表

代码语言:javascript
复制
--------------------------------------------------------------------------------
|           | 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   |
|------------------------------------------------------------------------------|

我必须说,我从来没有见过指令规范。如果仔细检查表,您将看到指令的效果仅取决于CH标志以及累加器中的值--它根本不依赖于前面的指令。另外,如果C=0H=1和累加器中的下位数为4或5,则不会透露会发生什么情况。因此,在这种情况下,您必须执行NOP,或者生成错误消息或其他内容。

票数 17
EN

Stack Overflow用户

发布于 2012-01-13 09:03:42

只是想补充一下,当他们谈论上一次操作时,N标志是什么意思。加法集N= 0,减法集N= 1。因此A寄存器和C、H和N标志的内容决定结果。

该指令旨在支持BCD算法,但还有其他用途。请考虑以下代码:

代码语言:javascript
复制
    and  15
    add  a,90h
    daa
    adc  a,40h
    daa

它将A寄存器的下4位转换为ASCII值'0‘、'1’、…'9‘、'A’、'B‘、……、'F’。换句话说,二进制到十六进制转换器。

票数 10
EN

Stack Overflow用户

发布于 2015-05-01 15:39:50

我也觉得这条指令相当令人困惑,但是我发现Z80-天堂对它的行为的描述是非常有用的。

执行此指令时,使用标志的内容校正A寄存器。确切的过程如下:如果A的最不重要的四位包含一个非BCD数字(即它大于9)或者设置了H标志,那么$06将被添加到寄存器中。然后检查四个最重要的位。如果这个更重要的数字也恰好大于9或设置了C标志,则添加$60。

这为指令提供了一个简单的模式:

  • 如果较低的4位构成大于9或H的数字,则将$06添加到累加器
  • 如果上4位构成大于9或C的数字,则将$60添加到累加器

另外,虽然DAA打算在加法或减法之后运行,但它可以在任何时候运行。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8119577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档